android webview js 失效,Android WebView注入JQuery、JS脚本及执行无效的问题解决
在项目中遇到JQuery注入后,执行无效的问题。
我们知道必须在网页加载完成后,也就是在onPageFinished()方法被调用后才能执行被注入的JS。
但是在有些手机上并不能成功执行,我的解决方案是设置一秒延迟后注入JS,成功了!why,i dont know...
WebView注入JS的封装
JSUtil.java
import android.app.Activity;
import android.webkit.ValueCallback;
import android.webkit.WebView;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.InputStream;
public class JSUtil {
public static JSUtil instance;
private WebView webview;
private String juqueryContent;
public static JSUtil getInstance(WebView webView) {
if (instance == null) {
instance = new JSUtil(webView);
} else {
instance.webview = webView;
}
return instance;
}
private JSUtil(WebView webView) {
webview = webView;
try {
InputStream in = webView.getContext().getAssets().open("jquery.min.js");
byte buff[] = new byte[1024];
ByteArrayOutputStream fromFile = new ByteArrayOutputStream();
do {
int numread = in.read(buff);
if (numread <= 0) {
break;
}
fromFile.write(buff, 0, numread);
} while (true);
juqueryContent = fromFile.toString();
} catch (IOException e) {
e.printStackTrace();
}
}
/**
* 注入jquery
*/
public void injectJquery(final InjectCallback injectCallback) {
webview.loadUrl("javascript:" + juqueryContent);
webview.postDelayed(new Runnable() {
@Override
public void run() {
injectCallback.onSuccess();
}
},1000);
}
interface InjectCallback {
void onSuccess();
void onFail();
}
/**
* 原生设置dom值
*/
public void js_dom_setValueById(String id, String value) {
String js = "javascript:document.getElementById('" + id + "').value = '" + value + "'";
loadJs(js);
}
/**
* 原生设置dom值
*/
public void js_dom_setValueByName(String name, String value) {
String js = "javascript:document.getElementsByName('" + name + "').value = '" + value + "'";
loadJs(js);
}
/**
* js原生dom点击(通过id查找)
*/
public void js_dom_click_byId(String id) {
String js = "javascript:document.getElementById('" + id + "').click();";
webview.evaluateJavascript(js, null);
}
/**
* js原生dom点击(通过类查找)
*/
public void js_dom_click_byClass(String cls) {
String js = "javascript:document.getElementsByClassName('" + cls + "').click();";
webview.evaluateJavascript(js, null);
}
/**
* jquerydom点击(通过id查找)
*/
public void jquery_dom_click_byId(String id) {
String js = "var newscript = document.createElement(\"script\");";
js += "newscript.src=\"https://cdn.bootcss.com/jquery/1.12.4/jquery.min.js\";";
js += "document.body.appendChild(newscript);";
js += "newscript.οnlοad=function(){$('#" + id + "').click();};";
webview.evaluateJavascript(js, null);
}
/**
* jquery脚本执行
*/
public void jquery_dom(String jscontent) {
String js = "var newscript = document.createElement(\"script\");";
js += "newscript.src=\"https://cdn.bootcss.com/jquery/1.12.4/jquery.min.js\";";
js += "document.body.appendChild(newscript);";
js += "newscript.οnlοad=function(){" + jscontent + "};";
webview.evaluateJavascript(js, null);
}
/**
* jquerydom点击(通过类查找)
*/
public void jquery_dom_click_byClass(String cls) {
String js = "var newscript = document.createElement(\"script\");";
js += "newscript.src=\"https://cdn.bootcss.com/jquery/1.12.4/jquery.min.js\";";
js += "document.body.appendChild(newscript);";
js += "newscript.οnlοad=function(){$('." + cls + "').click();};";
webview.evaluateJavascript(js, null);
}
/**
* jquery设置dom值
*/
public void jquery_dom_setValue(String id, String value) {
String js = "var newscript = document.createElement(\"script\");";
js += "newscript.src='https://cdn.bootcss.com/jquery/1.12.4/jquery.min.js';";
js += "document.body.appendChild(newscript);";
js += "newscript.οnlοad=function(){$('#" + id + "').val('" + value + "');};";
webview.evaluateJavascript(js, null);
}
}
执行注入
webview.setWebViewClient(new WebViewClient() {
@Override
public boolean shouldOverrideUrlLoading(WebView view, String url) {
LogUtil.logD("当前的url:"+url);
view.loadUrl(url);
return true;
}
@Override
public void onReceivedError(WebView view, int errorCode, String description, String failingUrl) {
super.onReceivedError(view, errorCode, description, failingUrl);
LogUtil.logE(errorCode + ": " + description);
webview.loadUrl("file:///android_asset/404.html");
}
@Override
public void onPageStarted(WebView view, String url, Bitmap favicon) {
super.onPageStarted(view, url, favicon);
LogUtil.logD("开始加载网页:" + url);
if (!dialog.isShowing()) {
dialog.show();
}
}
@Override
public void onPageFinished(WebView view, final String url) {
super.onPageFinished(view, url);
dialog.dismiss();
LogUtil.logD("加载完成 URL:" + url);
webview.postDelayed(new Runnable() {
@Override
public void run() {
JSUtil.getInstance(webview).injectJquery(new JSUtil.InjectCallback() {
@Override
public void onSuccess() {
LogUtil.logD("执行登录:点击首页登录");
webview.evaluateJavascript("var link=$('#nav-logobar-greeting').attr('href');if(link){window.location=link;}else{$('#gwm-SignIn-button').click();}", null);
}
@Override
public void onFail() {
}
});
}
}, 1000);
}
});
注意上面的onPageFinished方法中延迟操作,如果不加这个延迟,webview.evaluateJavascript根本无法执行(找不到“$定义”)
android webview js 失效,Android WebView注入JQuery、JS脚本及执行无效的问题解决相关推荐
- Android应用数据清理命令(adb clear)的使用执行报错问题解决
Android应用数据清理命令(adb clear)的使用&执行报错问题解决 清理应用数据 我们在调试 Android 应用时,经常需要清理应用数据,在手机设置里找,当然也可以做到清理数据,但 ...
- android百分比布局失效,Android 百分比布局库【原创】
为了解决android手机适配问题,我们经常想如果可以按照百分比的方式进行界面布局,这样适配各种屏幕就简单多了吧!现在谷歌正式提供百分比布局支持库(android-support-percent-li ...
- android 底部弹窗失效,Android实现从底部弹出Dialog(和PopWindow实现的效果同样)
布局文件:dialog_custom_layout.xmlandroid android:orientation="vertical" android:layout_width=& ...
- JS文件中加载jquery.js(JS文件添加其他JS文件)
最近有一个需求: 1.在一个html中只能引入一个JS文件 不能有JS代码和其他JS文件的引入 2.这个JS文件中 还要引入其他的JS文件 3.所有JS功能都写在这个JS文件中 这些代码用到了jque ...
- android:layout_margin真实含义 及 自定义复合控件 layout()执行无效的问题解决
一.关于layout_margin 搞Android时间也不短了,对layout_margin也不陌生了,可最近遇到一个问题让我发现,对它的认识还不够深入全面.大量网络资料上都说,layout_mar ...
- android百分比布局失效,Android Studio不能添加百分比布局的依赖,书和AS不一样,老报错,怎么弄?急~~~...
我正好也在看这本书,这里也遇到同样的问题,不过仔细对比书上,可以看到书上的定义有: compile 'com.android.support:appcompat-v7:24.2.1' compile ...
- android点击失效,android点击无效验证的解决方法
背景 在写一个东西滑动删除列表的时候,出现了一个问题.我的需求是,左滑然后出现delete,然后点击delete,让该滑块消失. 我在点列表的第一行的时候,左滑,出现delete,点击删除,ok的,完 ...
- 在eclipse中引入jquery.js文件报错的解决方案
从官方下载的jquery.js在myeclipse始终用个大大的红叉,看着很不爽,如何解决呢:jquery.js在myeclipse中报错:jquery.js -> 鼠标右键 -> MyE ...
- 利用snowfall.jquery.js实现爱心满屏飞或点点满屏飞
<!doctype html> <html><head><title>HTML模板</title><meta charset='utf ...
最新文章
- 21个值得收藏的Javascript技巧
- linux 内核参数somaxconn TCP监听队列长度
- python官方网站地址-一些python牛人地址分享
- Google 修补多项 Android 高危漏洞
- SQL 注入 OrderBy/0ctf simplesqlin
- 桌面时钟代码_iOS 14 制作自己的桌面 Widget
- 如何判断一个常量是废弃常量,一个类是无用类
- 使用jquery图表插件jqplot之折线图
- 2021年德国汽车产量预计同比锐减18%
- cpu 散热测试软件,游匣G15丨全方位跑分评测报告
- VMware虚拟网络设置(NAT模式,桥接模式,仅主机模式设置),再也不用担心虚拟机连不上网了。
- 【云图】如何制作全国×××查询系统?
- idea拉出Output窗口和还原窗口
- hex2bin和bin2hex互转的小程序源代码
- C4D OC渲染器混合材质置换问题求助
- 利用IE登陆windows 2003 的终端服务器
- 2011年50大最佳网站
- 高速缓冲存储器(Cathe)简述
- 2022年瑞典经济发展研究报告
- 域名解析不生效,中科三方带你定位!
热门文章
- .NET Core 2.1.5和.NET Core SDK 2.1.403发布
- 构建可扩展的有状态服务
- 复习深入笔记01:对象/可变与不可变类型/字符编码/闭包
- powershell 运行策略
- mysql数据库的目录_了解MySQl数据库目录
- Android之webview长按超链接类型获取链接文字及url、长按图片链接类型分别获取图片和链接的url
- 如何解决secureCRT里面的The remote system refused the connection.
- Android之Google推荐的图片加载库Glide介绍
- okhttp上传图片和其他参数_Android中Okhttp3实现上传多张图片同时传递参数_放手_前端开发者...
- python 虚拟环境原理_Python 虚拟环境