我有一个非常奇怪的问题,只在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
答案 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/
希望有所帮助