8

在 InAppBrowser 上导航页面时,我想禁用或覆盖 Android 后退按钮。我可以添加一个可以处理的事件侦听器吗?

编辑: 查看@T_D 下面提供的解决方案的答案是我能得到的最接近的答案。似乎无法覆盖 InAppBrowser 中的按钮,因为在此插件上导航页面时,所有 PhoneGap 调整都停止工作。除了修改 API 库之外,我找不到任何其他解决方案。如果这里有任何PhoneGap 的人并且知道更多,我会很高兴得到一些评论。谢谢。

我得到的最接近的:

var ref = window.open('http://apache.org', '_blank', 'location=yes');
ref.addEventListener("backbutton", function () { })
4

9 回答 9

9

根据文档,现在可以为 InAppBrowser 配置硬件后退按钮的行为:

hardwareback:设置为 yes 以使用硬件后退按钮向后浏览 InAppBrowser 的历史记录。如果没有上一页,InAppBrowser 将关闭。默认值为yes,因此如果您希望后退按钮简单地关闭InAppBrowser,则必须将其设置为no。

谢克里斯埃里克森

因此,如果向后导航是所需的行为,只需更新您的 InAppBrowser 插件。

有关更多详细信息,请参阅:https ://github.com/apache/cordova-plugin-inappbrowser/pull/86

于 2015-03-25T16:39:01.090 回答
7

您现在可以很容易地做到这一点(从 InAppBrowser 版本 0.3.3 开始),但您必须编辑 Java 文件。转到 src/com/org/apache/corodova/inappbrowser 目录并编辑 InAppBrowserDialog.java:

改变

 public void onBackPressed () {
    if (this.inAppBrowser == null) {
        this.dismiss();
    } else {
        // better to go through the in inAppBrowser
        // because it does a clean up            
        this.inAppBrowser.closeDialog();           
    }
}

public void onBackPressed () {
    if (this.inAppBrowser == null) {
        this.dismiss();
    } else {
        if (this.inAppBrowser.canGoBack()) {
            this.inAppBrowser.goBack();
        }  else {
            this.inAppBrowser.closeDialog();
        }
    }
}

然后进入InAppBrowser,找到goBack函数,改:

/**
 * Checks to see if it is possible to go back one page in history, then does so.
 */
private void goBack() {
    if (this.inAppWebView.canGoBack()) {
        this.inAppWebView.goBack();
    }
}

/**
 * Checks to see if it is possible to go back one page in history, then does so.
 */
public void goBack() {
    if (this.inAppWebView.canGoBack()) {
        this.inAppWebView.goBack();
    }
}

public boolean canGoBack() {
    return this.inAppWebView.canGoBack();
}

现在硬件后退按钮将返回,直到没有更多的后退可做。我真的认为这应该是 android 中的默认行为,因为完成按钮已经关闭了 InAppBrowser 窗口。

于 2014-03-08T23:12:00.547 回答
4

编辑注意:据我所知,无法覆盖 PhoneGap 中 InAppBrowser 的后退按钮。但我尽我所能寻找可能的解决方案......

有一个 eventListener 可以覆盖 PhoneGap 中的后退按钮 -不适用于 InAppBrowser -

function onDeviceReady(){
    document.addEventListener("backbutton", onBackKeyDown, false);
}

替代 eventListener 来覆盖后退按钮 - OP 说这也不起作用-

var ref = window.open('http://www.stackoverflow.com', '_blank', 'location=yes');
ref.addEventListener("backbutton", function () {
    //logic here
})

覆盖 Activity 中的后退按钮 -这是普通的 java,显然在 PhoneGap 中不起作用-

@Override
public void onBackPressed()
{
   //logic here
}

结论

上述解决方案不起作用,以下链接(这个答案这个第三个)也没有帮助。因此,很有可能无法在 PhoneGap 中覆盖 InAppBrowser 的后退按钮。如果有人确实提出了解决方案,或者如果新的 PhoneGap 版本发生了变化,请随时告诉我们......

编辑:

安装此插件可能会将您带到最接近的解决方案:

cordova plugin add org.apache.cordova.inappbrowse

该插件将做什么,在WP8中,每当您打开其中的任何链接/页面时,它都会覆盖InAppBrowser上的后退/前进/关闭按钮。

看这张图片: 在此处输入图像描述

于 2013-05-15T15:57:01.333 回答
4

这在PhoneGap 2.7中对我有用,帮助来自here,如何禁用一页上的Android后退按钮并更改为每隔一页上的退出按钮

document.addEventListener("deviceready", onDeviceReady, false);
    function onDeviceReady() {
        document.addEventListener("backbutton", function (e) {
            e.preventDefault();
        }, false );
}
于 2013-10-08T02:30:39.607 回答
4

我遇到了同样的问题,终于让它工作了,我会在这里发布答案,以防它帮助某人。

这是我使用的代码:

window.new_window = window.open(url, '_blank', 'location=no');

window.new_window.addEventListener("exit", function () {
    window.new_window.close();
});

所以关键基本上是附加退出事件,当点击设备的后退按钮时调用该事件。

顺便说一句,我使用Cordova CLIcordova.js并在本地构建我的应用程序,我不知道这是否有任何区别,我提一下以防万一。

于 2014-05-20T17:00:31.437 回答
3

使用 jQuery 移动端:

$(document).on('backbutton',
 function(e){
     e.preventDefault();
     // YOUR CODE GOES HERE
});
于 2013-05-15T15:40:00.947 回答
3

运行 Cordova 5.1.1 并且当我在 inappbroswer 中加载页面时,我喜欢让后退按钮工作,直到 inappbrowser 退出回到我的 index.html 页面,因为它是空白的并且就在那里。所以我用下面的代码来解决这个问题。它在退出 inappbrowser 时退出应用程序。

window.open = cordova.InAppBrowser.open;                
            var ref = window.open(url, '_blank', 'location=no');
            ref.addEventListener('exit', function () {
                navigator.app.exitApp();
            });
于 2015-07-22T13:04:07.853 回答
0

据我所知,无法从 inAppBrowser 覆盖或检测后退按钮。当您按下返回按钮时,inAppBrowser 将隐藏并将控制权返回给 Phonegap 页面。focus你可以用窗口上的事件来捕捉它,(使用jQuery)就像

var browser = window.open('http://example.com', '_blank', 'location=no');
$(window).on('focus', function() {
    browser.show();
});

重新打开浏览器。browser.executeScript()然后,如果您愿意,您可以使用信号通知浏览器中加载的 webapp。

受此论坛帖子的启发。

于 2014-01-20T16:48:08.750 回答
0

我知道这个问题已经有了答案,但我将我的答案发布给那些对他们不起作用的人(比如我自己):

所以我有一个适用于 android 和 IOS 的多页面应用程序,我使用的是 cordova 5.x,除了我需要 InAppBrowser 的页面之外,我在每个页面中都添加了以下代码:

delete window.open;

然后对于我使用的其余页面:

document.addEventListener("backbutton", onBackKeyDown, false);
function onBackKeyDown(event) {
// your code for handling back button comes here
}

用于处理后退按钮

请注意:delete window.open;基于文档

手动恢复“window.open”的默认行为

之后 InAppBrowser 插件运行良好,我正确处理了所有页面中的后退按钮。

最后一件事不要忘记添加:<script type="text/javascript" charset="utf-8" src="cordova.js"></script>在页面中你需要有 InAppBrowser。

希望这有帮助。

于 2015-11-22T14:56:11.610 回答