在加载页面之前将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?
答案 0 :(得分:0)
onPageStarted
不适合在页面上执行任何操作。它是在从服务器获得第一个回复之后立即调用的,并且可能在呈现引擎实际处理页面之前发生。因此,根据页面加载的速度,您可能最终会与之前加载的页面进行交互,该页面将很快被丢弃(与您的更改一起)。
要记住的另一点是,通过add/removeJavascriptInterface
注入/删除的Java接口的更改只会影响下一个加载的页面。也就是说,在您添加新的Java接口之后,必须执行页面(重新)加载,以使该接口实际可用于页面。如果您尝试从onPageStarted
更改注入的接口配置,则这可能会或可能不会影响您正在加载的页面。
因此,如果您想要进行清理或准备导航到新页面,最好使用shouldOverrideUrlLoading
,因为在页面决定导航之后,但在任何加载开始之前调用它(只记得从false
返回shouldOverrideUrlLoading
,以便像往常一样进行加载。
如果您想修改新加载的页面,例如插入您的JavaScript代码,使用onPageFinished
- 在加载和解析新页面的资源后调用它。但请记住,此时注入Java接口为时已晚,因为它们只会影响下一个加载的页面。