当新内容添加到当前页面时,使用addJavascriptInterface触发

时间:2014-03-09 14:07:33

标签: javascript android webview

我正在尝试向当前加载的html添加一些新内容(在webview中),这不是问题,我可以通过javascript向body添加新标记,假设:

loadUrl("javascript:(function() { document.body.innerHTML += '<div id=\"separator\" style=\"height:10px; margin-top:10px; margin-bottom:10px; background-color:#000000;\"></div> <p><font size=24> static page " + pageNumber + "';}())");

它做得很好。

但我想知道新内容何时呈现并向用户显示。(我在下面使用但如果您知道更好的方式请告诉我)。所以我添加了javascript这样的界面:

addJavascriptInterface(new ObjectExtension(), "webviewScriptAPI");

final class ObjectExtension
{
    public void onLoad()
    {
        Log.i("onLoad", "onLoad get called");       
    }
}

现在我尝试通过loadUrl("local html address");

加载第一个html页面

当页面加载完全,我想通过javascript添加新内容并在新内容呈现时调用onLoad(),所以我添加:

loadUrl("javascript:(function() { window.onload = function() { webviewScriptAPI.onLoad(); }; })()");
loadUrl("javascript:(function() { document.body.innerHTML += '<div id=\"separator\" style=\"height:10px; margin-top:10px; margin-bottom:10px; background-color:#000000;\"></div> <p><font size=24> static page " + pageNumber + "';}())"); // pageNumber is an incremental integer

新内容成功添加,但onLoad()未触发。

我也试过这个,没有成功:

loadUrl("javascript:(function() { window.onresize = function() { webviewScriptAPI.onLoad(); }; })()");
loadUrl("javascript:(function() { document.body.innerHTML += '<div id=\"separator\" style=\"height:10px; margin-top:10px; margin-bottom:10px; background-color:#000000;\"></div> <p><font size=24> static page " + pageNumber + "';}())"); // pageNumber is an incremental integer

2 个答案:

答案 0 :(得分:1)

好的,我通过document.ready

解决了这个问题
loadUrl(html);
loadUrl("javascript:(function() { if(document.readyState === \"complete\") { webviewScriptAPI.onLoad(); }; })()");

答案 1 :(得分:0)

缺少一行:

final class ObjectExtension
{
    public void onLoad()
    {
        Log.i("onLoad", "onLoad get called");       
    }
}

它应该是:

final class ObjectExtension
{
    @JavascriptInterface
    public void onLoad()
    {
        Log.i("onLoad", "onLoad get called");       
    }
}