0

我使用 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 中不起作用,并且在 logcat 中访问 myobj.Debug 发布错误(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;” 不工作。

我会很高兴得到一些帮助。

4

1 回答 1

1

所以我找到了解决方法。它不是一个解决方案,但我不能以其他方式做到这一点。

我们无法更改通过网页端的 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);
        }
    });

希望这会对某人有所帮助。

于 2013-01-30T15:21:23.900 回答