2011-08-29 5 views
9

私は次のようなものを持っています:alert()の後にfocus()を与える方法?

<input type="textbox" id="partNumber" onChange="validatePart(this);"> 
<input type="textbox" id="quantity" onfocus="saveOldQuantity(this);"> 

変更が行われた後、onChangeイベントが正しく起動しています。 quantityがフォーカスを得ると、変更が行われる前にonfocusの古い値を保存するために、onfocusイベントが適切に起動しています。

validatePart()が無効なpartNumber値を検出した場合、validatePart()はそのことをユーザーに知らせます。 alert()がクリアされたら、partNumber入力にフォーカスを戻したいと思います。しかし、入力ノードでfocus()を実行しても、フォーカスが与えられていません。 IEのデバッグウィンドウのやりとりはもちろん、フォーカスを変更するので、ここではデバッグが難しいです。

validatePart()でエラーが検出された場合、どのようにしてフォーカスをpartNumberに戻すことができますか?

EDIT: validatePart()の単純なバージョン:

function validatePart(node) { 
    if (!node.value) { 
     alert('Please enter a part number.'); 
     node.focus(); // <======= why isn't this having any effect?? 
    } 
} 
+2

あなたがフォーカスを設定する前に、小さなタイムアウトを試してみてもらえますか? – pimvdb

+0

をそれはフォーカスが、ユーザーがクリックしたか、タブで選択しているどこに行く。画面が凍結されることはありません。私は何とかトンをキャンセルする必要がありますフォーカスを「partNumber」に戻すようにオーバーライドします。 –

+0

ユーザーが別のタブを選択できないかどうかはわかりません。私は個人的にそれも好きではないでしょう。 – pimvdb

答えて

18

小さなタイムアウトを追加し、トリックを行う必要がありますバックpartNumberテキストボックスにフォーカスをリセットします。単にリターンが戻ってpartNumberテキストボックス(も、あなたのタブもオフの場合に焦点を当てる関係なくpartNumberテキストボックスに入力されているものと、正常alertを発射しない

function validatePart(node) { 
    if (!node.value) { 
     alert('Please enter a part number.'); 
     setTimeout(function(){node.focus();}, 1); 
    } 
} 

Here's a quick "live" example

このように、あなたのvalidatePart()機能は次のようになりquantityテキストボックスに。

+1

'setTimeout'に文字列を渡さないでください(' eval'dを取得します)、関数を渡します。 'のsetTimeout(関数(){のdocument.getElementById( "partNumberも")(フォーカス);}、1);' –

+0

@Rocket - あなたは正しいです。私は、実行前に 'eval'dする必要がある文字列ではなく、関数を' setTimeout'関数に渡すことによって、より技術的に正しいバージョンを反映するように答えました。 – CraigTP

+0

@CraigTP:1ミリ秒のタイムアウトが私のために働いた。ところで、私は最初のパラメータとして汎用の 'function()'を使用しました。ありがとう! –

2

あなたのコードは私のために期待どおりに動作するようです。このfiddleを参照してください。あなたは他の行動をしていますか?私はtextbox1に数字を入力することがわかります。その後、私がテキストボックス2にタブオーバーすると、私はInvalid Part!エラーを表示し、フォーカスは現在のテキストボックスにとどまります。

更新 - これはChromeでうまくいくように見えますが、エラーが存在するかどうかを追跡できます。そうなら、それを処理してください。

var error = null; 
function checkForErrors() { 
    if (error) { error.focus(); error = null; }    
} 

function validatePart(node) { 
    if (badpart) { error = node; } 
} 

function saveOldQuantity(node) { 
    checkForErrors(); 
} 
+0

これはIE9またはFFでは動作しないようです。 Chromeで正常に動作します。もう少し見えます。 – mrtsherman

+0

@Jonathan M - settimeout以外の回答で私の答えを更新しました。私はいつもそれらを避けようとします。私はそれがちょうど 'node.focus()'のようにエレガントになることを望みますが、イベントは間違った順序で再生されて動作します。 – mrtsherman

+0

イベントの順序が問題であれば、 'saveOldQuantity'は' validatePart'が 'error'を割り当てる前に' checkForErrors'を呼び出せませんか? –

関連する問題