在项目中遇到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脚本及执行无效的问题解决相关推荐

  1. Android应用数据清理命令(adb clear)的使用执行报错问题解决

    Android应用数据清理命令(adb clear)的使用&执行报错问题解决 清理应用数据 我们在调试 Android 应用时,经常需要清理应用数据,在手机设置里找,当然也可以做到清理数据,但 ...

  2. android百分比布局失效,Android 百分比布局库【原创】

    为了解决android手机适配问题,我们经常想如果可以按照百分比的方式进行界面布局,这样适配各种屏幕就简单多了吧!现在谷歌正式提供百分比布局支持库(android-support-percent-li ...

  3. android 底部弹窗失效,Android实现从底部弹出Dialog(和PopWindow实现的效果同样)

    布局文件:dialog_custom_layout.xmlandroid android:orientation="vertical" android:layout_width=& ...

  4. JS文件中加载jquery.js(JS文件添加其他JS文件)

    最近有一个需求: 1.在一个html中只能引入一个JS文件 不能有JS代码和其他JS文件的引入 2.这个JS文件中 还要引入其他的JS文件 3.所有JS功能都写在这个JS文件中 这些代码用到了jque ...

  5. android:layout_margin真实含义 及 自定义复合控件 layout()执行无效的问题解决

    一.关于layout_margin 搞Android时间也不短了,对layout_margin也不陌生了,可最近遇到一个问题让我发现,对它的认识还不够深入全面.大量网络资料上都说,layout_mar ...

  6. android百分比布局失效,Android Studio不能添加百分比布局的依赖,书和AS不一样,老报错,怎么弄?急~~~...

    我正好也在看这本书,这里也遇到同样的问题,不过仔细对比书上,可以看到书上的定义有: compile 'com.android.support:appcompat-v7:24.2.1' compile  ...

  7. android点击失效,android点击无效验证的解决方法

    背景 在写一个东西滑动删除列表的时候,出现了一个问题.我的需求是,左滑然后出现delete,然后点击delete,让该滑块消失. 我在点列表的第一行的时候,左滑,出现delete,点击删除,ok的,完 ...

  8. 在eclipse中引入jquery.js文件报错的解决方案

    从官方下载的jquery.js在myeclipse始终用个大大的红叉,看着很不爽,如何解决呢:jquery.js在myeclipse中报错:jquery.js -> 鼠标右键 -> MyE ...

  9. 利用snowfall.jquery.js实现爱心满屏飞或点点满屏飞

    <!doctype html> <html><head><title>HTML模板</title><meta charset='utf ...

最新文章

  1. 21个值得收藏的Javascript技巧
  2. linux 内核参数somaxconn TCP监听队列长度
  3. python官方网站地址-一些python牛人地址分享
  4. Google 修补多项 Android 高危漏洞
  5. SQL 注入 OrderBy/0ctf simplesqlin
  6. 桌面时钟代码_iOS 14 制作自己的桌面 Widget
  7. 如何判断一个常量是废弃常量,一个类是无用类
  8. 使用jquery图表插件jqplot之折线图
  9. 2021年德国汽车产量预计同比锐减18%
  10. cpu 散热测试软件,游匣G15丨全方位跑分评测报告
  11. VMware虚拟网络设置(NAT模式,桥接模式,仅主机模式设置),再也不用担心虚拟机连不上网了。
  12. 【云图】如何制作全国×××查询系统?
  13. idea拉出Output窗口和还原窗口
  14. hex2bin和bin2hex互转的小程序源代码
  15. C4D OC渲染器混合材质置换问题求助
  16. 利用IE登陆windows 2003 的终端服务器
  17. 2011年50大最佳网站
  18. 高速缓冲存储器(Cathe)简述
  19. 2022年瑞典经济发展研究报告
  20. 域名解析不生效,中科三方带你定位!

热门文章

  1. .NET Core 2.1.5和.NET Core SDK 2.1.403发布
  2. 构建可扩展的有状态服务
  3. 复习深入笔记01:对象/可变与不可变类型/字符编码/闭包
  4. powershell 运行策略
  5. mysql数据库的目录_了解MySQl数据库目录
  6. Android之webview长按超链接类型获取链接文字及url、长按图片链接类型分别获取图片和链接的url
  7. 如何解决secureCRT里面的The remote system refused the connection.
  8. Android之Google推荐的图片加载库Glide介绍
  9. okhttp上传图片和其他参数_Android中Okhttp3实现上传多张图片同时传递参数_放手_前端开发者...
  10. python 虚拟环境原理_Python 虚拟环境