在页面加载之前将JavaScript插入WebView

时间:2015-03-07 14:17:05

标签: javascript json webview

在加载页面之前将JavaScript插入我的WebView时遇到了一些问题。

我想插入JavaScript的原因是因为我无法通过JavascriptInterface将JSON传递给Java。我不想在开发WebApps时使用字符串或JSON.stringify,因此我的方法是在WebViewClient.onPageStarted()方法中添加一些JavaScript。

简化示例:

var JSWrapper = {
  callJavascriptInterface: function (str, obj) {
    if (typeof obj === 'object') {
      JavascriptInterface.function(str, JSON.stringify(obj));
    } else {
      JavascriptInterface.function(str);
    }
  }
}

在onPageStarted中我还取消注册传感器并删除我通过JavascriptInterfaces注册的旧回调,因为当网站发生变化时应该再启用它们。

当我通过链接或其他东西更改网站时,但是如果我使用window.location.reload(),那么我最终会遇到错误(JSWrapper未定义)。

有人知道如何解决这个问题,或者甚至是更好的方法来关闭传感器,删除回调和JSON.stringify?

1 个答案:

答案 0 :(得分:0)

onPageStarted不适合在页面上执行任何操作。它是在从服务器获得第一个回复之后立即调用的,并且可能在呈现引擎实际处理页面之前发生。因此,根据页面加载的速度,您可能最终会与之前加载的页面进行交互,该页面将很快被丢弃(与您的更改一起)。

要记住的另一点是,通过add/removeJavascriptInterface注入/删除的Java接口的更改只会影响下一个加载的页面。也就是说,在您添加新的Java接口之后,必须执行页面(重新)加载,以使该接口实际可用于页面。如果您尝试从onPageStarted更改注入的接口配置,则这可能会或可能不会影响您正在加载的页面。

因此,如果您想要进行清理或准备导航到新页面,最好使用shouldOverrideUrlLoading,因为在页面决定导航之后,但在任何加载开始之前调用它(只记得从false返回shouldOverrideUrlLoading,以便像往常一样进行加载。

如果您想修改新加载的页面,例如插入您的JavaScript代码,使用onPageFinished - 在加载和解析新页面的资源后调用它。但请记住,此时注入Java接口为时已晚,因为它们只会影响下一个加载的页面。