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最好的3d游戏机,终极盘点