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根本无法执行(找不到“$定义”)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/301542.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

AIX逻辑卷管理(LVM)

VG PV PP LV LP关系图 转载于:https://www.cnblogs.com/limt/archive/2013/04/06/4199257.html

鸿蒙操作系统如何打通 Windows 操作系统?

华为&#xff1a;我们选择拥抱 Windows华为给出的解决方案是在微软 Windows 操作系统中部署 HarmonyOS 分布式插件。运行 Windows 操作系统的电脑和运行鸿蒙操作系统的华为手机将形成超级终端&#xff0c;文件资源管理器实现互通。在 Windows 文件资源管理器中&#xff0c;将显…

凯立德导航android历史版本,凯立德导航升级2020版

凯立德导航升级2020版是一款非常专业的手机机车导航软件&#xff0c;它可以为大家提供便捷的导航服务&#xff0c;用户只需要输入自己想去的地方&#xff0c;软件会智能推荐一条最便捷的路线&#xff0c;同时会告知用户目的地附近热门的吃喝玩乐场所&#xff0c;有需要的用户来…

用 Python 实现打飞机

全世界只有3.14 % 的人关注了数据与算法之美所用技术和软件python 2.7pygame 1.9.3pyCharm准备工作安装好 pygame 在第一次使用 pygame 的时候&#xff0c;pyCharm 会自动 install pygame。下载好使用的素材。技术实现初始化 pygame首先要初始化 pygame &#xff0c;之后设定一…

QT-Linux开发环境的搭建

转自&#xff1a;http://blog.csdn.net/wh_19910525/article/details/8118381 如果读者需要在Linux下进行开发&#xff0c;可以使用下面简单的步骤来搭建环境&#xff1a; &#xff08;下面以Ubuntu 12.04 为例进行说明&#xff09;1. 下载软件 到http://get.qt.nokia.com/qt/s…

把HttpClient换成IHttpClientFactory之后,放心多了

前言关于HttpClient的使用&#xff0c;个人在很多场景都派上用场了&#xff0c;比如在Winform或后台服务中用其调用接口获取和上传数据、微服务中用其进行各服务之间的数据共享等&#xff0c;到目前来看&#xff0c;似乎还没有出现过什么问题&#xff0c;但当我看到官方文档介绍…

android app银联支付,android app 快速接入银联支付流程(android studio版)

刚接触了下银联支付&#xff0c;在网上搜还是看官方文档银联支付都不是很清晰&#xff0c;所以自己总结一篇&#xff0c;希望可以帮助大家快速集成。一.进入下载官网&#xff0c;选择下载手机控件支付demo&#xff1a;https://open.unionpay.com/ajweb/help/file/techFile?pro…

基础排序算法 – 冒泡排序Bubble sort

原理是临近的数字两两进行比较,按照从小到大或者从大到小的顺序进行交换&#xff0c; 这样一趟过去后,最大或最小的数字被交换到了最后一位&#xff0c; 然后再从头开始进行两两比较交换&#xff0c;直到倒数第二位时结束。 从小到大排序&#xff1a; 原始待排序数组| 6 | 2 | …

这么简单的bug,你改了2天?

大家好&#xff0c;我是Z哥。“这个 bug 的问题不是很明显吗&#xff1f;怎么这么久才搞定&#xff1f;”“就改一行代码&#xff0c;你怎么弄了这么久&#xff1f;”我想上面的言语几乎每个程序员都听到过。特别是面对那些“稍懂技术”的同事的时候。我觉得这篇文章特别适合你…

android最好的3d游戏机,终极盘点:Android必玩十大超猛3D游戏

2010年即将过去&#xff0c;今年是Android平台的发展非常迅猛的一年&#xff0c;系统版本从2.1、2.2一路飙升至2.3&#xff0c;各种手机与平板设备也层出不穷。与此相对的当然就是应用软件的大爆发&#xff0c;根据AndroLib在本周二所公布的数字&#xff0c;Android Market目前…

要学习数据科学知识,这些信息需要知道(数据)

