【问题标题】:Android onOverrideUrlLoading based on javascript return value基于javascript返回值的Android onOverrideUrlLoading
【发布时间】:2015-06-30 16:53:49
【问题描述】:

我正在开发一个混合应用程序,并尝试根据在 webview 中执行的 javascript 函数的返回值在 webview 的 onOverrideUrlLoading 中返回 true 或 false

目前为止的示例代码。

//Have a boolean variable isExternalDomain; 
//Added JavascriptInterface webView.addJavascriptInterface(this, "android");

public boolean onOverrideUrlLoading(final String url) {


WebView.loadUrl("javascript:android.onData('true')");

//I Tried inserting sleep, delay EG: Thread.sleep(200); 


//I see the delay but still javascript executes last.

if(isExternalDomain) {
 return true;
 } else {
 return false;
 }

}

@JavascriptInterface public void onData(String value)
 {   
 isExternalDomain = true; 
}

所以我遇到的问题是 javascript 执行发生在 onOverrideUrlLoading 完成执行所有以 isExternalDomain 为 false 的行之后。我想让 onOverrideUrlLoading 根据 javascript 返回值返回 true 或 false。

【问题讨论】:

    标签: android cordova webview android-webview cordova-plugins


    【解决方案1】:

    很遗憾,无法从 onOverrideUrlLoading() 内部运行 JavaScript 代码。您必须先从onOverrideUrlLoading() 返回,WebView 才能执行其他任何操作。当您从onOverrideUrlLoading() 内部调用WebView.loadUrl() 时,真正发生的是异步任务被发布到WebView 的消息循环中。只有在您离开 onOverrideUrlLoading() 后才会处理它。因此,当您的代码在 onOverrideUrlLoading() 中时,WebView 不会有任何延迟来处理您的请求。

    如果您想根据 JavaScript 代码做出的决定来阻止导航发生,那么在 JavaScript 端使用window.onbeforeunload 事件处理程序来执行此操作更为自然。如果您从中返回非null 值,则通过单击链接离开的尝试将被取消。

    以下是 JavaScript 代码示例:

    window.onbeforeunload = function() {
        if (navigationDisallowed()) {
            return true;  // Prevent navigating away from the page.
        } else {
            return null;  // Allow navigating away.
        }
    }
    

    【讨论】:

    • 谢谢米哈伊尔,这有帮助。我假设相同,但想与某人确认。 Window.onbeforeunload 对我不起作用,因为它在 iOS 上不受支持,而且我试图阻止使用 javascript 完成的外部域的默认导航或链接按下以在 inappbrowser 中打开它们。我猜如果使用链接单击完成导航,则使用 onbeforeunload 我只能获取目标 URL。我们将外部域验证移至 android 的本机端,因此问题解决了(但每次我们需要将域列入白名单时都需要更新应用商店)。
    • 很高兴它有帮助!不知道 iOS 的限制。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-07-24
    • 2015-09-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多