2011-12-22 66 views
3

請人幫助一個非常絕望和疲倦的新手。我到處尋找答案,但無濟於事。的JavaScript event.keyCode不上的keydown,按鍵或KEYUP事件在Firefox 3.6.25工作

我想捕捉鍵代碼/則charCode測試回車鍵是否被按下(我一直在使用的keydown,但我不是隻要我得到的東西的工作大驚小怪)。我已經嘗試了所有可以想到的解決方案,並且在IE,Safari,Chrome和Opera中運行正常,但是不支持FireFox 3.6.25(最新版本)?我知道事件肯定是觸發的,因爲我可以從我調用的函數中顯示一個簡單的警告框,但是爲了聲明一個變量來保存event.keyCode的內容,完全是另一回事!

我窗體的代碼基本上是...

<form method="post" name="giftaidform" onsubmit="javascript:return validateForm();" action="../scripts/form-to-email.php"> 
<table width="500" border="0" align="center" cellpadding="5" cellspacing="0"> 
    <tr> 
    <td width="180" align="right">Forename:</td> 
    <td align="left"><input name="forename" type="text" size="30" maxlength="30" onfocus="javascript:setUnchecked(this);" onkeydown="javascript:testForEnter(this);" onblur="javascript:isValidName(this);"></td> 
    </tr> 

等等...

至於我的 「testForEnter」 功能...

function testForEnter(obj) { 
// store code of key that was pressed 
var keyCode = obj.keyCode; 
alert(keyCode); 
// if the enter key was pressed then prevent default action 
if (keyCode == 13) { 
    if(event.preventDefault) event.preventDefault(); 
    event.returnValue = false; 
} 
} 

我有嘗試過各種其他的配方,包括obj.charCode和下面的東西?!

function checkKey(evt) { 
    var keyID = (window.event) ? window.event.keyCode : event.which; 
    alert(keyID); 
} 

在FireFox中什麼都不起作用!

+1

沒有什麼工作,因爲你指定的參數'evt'而不是'event'。在你的代碼中,'window.event'和'event'都指的是'window.event',它在Firefox中不存在。你應該首先使用'var event = window.event ||來規範事件事件;'。最新的Firefox是'9',而不是'3.6'。還要注意,當你從你的內聯事件處理函數調用一個函數時,如果你想訪問它,你必須傳遞'event'對象給它。 – 2011-12-22 22:59:33

+0

您在「onfoo」處理程序字符串的開頭不需要「javascript:」。 – Pointy 2011-12-22 23:00:21

+0

@FelixKling你是一個傳奇!我現在已經通過了'事件'並整理出了我的狡猾代碼和完美的工作 - 更不用說升級到了Firefox 9的版本(不知道我是如何安裝舊版本的)! – Dougie 2011-12-22 23:19:45

回答

4

沒有什麼工作,因爲你指定的參數evt而不是event。在您的代碼中,window.eventevent都指的是window.event,這在Firefox中不存在。

您應該使用

var event = evt || window.event; 

第一正常化的情況下,例如從或evt參數重命名爲event(和然後放下上述var)。

還要注意的是,當你從內聯事件處理程序調用的函數,你必須將事件對象傳遞給它,如果你要訪問它。

+0

只是一個快速相關的問題,如果你知道答案(並可以沉迷我的無知片刻更長時間)。 returnValue和preventDefault確實停止除FF之外的所有瀏覽器中的Enter鍵的默認操作。我讀過添加stopPropagation的工作FF,但已添加它以及cancelBubble但它似乎並沒有停止表單驗證功能運行。有任何想法嗎? :S – Dougie 2011-12-23 00:30:57

+0

調用'event.stopPropagation()'確實可以工作。確保''event'對象在'testForEnter'函數中可用,但目前不是。我也建議安裝Firebug來調試你的代碼。當你的代碼拋出一個錯誤時,你會在控制檯上看到。 – 2011-12-23 00:34:56

2

這是我現在的代碼,它是完全運行在所有五個主要的瀏覽器:

我現在所說的功能如下:

<input name="forename" type="text" size="30" maxlength="30" onkeydown="testForEnter(this,event);" onblur="isValidName(this);"> 

我的功能如下:

// testForEnter() disables the enter keypress on all form objects except for submit button 
// this function works in IE, chrome, safari, opera and firefox 
function testForEnter(obj,evt) { 
    var keyCode = evt.keyCode; 
    var objType = obj.type; 
    if ((keyCode == 13) && (objType != "submit")) { 
     evt.returnValue = false; 
     evt.stopPropagation(); // this line added for firefox 
     if(evt.preventDefault) evt.preventDefault(); 
} 
} //end of testForEnter() 

希望這有助於別人!

1

使用

var keycode = evt.charCode; 

似乎在這兩種瀏覽器工作的嘗試。