問題は、load
呼び出しが を破棄して再作成しtextarea
、イベント ハンドラーが新しい にアタッチされないことtextarea
です。アタッチしているハンドラーは、新しい置換ではなく、元のハンドラーにのみアタッチされます。
jQuery は確実blur
にバブリングするためfocus
(すべてのブラウザーでネイティブにバブリングするわけではありませんが)、イベント委任で解決できます。
$(function () {
var timerId = 0;
$('#refresh').on('focus', 'textarea', function () {
clearInterval(timerId);
});
$('#refresh').on('blur', 'textarea', function () {
timerId = setInterval(function () {
$('#refresh').load('test.php #refresh');
}, 1000);
});
});
これにより、要素のイベントがフックされますが#refresh
、イベントがその子孫で発生した場合にのみハンドラーが起動されますtextarea
。
refresh
または、繰り返し検索する理由がないため:
$(function () {
var timerId = 0,
refresh = $("#refresh");
refresh.on('focus', 'textarea', function () {
clearInterval(timerId);
});
refresh.on('blur', 'textarea', function () {
timerId = setInterval(function () {
refresh.load('test.php #refresh');
}, 1000);
});
});
この変更はget イベント内のtextarea
要素のみを意味することにも注意してください。元のコードでは、ページ上のすべての要素がそれを取得していました。#refresh
div
textarea