2009-10-17 18 views
0

取代目前,我有在HTML標籤中指定的onkeypress事件事件一個文本。我試圖捕獲這個按鍵,並將其保存爲將用於覆蓋它的函數,因爲我想在運行時添加另一個條件。這是我想要實現的代碼。禁用JavaScript的原按鍵事件和動態

$(document).ready(function(e) { 
    var defaultKeypress = $('textarea').keypress; 
    $('textarea').keypress(function(e) { 
     if (fieldsChanged) { 
      fieldsChanged = false; 
     } 
     else { 
      defaultKeypress(e); 
     } 

    }); 
}); 

我遇到的問題是與IE 7 & 8.兩個火原按鍵(即使「defaultKeypress(E);」已被註釋掉)和新的按鍵是射擊。 (原始的,然後新的)。除了從textarea標籤中刪除onkeypress屬性(我不能這樣做,因爲如果代碼是如何生成的),有沒有辦法禁用觸發原始按鍵?

謝謝! Nutzy

回答

4

jQuery的keypress方法增加你傳遞給它的處理程序,並確實覆蓋任何東西。這是非常設計。通過這種方式,您可以將多個事件處理程序附加到有問題的元素,而不必擔心會破壞任何現有的處理程序。

實際上,你給揍現有的處理程序。你不能使用unbind。你可以只取出自己的處理程序反正雖然:

var $el = $('textarea'), 
    defaultKeypress = $el.attr('onkeypress'); 

$el.removeAttr('onkeypress'); 

$el.keypress(function(e) { 
    if (fieldsChanged) { 
     fieldsChanged = false; 
    } 
    else { 
     return defaultKeypress.apply(this, arguments); 
    } 
}); 

通知我打電話defaultKeypress使用apply正確的範圍,以及使用return傳遞其結果返回。這都是爲了維護瀏覽器調用它的標準事件處理程序環境。

參考文獻:

+0

經過一些微小的修改,這工作完美!謝謝! – Nutzy 2009-10-18 06:37:59

1

你看看到unbind方法?

我沒有嘗試這一點,但我想它應該像這樣工作。

$(document).ready(function(e) { 
    var defaultKeypress = $('textarea').keypress; 
    $('textarea').unbind("keypress"); 
    $('textarea').keypress(function(e) { 
     if (fieldsChanged) { 
      fieldsChanged = false; 
     } 
     else { 
      defaultKeypress(e); 
     } 

    }); 
}); 
+1

不幸的是,這並不工作。我認爲解綁只適用於從javascript代碼綁定的函數。儘管我很欣賞你的快速反應!這個問題一直困擾着我很長一段時間... – Nutzy 2009-10-17 16:34:41