守住心底那最美风景,成为一种风度,宁静而致远;守住记忆里最美风景,成为一种境界,悠然而豁达;守住生命中最美风景,成为一种睿智,淡定而从容。

WebView是移动端用来加载网页的控件,而应用要想直接与加载好的网页进行交互,可以通过js也就是JavaScript脚本来完成,所谓交互是指网页可以调用应用内方法(Java方法),应用也可以添加或调用网页相应内容。那么具体该如何实现呢?
要想让WebView支持JavaScript,要添加以下属性:
//设置WebView支持JavaScript
WebSettings webSettings = webView.getSettings();
webSettings.setJavaScriptEnabled(true);
首先看看交互的网页tel.html,代码如下:
<!DOCTYPE html>
<html>
<head>
<meta http-equiv="content-type" content="text/html;charset=utf-8">
<meta name="theme-color" content="#2932e1">
<title>爱书客</title>
<style type="text/css">
#hideElem {
position: absolute;
top: 25%;
left: 50%;
}
#telElem {
position: absolute;
top: 30%;
left: 50%;
cursor: pointer;
text-decoration: none;
}
#mobileElem {
position: absolute;
top: 35%;
left: 50%;
cursor: pointer;
text-decoration: none;
}
</style>
</head>
<body>
<span id="hideElem">隐藏内容</span>
<a id="telElem" href="tel:10086" title="拨号10086">10086</a>
<a id="mobileElem" href="javascript:;" onclick="mobile()">移动端调用</a>
</body>
<script>
// 获取电话号码
function getTel() {
return document.getElementById('telElem').innerHTML;
};
// 移动设备调用
function mobile() {
var tel = document.getElementById('telElem').innerHTML;
// 调用android本地方法
window.jsObj.clickOnAndroid(tel);
};
</script>
</html>

