当系统浏览器打开时,Cordova inappbrowser会丢失事件处理程序

时间:2017-01-22 11:09:07

标签: javascript android cordova inappbrowser

我已经把头发拉了几天试图解决这个问题所以真的希望有人有解决方案!

问题仅存在于Android中,iOS似乎运行良好。

该应用正在使用inappbrowser显示网站。单击网站外部的链接时,我想在系统浏览器中启动所选链接,然后确保inappbrowser页面不会更改。我使用下面的代码工作。我遇到的问题是,在系统浏览器打开后,我的所有事件(loadstart,loadstop)都不再有效,因此如果选择了另一个外部链接,则现在在loadstart事件中检测不到它,并在inappbrowser中打开。

如果我只是注释掉window.open(url,'_ system`); loadstart事件中的一行继续按预期工作,但显然外部链接未在系统浏览器中打开。

launchBrowser: function (url) {
    app.inAppBrowserRef = cordova.InAppBrowser.open(url, '_blank', app.browserOptions);
    app.inAppBrowserRef.addEventListener('loadstart', function (event) {
        var url = event.url;
        // Determine if this is an external link that should be launched in the system browser.
        if (url.toLowerCase().indexOf(app.portalUrl.toLowerCase()) === -1) {
            //External link, launch in system browser.
            window.open(url, '_system');
            app.setInappBrowserUrl(app.previousUrl);
        }
    });
    app.inAppBrowserRef.addEventListener('loadstop', function (event) {
        app.previousUrl = event.url;
    });
},

覆盖inappbrowser页面的函数。

setInappBrowserUrl: function (overrideUrl) {
    app.inAppBrowserRef.executeScript({
        code: "window.location = '" + overrideUrl + "';"
    }, function () {
        //alert("Redirected!");
    });
}

我有一个粗略的解决方法,涉及使用我想要显示的网址调用launchBrowser(),但问题是我丢失了所有历史记录,所以当你按下后退按钮时,inappbrowser会关闭。

感谢您的期待!

1 个答案:

答案 0 :(得分:1)

一旦cordova.InAppBrowser.open(url,' _system'),需要重新初始化InAppBrowser eventHandler;或window.open(url,' _system');在事件处理程序中调用。在您的代码中,添加对window.open的引用(url,' _system');并添加eventHandler,如下所示:

    function loadStartEventHandler(event){
    var url = event.url;
    // Determine if this is an external link that should be launched in the system browser.
        if (url.toLowerCase().indexOf(app.portalUrl.toLowerCase()) === -1) {
          //External link, launch in system browser.
          //window.open(url, '_system');
          //reference the new InAppBrowser
          var ref = window.open(url, '_system');
          //reassign the event handler
          ref.addEventListener('loadstart', loadStartEventHandler);

          app.setInappBrowserUrl(app.previousUrl);
        }
    }
    app.inAppBrowserRef.addEventListener('loadstart', loadStartEventHandler);

该bug已提交给cordova apache。 https://issues.apache.org/jira/browse/CB-13198