2009-09-30 30 views
0

下面的代碼適用於IE,但不適用於FireFox。在FireFox中輸入關鍵陷阱事件

我沒有成功嘗試下面鏈接中提出的所有解決方案。

當按下ENTER時調用函數。如果放置在功能的第一行,警報會觸發。但是,首先如果語句沒有處理。

通過以下方式調用onKeyPress =「javascript:isEnter();」在控制標記。

function isEnter(evnt) { 
    evnt = (evnt) ? evnt : ((event) ? event : null); 
     if (evnt) { 

      var charCode = (evnt.charCode || evnt.charCode == 0) ? evnt.charCode : ((evnt.keyCode) ? evnt.keyCode : evnt.which); 
      if (charCode == 13) { 
       //do stuff 
      } 
     } 
    } 

link text

回答

2

感謝所有。

我從另一個來源得到這個。它解決了這個問題,看起來非常接近上面的答案,但是跳過了if(evnt)部分。

如上所述,有必要使用:onkeypress =「isEnter(event);」

function isEnter(e) { 
    e = e || window.event || {}; 
    var charCode = e.charCode || e.keyCode || e.which; 
     if (charCode == 13) { 
      // do stuff 
     } 

} 
+1

在你從一個屬性傳遞事件的情況下,你不需要第一行。它在那裏處理IE的情況,但函數調用屬性onkeypress =「isEnter(event);」已經這樣做了。 – 2009-10-02 08:38:06

0

您的代碼較爲混亂,你需要的是:

功能的第一線:evnt = evnt || window.event; 這將做同樣的事情。

接下來,中charCode行:charCode = evnt.charCode || event.keyCode || event.which; 這實際上不是你的,因爲(evnt.charCode || event.charCode == 0)總是還真更好地工作。當xnullundefined""0

x == 0將返回true。

現在,如果我記得我的HTML事件,我認爲你的javascript:isEnter()函數應該看起來更像這樣:isEnter(event)。您的代碼不會將事件傳遞給某些瀏覽器(例如Firefox)上的功能。

所以,這裏是我們所擁有的:

onKeyPress="isEnter(event)" 

function isEnter(e) { 
    e = e || window.event; 
    if (e) { 
     var charCode = e.charCode || evnt.keyCode || evnt.which; 
     if (charCode == 13) { 
      //do stuff 
     } 
    } 
} 

我不記得,如果這對獲得中charCode的最佳方式,但JavaScript庫像原型,jQuery的,道場,將抽象的很多這些瀏覽器如果你想看看其中之一的差異。乾杯。

2

onKeyPress="javascript:isEnter();"是錯誤的,原因有兩個:首先,您不應該有javascript:前綴,因爲鍵處理程序屬性的全部內容都是作爲JavaScript處理的。這不會妨礙您的代碼工作,因爲javascript:前綴被解釋爲標籤。什麼是阻止它工作的事實是你沒有將一個事件對象傳遞給isEnter函數。你onkeypress屬性應該是

onkeypress="isEnter(event);" 

這應該在大多數瀏覽器。原因是事件處理程序屬性的值作爲傳遞名爲event的參數的函數的主體。在IE event而不是解析爲window.event,從而使這種方法在大多數瀏覽器中工作。

你也可以簡化您的功能如下:

function isEnter(evnt) { 
    if (evnt) 
     var charCode = evnt.keyCode || evnt.which; 
     if (charCode == 13) { 
      //do stuff 
     } 
    } 
} 
0

您可以擴展事件:

jQuery.Event.prototype.isEnter = function() { 
    return this.which == 13; 
} 

然後使用

e.isEnter(); 

注意:如果你不使用jQuery,只是去掉了 「jQuery的。」從上面的代碼。

你可以讓它變得更好:

$(function(){ 
    $("input:text").keydown(function(e) { 
    if (e.isEnter()) $(this).trigger("enterPressed", e);  
    }); 
}); 

$(function() { 
    $("#myfield").bind("enterPressed", function(e) { 
    console.log("enter pressed"); 
    }); 
}); 

測試:http://jsfiddle.net/TfE6m/

這裏沒有jQuery的:http://jsfiddle.net/zqFer/

您的擴展方法和觸發事件可以在方法單獨的文件,例如可能被稱爲events.js。 你的代碼會更乾淨!