[英]android-javascript: using prototype to object injected in webview by add javascriptinterface
我使用addJavaScriptInterface将我的对象“ myObj”注入到webview中。 这部分代码
private void portalInit() {
CookieSyncManager.createInstance(this);
CookieSyncManager.getInstance().startSync();
wv.getSettings().setJavaScriptEnabled(true);
wv.getSettings().setCacheMode(WebSettings.LOAD_NO_CACHE);
wv.getSettings().setAllowContentAccess(true);
wv.setWebChromeClient(new WebChromeClient() {
@Override
public boolean onConsoleMessage(ConsoleMessage cm) {
Log.d("From JavaScript",
cm.message() + " -- From line " + cm.lineNumber()
+ " of " + cm.sourceId());
return true;
}
});
wv.setWebViewClient(new WebViewClient() {
@Override
public boolean shouldOverrideUrlLoading(WebView view, String url) {
view.loadUrl(url);
return true;
}
});
wv.addJavascriptInterface(new myObj(this, wv), "myOBJ");
wv.loadUrl("http://dl.dropbox.com/u/16515769/gradient.html");
wv.requestFocus(View.FOCUS_DOWN);
}
而且我有无法更改的HTML页面,其中onload做着一些疯狂的事情
<script>
function f1(){
this.do1 = function(par){
console.log("1: "+par);
};
this.do2 = function(num){
console.log("2: "+num);
};
}
function f2(){
this.do3 = function(par){
console.log("3: "+par);
};
this.do4 = function(num){
console.log("4: "+num);
};
}
var myobj;
var myobj_e = myOBJ;
f1.prototype = myobj_e;
f2.prototype = new f1();
myobj = new f2();
function keydown(e){
var key = e.keyCode || e.which;
switch(key){
case 13:
myobj.Debug("turn it on!!!!");
break;
case 27:
myobj.do1("turn it on!!!!");
break;
case 49:
myobj.do4("fsdfd")
break;
}
}
此构造在我们的硬件设备中可以正常工作,在该硬件设备中,对象已注入到真正的webkit浏览器中,但在android webview中却无法工作,并且无法访问myobj.Debug logcat中的post错误(Javascript错误)
Uncaught ReferenceError: NPMethod called on non-NPObject -- From line 36 of http://dl.dropbox.com/u/16515769/gradient.html
注意:如果我在javascript中调用myOBJ.Debug(“ something”); 它工作正常,所以我认为该部分“ f1.prototype = myobj_e;” 不工作。
我将很高兴获得一些帮助。
所以我找到了一种解决方法。 它不是解决方案,但是我不能以其他方式做到这一点。
我们无法更改网页端的addJavascriptInterface添加到webview的对象。 因此,我需要创建自己的对象,该对象将重新转换对接口的调用。 我注入了JavaScript onPageStarted,并将对象名称更改为myOBJ_tmp
wv.setWebViewClient(new WebViewClient() {
@Override
public boolean shouldOverrideUrlLoading(WebView view, String url) {
view.loadUrl(url);
return true;
}
@Override
public void onPageStarted (WebView view, String url, Bitmap favicon){
String script= "javascript:var func_list = ['Debug'];";
script+="var myOBJ = {};"
script+="func_list.map(function(id){"
script+="myOBJ[id]= function() {"
script+="try{return myOBJ_tmp[id].apply(myOBJ_tmp, arguments);}"
script+="catch(e) { console.log('ERROR: ' + e + ', method ' + id);"
script+="return false;}}})"
view.loadUrl(script);
}
});
希望这会帮助到别人。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.