简体   繁体   English

android-javascript:通过添加javascriptinterface使用原型将对象注入Webview

[英]android-javascript: using prototype to object injected in webview by add javascriptinterface

Im using addJavaScriptInterface to inject my object "myObj" into webview. 我使用addJavaScriptInterface将我的对象“ myObj”注入到webview中。 Here part of code 这部分代码

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);

    }

And i have HTML page that i can't change, where onload doing some crazy stuff 而且我有无法更改的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;
    }
}

this constuction work fine in our hardware device where object injected to real webkit browser, but not work in android webview, and accesing to myobj.Debug post error in logcat (Javascript error) 此构造在我们的硬件设备中可以正常工作,在该硬件设备中,对象已注入到真正的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

Note: if i call in javascript myOBJ.Debug("something"); 注意:如果我在javascript中调用myOBJ.Debug(“ something”); it work fine, so i think that part "f1.prototype = myobj_e;" 它工作正常,所以我认为该部分“ f1.prototype = myobj_e;” not working. 不工作。

I will be very glad to get some help. 我将很高兴获得一些帮助。

So i find a workaround. 所以我找到了一种解决方法。 Its not a solution, but i cant do it in other way. 它不是解决方案,但是我不能以其他方式做到这一点。

We can not change object that was added to webview by addJavascriptInterface in webpage side. 我们无法更改网页端的addJavascriptInterface添加到webview的对象。 So I need to make my own object, which will retranslate calls to interface. 因此,我需要创建自己的对象,该对象将重新转换对接口的调用。 I injected javascript onPageStarted and changeed object name to myOBJ_tmp 我注入了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);
        }
    });

Hope this will help somebody. 希望这会帮助到别人。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM