قم بتشغيل الوظيفة مرة واحدة لكل انفجار حدث باستخدام jQuery
-
11-09-2019 - |
سؤال
أنا أستخدم jQuery للاستماع إلى حدث DOMSubtreeModified، ثم تنفيذ دالة.ما أحتاجه هو طريقة لتشغيل وظيفة مرة واحدة فقط لكل انفجار حدث.لذلك في هذه الحالة، سيتم تشغيل الحدث بعد ثانية واحدة فقط، ومرة أخرى بعد 3 ثوانٍ.ما هي أفضل طريقة للقيام بذلك؟
مسج
$(function(){
setTimeout(function(){
$('#container')[0].innerHTML = 'test';
$('#container')[0].innerHTML = 'test';
$('#container')[0].innerHTML = 'test';
$('#container')[0].innerHTML = 'test';
$('#container')[0].innerHTML = 'test';
$('#container')[0].innerHTML = 'test';
},1000);
setTimeout(function(){
$('#container')[0].innerHTML = 'test';
$('#container')[0].innerHTML = 'test';
$('#container')[0].innerHTML = 'test';
$('#container')[0].innerHTML = 'test';
$('#container')[0].innerHTML = 'test';
$('#container')[0].innerHTML = 'test';
},3000);
$('#container').bind('DOMSubtreeModified',function(){
console.log('event');
functionToRun();
});
});
لغة البرمجة
<div id="container"></div>
تحديث
وظيفة setTimeout موجودة فقط لمحاكاة مشكلتي.أحتاج إلى حل دون تغيير رمز setTimeout.المشكلة التي أواجهها هي أنني أحصل على سلسلة من أحداث DOMSubtreeModified، وأحتاج إلى الحصول على حدث واحد فقط لكل سلسلة.
المحلول 2
حلها بنفسي.
$(function(){
setTimeout(function(){
$('#container')[0].innerHTML = 'test';
$('#container')[0].innerHTML = 'test';
$('#container')[0].innerHTML = 'test';
$('#container')[0].innerHTML = 'test';
$('#container')[0].innerHTML = 'test';
$('#container')[0].innerHTML = 'test';
},1000);
setTimeout(function(){
$('#container')[0].innerHTML = 'test';
$('#container')[0].innerHTML = 'test';
$('#container')[0].innerHTML = 'test';
$('#container')[0].innerHTML = 'test';
$('#container')[0].innerHTML = 'test';
$('#container')[0].innerHTML = 'test';
},1100);
setTimeout(function(){
$('#container')[0].innerHTML = 'test';
$('#container')[0].innerHTML = 'test';
$('#container')[0].innerHTML = 'test';
$('#container')[0].innerHTML = 'test';
$('#container')[0].innerHTML = 'test';
$('#container')[0].innerHTML = 'test';
},3000);
addDivListener();
});
function addDivListener() {
$('#container').bind('DOMSubtreeModified',function(){
functionToRun();
$(this).unbind('DOMSubtreeModified');
setTimeout(addDivListener,10);
});
}
function functionToRun(){
console.log('event');
}
هذا يطبع حدث 3 مرات في وحدة تحكم Firebug، وبدقة تصل إلى 100 مللي ثانية.
نصائح أخرى
طريقة بديلة، والتي سوف تتحكم في معدل أي وظيفة.
// Control the call rate of a function.
// Note that this version makes no attempt to handle parameters
// It always induces a delay, which makes the state tracking much easier.
// This makes it only useful for small time periods, however.
// Just clearing a flag after the timeout won't work, because we want
// to do the the routine at least once if was called during the wait period.
throttle = function(call, timeout) {
var my = function() {
if (!my.handle) {
my.handle = setTimeout(my.rightNow, timeout);
}
};
my.rightNow = function() {
if (my.handle) {
clearTimeout(my.handle);
my.handle = null;
}
call();
};
return my;
};
جرب استخدام one()
معالج
يبدو أن هذا هو ما تبحث عنه:
$(
function()
{
setTimeout
(
StartWatching,
1000
);
}
);
function StartWatching()
{
$('#container')
.bind(
'DOMSubtreeModified',
function()
{
console.log('event');
StopWatchingAndStartAgainLater();
}
);
}
function StopWatching()
{
$('#container')
.unbind('DOMSubtreeModified');
}
function StopWatchingAndStartAgainLater()
{
StopWatching();
setTimeout
(
StartWatching,
3000
);
}
وهذا يفرض التدفق التالي:
Document.Ready
Create DOM watching event after one second
On event, turn off event and recreate it after three seconds, rinse, repeat
لا تنتمي إلى StackOverflow