2014-06-23 44 views
3

我遇到一個非常奇怪的問題,只發生在Firefox中。我有磨對話框的運行:Firefox:在確認彈出框中停止傳入按鍵傳播?

var cnf = confirm(message); 

if(cnf) { 
    blah blah 
} 

的問題是我也有當用戶鍵入回車確認對話框,不知怎的,觸發該文檔的KEYUP處理程序。

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

當用戶點擊回車確認,控制檯還記錄「有人打13」,這不以任何其他瀏覽器中發生(據我所知和不應該發生)

有沒有什麼辦法了我爲了防止keydown事件的傳播或以某種方式避免這種行爲?

這裏有一個的jsfiddle描繪了問題:clicky

+0

e.stopPropagation()應幫助 –

+0

e.stopPropagation()是什麼?我想在對話層面停止傳播。 – Bogdan

+2

這似乎沒有顯示任何東西在控制檯http://jsfiddle.net/mplungjan/R4Lsd/show - 你可以讓自己的? – mplungjan

回答

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元素禁用任何KEYUP事件。

請檢查該更新的jsfiddle:http://jsfiddle.net/mTrPQ/2/

+0

這很好地工作,而無需改變百位的代碼。 – Bogdan

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/

+0

我希望有一個更清潔的解決方案比這是誠實的。雖然它會起作用(並且實際上,我已經測試過),但這意味着代碼中的數百次更改,我沒有時間去做。 – Bogdan

+0

@Pablo請檢查對原始問題的意見。事件是keyup而不是keydown。 – amitamb

+0

我也編輯了我的開場白帖子以包含小提琴。檢查出來,這是從@mplungjan – Bogdan

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/

希望它可以幫助