数据科学知识&#xff0c;分享数据干货&#xff0c;追逐科技前沿等方面另外&#xff0c;其他领域的学术进展&#xff0c;资讯以及合适的招聘要获取这些相关的信息&#xff0c;我们觉得这些平台非常的出色&#xff0c;推荐给大家。iNatureID&#xff1a;Plant_ihuman▲ 长按二维…

insert /*+ APPEND */

总结得出以下3点结论&#xff1a;a、非归档模式下&#xff0c;只需append就能大量减少redo的产生&#xff1b;归档模式下&#xff0c;只有appendnologging才能大量减少redo。b、insert /* append */ 时会对表加锁&#xff08;排它锁&#xff09;&#xff0c;会阻塞表上的除了se…

Csharp实例:武汉智能安检闸机数据接收和解析

项目介绍&#xff1a;本实例主要是接收安检闸机的数据解析并显示到界面上&#xff0c;只做功能实现&#xff0c;不做界面美化硬件&#xff1a;闸机一个、网线一根、电脑主机开发环境&#xff1a;vs2017 系统&#xff1a;win10涵盖知识点&#xff1a;tcp通讯、文件写入、多线程&…

墨迹天气android,墨迹天气Android产品分析

墨迹天气官网宣传图一、产品概况1、产品简介墨迹天气是一款免费天气预报工具&#xff0c;提供日出日落信息&#xff0c;六小时天气预报2、主要竞品天气通、最美天气、91黄历天气、知趣天气、懒人天气、琥珀天气二、体验环境手机&#xff1a;华为A199操作系统&#xff1a;Androi…

可编程的智能小车,100种玩法,让孩子玩出理科编程思维

▲数据汪特别推荐点击上图进入玩酷屋毫无疑问&#xff0c;数学、科学和计算机科学是解决21世纪现代问题的三大支柱。当现在各式各样的兴趣班和教育辅导班快要呈现饱和状态时&#xff0c;一种新兴的教育活动正如火如荼地进行着那就是少儿编程。少儿编程奇迹般的红火&#xff0c;…

我的Android进阶之旅------Android MediaPlayer播放mp3的实例--简易mp3播放器

大家好我们今天研究的是Android中很重要也最为复杂的媒体播放器---MediaPlayer. Android的MediaPlayer包含了Audio和video的播放功能&#xff0c;在Android的界面上&#xff0c;Music和Video两个应用程序都是调用MediaPlayer实现的。 首先来看看MediaPlayer的生命周期&#xff…

AgileConfig轻量级配置中心1.3.0发布,支持多用户权限控制

AgileConfig 当初是设计给我自己用的一个工具&#xff0c;所以只设置了一道管理员密码&#xff0c;没有用户的概念。但是很多同学在使用过后都提出了需要多用户支持的建议。整个团队或者整个公司都使用同一个密码来管理非常的不方便。今天 AgileConfig 1.3.0 版本终于支持了多用…

每日一笑 | 马冬梅当上了百度投资董事???

全世界只有3.14 % 的人关注了数据与算法之美马东什么&#xff1f;&#xff08;图片来源于网络&#xff0c;侵权删&#xff09;

批处理解决局域网共享打印机问题

随着公司规模的扩大&#xff0c;人员流动性也越来越大。特别是业务这块&#xff0c;隔三差五的就来几个业务人员&#xff0c;一入职各种后勤工作都要给他们安排好。网络这块除了基本的网线&#xff0c;电话要通以外。最最后面的当然就是打印机的共享了。 先说说公司的网络环境。…

.NET MAUI 预览版 6 发布

原文&#xff1a;bit.ly/2SKad9g作者&#xff1a;.NET Blog - David译者&#xff1a;精致码农 - 王亮当我们还在从微软 Build 大会和 .NET 6 预览版 4 中缓过来的时候&#xff0c;我们在这里就开始分享我们在 .NET 6 预览版 5 中对 .NET 多平台应用程序开发框架(.NET MAUI)的持…