从webview中捕获本机后退按钮事件

时间:2015-08-24 19:35:19

标签: javascript webview android-webview

我是网页浏览的新手,并尝试使用它来创建应用。我有一个使用javascript显示的弹出窗口。它有一个关闭按钮。除了关闭按钮,我想使用本机后退按钮。

也就是说,如果用户点击后退按钮,我的弹出窗口应该关闭。

我的疑问是,它是否需要本机应用程序的任何更改?或者webview将后退按钮操作转换为webview可以理解的按键等事件?

5 个答案:

答案 0 :(得分:2)

我不知道您是否拥有HTML5支持,但如果是这样,那么历史记录API中的history.pushStatehistory.onpopstate将完全符合您的要求。

当显示弹出窗口时,使用pushState通知浏览器新的历史记录条目,就像弹出窗口是新页面一样。

然后向history.onpopstate添加一个事件监听器,关闭弹出窗口,如果它已打开。

答案 1 :(得分:2)

您可以尝试混合一些问题及其解决方案:

  1. 拦截Android中的back button点击事件

  2. webview中的
  3. Exec a js function(来自外部)

  4. 文档中的will trigger an event

  5. 使用document.addEventListener收听此活动,此处关闭对话框/提醒

答案 2 :(得分:1)

如果您使用Cordova,它会提供一个事件来跟踪Android设备上的后退按钮:

document.addEventListener("backbutton", yourCallbackFunction, false);

您可以覆盖此事件并实现自己的行为。除此之外,不应该有一种方法来跟踪后退按钮事件。

答案 3 :(得分:1)

单击后退按钮将关闭显示模态的viewcontroller。

我猜你不希望发生这种情况,只关闭javascript模式。

是的,您需要更改本机代码。

On native backbutton click, 

if your modal is open:
  close the modal
else:
  do default backbutton action.

以下是详细说明。

On native backbutton click # your native code to intercept the back button

if your modal is open: 
# there are multiple options here
# first strategy 
#   let javascript inform native side when it opens/closes popup 
#   native just needs to check the status he has
# second strategy
# native asks javascript if he has a modal open
# this is a bit tricky because native can't get a return value from javascript
# native asks javascript to tell native if he has a modal open (native->javascript + javasciprt -> native two function calls)
# native checks what javascript just said

    close the modal
    # this is easy, ask javascript to close it.

我认为你知道如何在javascript和amp;之间进行交流本机,如果不看看http://www.smashingmagazine.com/2013/10/best-of-both-worlds-mixing-html5-native-code/

答案 4 :(得分:1)

进一步帮助lifeisfoo陈述的内容:

public class WebViewer
WebView webView;
@Override
public void onBackPressed() {
    if (webView.hasPopUp()) {
        webView.loadUrl("javascript:closePopUp()");
    } else {
        super.onBackPressed();
    }
}