网页部分我写了三个标签,id分别是为hideElem,telElem,mobileElem。通过操作hideElem实现应用向网页添加JavaScript功能,通过操作telElem实现应用调用网页JavaScript功能,通过操作mobileElem实现网页调用应用Java方法。
这里为了演示,将以上网页引入本地文件assets,通过操作本地网页来说明WebView是如何通过JavaScript实现交互。
WebView.loadUrl("file:///android_asset/tel.html");
注意1:本地文件放在assets文件中,assets文件是main的子文件,与res文件同级。
注意2:设置WebView支持加载本地文件。
WebSettings webSettings = webView.getSettings();
// 允许加载Assets和resources文件
webSettings.setAllowFileAccess(true);
这里不再对WebView的基础使用进行介绍,有兴趣可以去看这篇文章【Android】移动端WebView的使用(一)初体验了解更多。
功能要求:当网页加载完成后,应用通过向网页添加JavaScript实现id为hideElem的标签隐藏。
通过实现WebView的WebViewClient属性,可以实现网页加载完成后进行相应的逻辑操作。
webView.setWebViewClient(new WebViewClient() {
// 页面加载结束
@Override
public void onPageFinished(WebView view, String url) {
super.onPageFinished(view, url);
// 编写javaScript方法-执行修改样式
String javascript = "javascript:function hide() {" +
"document.getElementById('hideElem').style.display='none';" +
"}";
// 网页添加方法
view.loadUrl(javascript);
// 执行方法
view.loadUrl("javascript:hide();");
}
});
其实添加JavaScript只需要三步:
1、编写JavaScript,注意js语法规则即可。
String javascript = "javascript:function hide() {" +
"document.getElementById('hideElem').style.display='none';" +
"}";
2、网页添加JavaScript,通过loadUrl(js)方法进行添加。
view.loadUrl(javascript);
3、执行JavaScript,通过javascript:方法。
view.loadUrl("javascript:hide();");
功能要求:调用网页中getTel()方法,实现拨号功能。
分析:网页中getTel()方法,返回要拨打的电话号码,那么只要执行getTel()并获取该方法的返回值,之后跳转到拨号页面即可。
那么该如何获取网页中JavaScript方法的返回值呢?
方式一:在Android SDK4.4以上版本提供evaluateJavascript()方法来获取返回值。
webView.setWebViewClient(new WebViewClient() {
// 页面加载结束
@Override
public void onPageFinished(WebView view, String url) {
super.onPageFinished(view, url);
// 支持4.4以上的版本
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
view.evaluateJavascript("javascript:getTel()", new ValueCallback<String>() {
@Override
public void onReceiveValue(String value) {
Log.d("JsonResult", value);
// 实现拨号功能
}
});
}
}
});
但是该方法只支持4.4以上版本,那个该如何解决低版本的问题呢?
方式二:WebView同时提供onJsAlert方法来监听网页中的alert方法,可以利用这一点来实现。
首先向网页中添加JavaScript脚本方法,让该方法能够实现alert(getTel())。
webView.setWebViewClient(new WebViewClient() {
// 页面加载结束
@Override
public void onPageFinished(WebView view, String url) {
super.onPageFinished(view, url);
// 编写javaScript方法-执行网页js
String script = "javascript:function addMethod() {" +
"document.getElementById('telElem').setAttribute('href','javascript:;');" +
// "document.getElementById('customerTel').href='javascript:;';" +
"document.getElementById('telElem').onclick = function() {alert(getTel());}" +
"}";
view.loadUrl(script);
view.loadUrl("javascript:addMethod();");
}
});
最后通过监听alert方法来获取电话号码,并实现拨号功能。
webView.setWebChromeClient(new WebChromeClient() {
// 监听网页alert方法
@Override
public boolean onJsAlert(WebView view, String url, String message, JsResult result) {
result.confirm();
// 执行拨号
Intent intent = new Intent(Intent.ACTION_DIAL, Uri.parse("tel:" + message));
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
startActivity(intent);
return true;
}
});
功能要求:网页通过调用应用中的Java方法,将需要拨号的电话号码传递过来,之后由应用实现拨号。
实现网页调用Java方法其实很简单,只需要三步即可。
1、WebView添加addJavascriptInterface。
webView.addJavascriptInterface(new Object() {
@JavascriptInterface
public void clickOnAndroid(String result) {
Toast.makeText(WebViewActivity.this, result, Toast.LENGTH_LONG).show();
// 执行相应的逻辑操作-拨号
}
}, "jsObj");
2、网页中添加JavaScript方法进行调用。
// 移动设备调用
function mobile() {
var tel = document.getElementById('telElem').innerHTML;
// 调用android本地方法
window.jsObj.clickOnAndroid(tel);
};
3、执行JavaScript方法。
<a id="mobileElem" href="javascript:;" onclick="mobile()">移动端调用</a>
注意:
A、WebView添加JavaScriptInterface的时候要设置名称,在本例中为“jsObj”。
B、在JavaScriptInterface调用方法中添加@JavascriptInterface才能生效。
C、网页中是通过window.jsObj.方法,来实现调用的。
通常为了解决WebView与JavaScript混淆问题,需要将JavaScriptInterface封装。以上代码可以修改成:
public class JavaScriptMixUpEvent {
private Context context;
public JavaScriptMixUpEvent(Context context) {
this.context = context;
}
@JavascriptInterface
public void clickOnAndroid(String result) {
Toast.makeText(context, result, Toast.LENGTH_LONG).show();
// 执行相应的逻辑操作
}
}
webView.addJavascriptInterface(new JavaScriptMixUpEvent(this), "jsObj");
微信公众号:伴职创作
这可能是个愚蠢的问题。但是,我是一个新手......你怎么能在交互式rubyshell中有多行代码?好像你只能有一条长线。按回车键运行代码。无论如何我可以在不运行代码的情况下跳到下一行吗?再次抱歉,如果这是一个愚蠢的问题。谢谢。 最佳答案 这是一个例子:2.1.2:053>a=1=>12.1.2:054>b=2=>22.1.2:055>a+b=>32.1.2:056>ifa>b#Thecode‘if..."startsthedefinitionoftheconditionalstatement.2.1.2:057?>puts"f
最近因为项目需要,需要将Android手机系统自带的某个系统软件反编译并更改里面某个资源,并重新打包,签名生成新的自定义的apk,下面我来介绍一下我的实现过程。APK修改,分为以下几步:反编译解包,修改,重打包,修改签名等步骤。安卓apk修改准备工作1.系统配置好JavaJDK环境变量2.需要root权限的手机(针对系统自带apk,其他软件免root)3.Auto-Sign签名工具4.apktool工具安卓apk修改开始反编译本文拿Android系统里面的Settings.apk做demo,具体如何将apk获取出来在此就不过多介绍了,直接进入主题:按键win+R输入cmd,打开命令窗口,并将路
我遇到了一个非常奇怪的问题,我很难解决。在我看来,我有一个与data-remote="true"和data-method="delete"的链接。当我单击该链接时,我可以看到对我的Rails服务器的DELETE请求。返回的JS代码会更改此链接的属性,其中包括href和data-method。再次单击此链接后,我的服务器收到了对新href的请求,但使用的是旧的data-method,即使我已将其从DELETE到POST(它仍然发送一个DELETE请求)。但是,如果我刷新页面,HTML与"new"HTML相同(随返回的JS发生变化),但它实际上发送了正确的请求类型。这就是这个问题令我困惑的
我有这个:AccountSummary我想单击该链接,但在使用link_to时出现错误。我试过:bot.click(page.link_with(:href=>/menu_home/))bot.click(page.link_with(:class=>'top_level_active'))bot.click(page.link_with(:href=>/AccountSummary/))我得到的错误是:NoMethodError:nil:NilClass的未定义方法“[]” 最佳答案 那是一个javascript链接。Mechan
我看到有关未找到文件min.map的错误消息:GETjQuery'sjquery-1.10.2.min.mapistriggeringa404(NotFound)截图这是从哪里来的? 最佳答案 如果ChromeDevTools报告.map文件的404(可能是jquery-1.10.2.min.map、jquery.min.map或jquery-2.0.3.min.map,但任何事情都可能发生)首先要知道的是,这仅在使用DevTools时才会请求。您的用户不会遇到此404。现在您可以修复此问题或禁用sourcemap功能。修复:获取文
我有一个用Rails3编写的站点。我的帖子模型有一个名为“内容”的文本列。在帖子面板中,html表单使用tinymce将“content”列设置为textarea字段。在首页,因为使用了tinymce,post.html.erb的代码需要用这样的原始方法来实现。.好的,现在如果我关闭浏览器javascript,这个文本区域可以在没有tinymce的情况下输入,也许用户会输入任何xss,比如alert('xss');.我的前台会显示那个警告框。我尝试sanitize(@post.content)在posts_controller中,但sanitize方法将相互过滤tinymce样式。例如
出于某种原因,我必须为Firefox禁用javascript(手动,我们按照提到的步骤执行http://support.mozilla.org/en-US/kb/javascript-settings-for-interactive-web-pages#w_enabling-and-disabling-javascript)。使用Ruby的SeleniumWebDriver如何实现这一点? 最佳答案 是的,这是可能的。而是另一种方式。您首先需要查看链接Selenium::WebDriver::Firefox::Profile#[]=
我是Ruby和Watir-Webdriver的新手。我有一套用VBScript编写的站点自动化程序,我想将其转换为Ruby/Watir,因为我现在必须支持Firefox。我发现我真的很喜欢Ruby,而且我正在研究Watir,但我已经花了一周时间试图让Webdriver显示我的登录屏幕。该站点以带有“我同意”区域的“警告屏幕”开头。用户点击我同意并显示登录屏幕。我需要单击该区域以显示登录屏幕(这是同一页面,实际上是一个表单,只是隐藏了)。我整天都在用VBScript这样做:objExplorer.Document.GetElementsByTagName("area")(0).click
🎉精彩专栏推荐💭文末获取联系✍️作者简介:一个热爱把逻辑思维转变为代码的技术博主💂作者主页:【主页——🚀获取更多优质源码】🎓web前端期末大作业:【📚毕设项目精品实战案例(1000套)】🧡程序员有趣的告白方式:【💌HTML七夕情人节表白网页制作(110套)】🌎超炫酷的Echarts大屏可视化源码:【🔰Echarts大屏展示大数据平台可视化(150套)】🔖HTML+CSS+JS实例代码:【🗂️5000套HTML+CSS+JS实例代码(炫酷代码)继续更新中…】🎁免费且实用的WEB前端学习指南:【📂web前端零基础到高级学习视频教程120G干货分享】🥇关于作者:💬历任研发工程师,技术组长,教学总监;
我有一个Rails应用程序。还有一个javascript(javascript1.js)文件必须包含在每个View的最底部。我把它放在/assets/javascripts文件夹中。Application.js包含以下代码//=requirejquery//=requirejquery_ujs//=someotherfiles//=require_directory.即使Application.js中不包含javascript1.js,它也会自动包含,不是吗?那么我怎样才能做我想做的事呢? 最佳答案 单独定义、包含和执行您的java