Firefox:在确认弹出窗口中停止传入enter keypress?

时间:2014-06-23 12:38:07

标签: javascript jquery firefox

我有一个非常奇怪的问题,只在firefox中出现。我有一个磨机对话框:

var cnf = confirm(message);

if(cnf) {
    blah blah
}

问题是我在文档上还有一个keyup处理程序,当用户键入enter以确认对话框时会以某种方式触发。

$(document).bind('keyup', function(e) {          
    console.log('someone hit ' + e.which);   
});

当用户点击进入确认时,控制台还会记录“有人打13”,这在任何其他浏览器中都不会发生(并且AFAIK不应该发生)

我有什么方法可以防止keydown事件的传播或以某种方式避免这种行为?

这是一个描述问题的jsfiddle:clicky

3 个答案:

答案 0 :(得分:1)

我认为最佳解决方案是在Firefox中覆盖确认方法。

// Ideally you should use feature detection but can't think of a better way
if ( true ) { // Check for firefox like $.browser.mozilla
  (function(window){
    var _confirm = window.confirm;
    window.confirm = function(msg){
      var keyupCanceler = function(ev){
          ev.stopPropagation();
          return false;
      };
      document.addEventListener("keyup", keyupCanceler, true);
      var retVal = _confirm(msg);
      setTimeout(function(){
        document.removeEventListener("keyup", keyupCanceler, true);
      }, 150); // Giving enough time to fire event
      return retVal;
    };
  })(window);
}

上面的代码将使用捕获阶段禁用任何键盘事件到达DOM元素。

请检查此更新的jsFiddle:http://jsfiddle.net/mTrPQ/2/

答案 1 :(得分:0)

我想到的唯一解决方案是添加一个标志:当要显示确认对话框时,将标志设置为true,并在事件监听器方法中检查它。

var flagDialog=true;
var cnf = confirm(message);
flagDialog=false;

if(cnf) {
    blah blah
}

. . .    

$(document).bind('keydown', function(e) {
    if (flag) {
        e.stopPropagating();
        return;
    } else {
        console.log('someone hit ' + e.which);   
    }
});

最新更新:我尝试修改确认默认功能,但似乎不起作用:http://jsfiddle.net/8vFjR/4/

答案 2 :(得分:0)

我能够重现这个问题,我检查了e.target是被点击的按钮(“点击我”按钮)。因此,您可以检查目标是否是该按钮,因此您可以继续。

$(function() {
    var $btn = $('#btn');
    $(document).on('keyup', function(e) {
        if(e.target == $btn[0]) return; // Added line
        console.log('someone hit ' + e.which);   
    });
});

function clickMe() {
    var cnf = confirm("Yes?");
    if(cnf) {
        console.log('someone confirmed');
    }
}

你也可以在这里查看: http://jsfiddle.net/8vFjR/5/

希望有所帮助