【问题标题】:Cordova InAppBrowser loaderror event not firing for Error 500Cordova InAppBrowser loaderror 事件未因错误 500 触发
【发布时间】:2020-09-03 23:17:50
【问题描述】:

我对 InAppBrowser 有疑问。我正在尝试捕获可能来自我正在加载的网站的错误,并且我正在通过错误的 .htaccess 进行模拟,这会产生错误 500。

我有以下代码:

ref = cordova.InAppBrowser.open($openuri, '_blank', 'location=no,toolbar=no,zoom=no,enableviewportscale=no,disallowoverscroll=no');
ref.addEventListener("loadstop",function() {
        .....
    });
ref.addEventListener("loaderror",function() {
        alert('Toot');
    });
ref.addEventListener('loadstart', function(event) {
        .....
});

网站正在打开,所有“loadstop”和“loadstart”事件都正常工作。但是,当我故意让页面返回“错误 500”时,“loaderror”事件没有触发。

它会因其他错误而触发 - 例如当手机上没有互联网时。

非常感谢任何关于为什么会发生这种情况的想法。

【问题讨论】:

  • 你在安卓设备上测试吗?
  • 查看适用于 Android 的 InAppBrowser 插件代码,它内部使用 onReceivedError 方法来处理“加载错误”事件。因此,我从 webview 的角度查看了这个问题,并偶然发现了这个链接 - code.google.com/p/android/issues/detail?id=968,它指出 onReceivedError 函数并不意味着捕获 HTTP 错误。对于 HTTP 错误处理,我们可能必须使用不属于插件的“onReceivedHttpError”函数。希望这对为什么不起作用是有意义的。
  • @Gandhi 是的,这就解释了。如果您发表评论作为答案,我会接受。谢谢
  • 完成。您可以接受。干杯

标签: cordova cordova-plugins inappbrowser


【解决方案1】:

查看Android的InAppBrowser插件代码,它内部使用onReceivedError方法处理loaderror事件。因此,我从 webview 的角度查看了这个问题,并偶然发现了这个链接 - https://code.google.com/p/android/issues/detail?id=968,其中指出 onReceivedError 函数并不意味着捕获 HTTP 错误。

对于 HTTP 错误处理,我们可能不得不使用不属于插件的onReceivedHttpError 函数。我希望它为什么不起作用是有道理的。

【讨论】:

  • @Frighi 我觉得它仍然只处理与网络资源相关的错误,而不是 http 错误
  • @GSH 我记得编辑了 inAppBrowser 插件,但我无法访问修复程序,我不记得我在哪里进行了更改,抱歉。
  • @DreamWave,如果你还记得你有一些添加类型的这个函数 public void onReceivedHttpError(WebView view, WebResourceRequest request, WebResourceResponse errorResponse) 到 InAppBrowser.java,作为下面评论中发布的函数。
  • public void onReceivedHttpError(WebView view, WebResourceRequest request, WebResourceResponse errorRes) { super.onReceivedHttpError(view, request, errorRes);尝试 { JSONObject obj = new JSONObject(); obj.put("类型", LOAD_ERROR_EVENT); obj.put("url", request.getUrl().toString()); obj.put("代码", errorResponse.getStatusCode()); obj.put("消息", "GSH 错误!"); sendUpdate(obj, true, PluginResult.Status.ERROR); } catch (JSONException ex) { LOG.d(LOG_TAG, "Error Mag"); } }
  • 是的,你说的是对的,但是你有没有尝试过 Http 插件来捕捉那 500 个状态码错误? @Gandhi .. iam 使用 Http 插件处理自己的 500 状态代码错误。它对我有用。
【解决方案2】:

我正在使用 Ionic 4,但无法使基于 config.xml 编辑的解决方案正常工作:

preference name="ErrorUrl" value="myErrorPage.html"/

在 loaderror 上放置一个 addEventListener 也不起作用。看起来它不是由 http 错误触发的,插件需要修复。

但我们发现了一个更简单的 hack。

在 loadstop 我们等待 500 毫秒,然后我们通过触发 executeScript 和 window.location.href 来获取加载的 url

如果加载的 url 是自定义错误页面的,在 Cordova 中(不是在 IAB 中)我们会显示带有后退按钮的自定义消息。

这是一个 hack,但已经满足了现在的要求

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-09-24
    • 2017-01-03
    • 1970-01-01
    • 1970-01-01
    • 2014-02-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多