2016-07-05 6 views
0

背景

既存します。フォームを介しpageloadで、Iはループなどなど、元の値、現在のフォーマット値、検証要件、等の検証のような方法、および特性保持それぞれについてJSオブジェクト変数の作成:は、すでに私は多くのテキスト入力(<code><input type="text" /></code>)でフォームを持っているJS要素

field = new Field(wrapperElements[i]); 

入力はblurイベントが発生したので、そのフィールドで検証を実行します。フォームを送信するときの最後まで待つのではなく、ユーザーがフォームを使用しているときに検証を実行できるように、これを行います。

次に、有効性の結果をFieldオブジェクトにキャッシュします。ユーザーがフォームを送信すると、すべてのフィールドを検証する必要はなく、計算済みの有効性をチェックするだけで、最後にスピードが向上します。


問題

ユーザーが唯一のフィールドを編集し、カーソルがそのフィールドにまだある、とユーザーのヒットが入ります。フィールドのblurイベントを発生させる前に、フォームのsubmitを起動します。フォームは、編集したフィールドを検証せずに送信を試みます。

submitにすべてのフィールドを強制的に検証することができますが、それは私にとっては魅惑的ではないようですが、無駄な計算のようです。その要素が入力であれば、現在フォーカスされている要素を強制的に検証するだけです。


パートソリューション

私はdocument.activeElementをテストしてみた、それが動作します。しかし、document.activeElementが返すノードから、入力に関連付けられている既存のJS変数を取得する方法を理解できません。


具体的な質問

私は、HTML要素を持っている、と私は

<input type="text" value="My input!" id="mainInput" /> 
--- 
var field = document.getElementById('mainInput'); 

は...どうやって入手することができます...そのようにしてJS変数を作成する場合は、その field変数 document.activeElement経由で別途ノードを返すことを知っているからでしょうか?

+0

複数のフィールドが必要な場合、この回答のコードを使用して入力時に送信しないようにすると、問題が解決すると思います。http://stackoverflow.com/questions/16062525/disable-enter-submit – Cruiser

+0

I Fieldオブジェクトをループして有効性をチェックするので、すでにevent.preventDefault()を使用しています。私はpageloadでそれらすべての妥当性を計算する必要はありません、私はバックグラウンドで、最終的に遅れを避けるために起こるようにそれを計算したいと思います。私は、HTML変数とともにFieldオブジェクトに妥当性をキャッシュします。フィールドは実際には '{data:{}、el:{}、validation:{} ...}'、およびいくつかの添付メソッドです。 –

+0

私が言っていることは、あなたがフィールドを必要としていて、ユーザーがsubmitの入力を押すことができない場合、.blurバリデート関数を強制的に起動させることです。 – Cruiser

答えて

1

Javascriptを使用すると、==または===コンパレータを使用してHTMLElement変数と比較することができます。したがって、保存された変数をループして、document.activeElementと比較することができます。

... 
fields[i] = form.children[i] 
... 

for (...) { 
    if (fields[i] == document.activeElement) { 
     // force validation of fields[i] 
    } 
} 

これは、保存された要素に対してアクティブな要素をチェックします。ここで問題となるのは、パフォーマンスです。要素数が多い場合は、要素をループするのに少し時間がかかることがあります。

もう1つの選択肢は、ページロード中に気になる場合は、要素に格納されている変数を参照できる整数型のデータ属性を追加することです。

... 
fields[i] = form.children[i] 
fields[i].dataset.interator = i; 
... 


var iterator = document.activeElement.dataset.iterator; 
// force validation of fields[iterator]; 

これはループを回避し、少し時間がかかります。あなたは50フィールド未満がある場合でも、どちらか目立つことはありません。

+0

私はこれを試して、どんなタイプのパフォーマンスがそれをもたらすのか見てみましょう。この質問を投稿して以来私が考えてきたもう1つの選択肢は、Fieldの作成中です.HTML input要素に、保持しているFieldオブジェクトのグローバル配列に対応する数値をタグ付けします。それで、私は 'dataset-fieldlocation'をつかんで' self.fields [NUMBER] 'に接続するだけです。両方のテスト。 –

+0

それは動作します!グローバルなField Tracking Arrayをループし、 'field.el.input == document.activeElement'が存在するかどうかを調べて、もしそうなら、フォームを処理する前にフィールドの再検証を強制しました。後で読者が分かりやすくするために答えを編集してもよろしいですか? –

+0

それは素晴らしいです!必要なものを編集してください:) – Mako

関連する問題