私が思っているよりも大きな問題が何かに興味があります。
次のコードを使用して、テキスト入力フィールドのグループで「キーアップ」をリッスンしています。ユーザーが一定時間入力を停止すると、AJAX を使用してデータをコントローラーに送信します。
これを実現するために、JavaScript で OOP を試してみることにしました。これは、入力フィールドごとにタイマー メソッドの新しいインスタンスが必要だからです。(明確にするために、私はjavascriptのOOPに非常に慣れていないので、これは恐ろしいかもしれません。教えてください。)
メソッドを含むメインクラスは次のとおりです。
function FieldListener(entity){
t = this;
t.typingTimer; // Timer identifier
t.doneTypingInterval = 1000; // Time in ms. e.g.; 5000 = 5secs
t.entity = entity;
entity.bind("keyup", function(){t.setTimer();});
}
FieldListener.prototype.setTimer = function(){
t = this;
// User is still typing, so clear the timer.
clearTimeout(t.typingTimer);
// Get the field name, e.g.; 'username'
t.entityType = t.entity.attr("name");
// If the value is empty, set it to a single space.
if(!(t.val = t.entity.val())){
t.val = ' ';
}
t.noticeSpan = t.entity.siblings("span");
// Display 'waiting' notice to user.
t.noticeSpan.html('...')
t.typingTimer = setTimeout(function(){t.doneTyping();},t.doneTypingInterval);
}
FieldListener.prototype.doneTyping = function(){
// Encode for passing to ajax route.
t = this;
valueType = encodeURIComponent(t.entityType);
value = encodeURIComponent(t.val);
$.ajax({
url: '/check/'+valueType+'/'+value,
type: 'GET',
processData: false
})
.done(function(validationMessage){
t.noticeSpan.html(validationMessage);
})
.fail(function(){
t.noticeSpan.html("Something went wrong. Please try again.");
});
}
ここからは、入力フィールドごとに FieldListener クラスのオブジェクトを作成できるようにしたいと思います。
次のようにそれぞれにIDがあれば、簡単にできることがわかります。
var fieldListener = new FieldListener($("#someFieldID"));
しかし、特定のクラス名を持つすべてのフィールドを反復したいと思います。おそらくこれに近い何か?:
i = 0;
$(".info-field").each(function(){
i = new FieldListener($(this));
});
しかし、それは機能しません (そしてあまり見栄えがよくありません)。
何かご意見は?(クラス/メソッドコードに対する批評/改善にも興味があります。)
編集: @ChrisHerring の質問によると: 問題は、オブジェクトを作成しているように見えますが、 each() メソッドの最後の要素に対してのみです。したがって、クラス「.info-field」の最後の入力フィールドに関連付けられたスパンには、入力しているフィールドに関係なく、AJAX から返された validationMessage が表示されます。
アップデート:
新しいオブジェクトの作成に問題があるようです。たとえば、 each() メソッドを反復するのではなく、次のように、1 つのクラスの開始を別のクラスの開始に従って行うだけです。
var fieldListener1 = new FieldListener($("#someFieldID"));
var fieldListener2 = new FieldListener($("#someOtherFieldID"));
その fieldListener2 は、fieldListener1 の開始時に保存される変数を上書きします。これは、ID「#someFieldID」で入力フィールドに入力すると、ID「#someOtherFieldID」で入力フィールドに入力しているかのように動作することを意味します。考え?
更新#2(今のところ解決済み):
とりあえず問題は解決したようです。「t = this;」の前に「var」を追加する必要がありました FieldListener クラスで。もちろん、コメント/批評は大歓迎です。;)