2011-12-22 10 views
3

誰かが非常に必死で疲れた初心者を助けてください。私はどこでも答えを探したが役に立たなかった。javascript event.keyCodeは、FireFox 3.6.25のkeydown、keypress、keyupイベントでは機能しません。

Enterキーが押されたかどうかをテストするためにkeyCode/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

'event'ではなく、' evt'という名前のパラメータが指定されているため、何も動作しません。あなたのコードでは、 'window.event'と' event'はどちらもFirefoxには存在しない 'window.event'を参照しています。イベントを正規化するには、まず 'var event = window.event ||イベント; '。最新のFirefoxは '3.6 'ではなく' 9'である。また、インラインイベントハンドラから関数を呼び出すときに、そのオブジェクトにアクセスするには 'event'オブジェクトを渡す必要があります。 –

+0

"onfoo"ハンドラ文字列の先頭に "javascript:"は必要ありません。 – Pointy

+0

@FelixKlingあなたは伝説です!私は今、 'イベント'に合格し、私のdodgyコードとその作業を完璧に仕分けしました - Firefox 9のバージョンにアップグレードしたことは言うまでもありません(古いバージョンをどのようにインストールできたかわかりません)! – Dougie

答えて

4

パラメータevtの名前はeventではないため、何も機能しません。あなたのコードでは、window.eventeventはどちらもFirefoxには存在しないwindow.eventを指しています。

あなたは

var event = evt || window.event; 

又はevtからeventにパラメータの名前を変更(そして上記varをドロップ)を使用して、例えば、最初のイベントを正規化すべきです。

インラインイベントハンドラから関数を呼び出すときには、そのオブジェクトにアクセスする必要があります。

+0

あなたは答えを知っている(そして、私の無知をもう少し長く気にすることができます)場合は、すぐに関連する質問です。 returnValueとpreventDefaultは、FFを除くすべてのブラウザでEnterキーを押すと、デフォルトのアクションを停止します。 stopPropagationを追加するとFFで動作するが、cancelBubbleと同様に追加されているが、フォームの検証機能が動作しなくなることはないようだ。何か案は? :S – Dougie

+0

実際に 'event.stopPropagation()'を呼び出すことは有効です。 'event'オブジェクトがあなたの' testForEnter'関数で利用可能であることを確認してください。現在はそうではありません。また、コードをデバッグするためにFirebugをインストールすることをお勧めします。あなたのコードがエラーを投げたときにコンソールに表示されます。 –

2

これは私が今持っていると、それはすべての5つの主要なブラウザで完全に動作するコードです:

次のように私は今、関数を呼び出す:

<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; 

を使用してみてください。

関連する問題