我遇到同样的问题: how to stop "setInterval"
但是当我在setInterval中加载时它不起作用, 这就是test.php里面的内容:
<div id="refresh">
<textarea></textarea>
</div>
<script src="jquery.js"></script>
<script>
$(function () {
var timerId = 0;
$('textarea').focus(function () {
clearInterval(timerId);
});
$('textarea').blur(function () {
timerId = setInterval(function () {
$('#refresh').load('test.php #refresh');
}, 1000);
});
});
</script>
答案 0 :(得分:2)
问题在于,您的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);
});
});
请注意,此更改还表示<{1}} textarea
中只有#refresh
元素获取事件,而使用原始代码时, all <页面上的/ em> div
元素得到了它。