只有 运行 一个 JavaScript 功能,如果它在一定时间后没有再次 运行
Only run a JavaScript function if it is not run again after a set amount of time
我有一个控制元素状态变化非常快的输入。这会导致该元素随着它的一部分发生变化而闪烁。
我正在尝试存储这些状态变化,然后在设定的时间(任意 500 毫秒)内没有任何变化来改变状态。
我已尝试使用超时解决此问题,如下面的代码所示(与 fiddle 中的代码相同):
var changingToHappy = false;
// Original no attempts to fix functions.
//var ifHappy = function () {
// $("#face").text(':)');
//};
//
//var ifNotHappy = function () {
// $("#face").text(':(');
//};
var ifHappy = function () {
changingToHappy = true;
setTimeout(function () {
if (changingToHappy) {
$("#face").text(':)');
}
}, 500);
};
var ifNotHappy = function () {
changingToHappy = false;
setTimeout(function () {
if (!changingToHappy) {
$("#face").text(':(');
}
}, 500);
};
$("#textBox").keypress(
function (event) {
if (event.which == 49) {
ifHappy();
$("#flickerFace").text(':)');
}
if (event.which == 50) {
ifNotHappy();
$("#flickerFace").text(':(');
}
}
);
如果您在 fiddle 中快速按 1、2、1、2 等,面部将暂时不闪烁,然后超时将赶上并开始改变状态。
这个fiddlehttp://jsfiddle.net/9w70wxgz/4/模拟了这个问题
澄清一下,如果在设定的时间内没有任何尝试改变其状态,我只希望面部发生变化。
您正在寻找的是去抖动函数,这是一个包含您的一段代码的示例(您快完成了):
//storage for timer
var notHappyTimer;
var ifNotHappy = function () {
changingToHappy = false;
//removes timer if event fires in less than 500ms
clearTimeout(notHappyTimer);
//resets it to attempt again in 500ms
notHappyTimer = setTimeout(function () {
if (!changingToHappy) {
$("#face").text(':(');
}
}, 500);
};
如您所见,您只需将超时分配给一个变量,该变量会在每次触发函数时自行清除,然后再次启动计时器。这确保只有在函数未在 500 毫秒内被触发时才会发生文本更改。
我有一个控制元素状态变化非常快的输入。这会导致该元素随着它的一部分发生变化而闪烁。
我正在尝试存储这些状态变化,然后在设定的时间(任意 500 毫秒)内没有任何变化来改变状态。
我已尝试使用超时解决此问题,如下面的代码所示(与 fiddle 中的代码相同):
var changingToHappy = false;
// Original no attempts to fix functions.
//var ifHappy = function () {
// $("#face").text(':)');
//};
//
//var ifNotHappy = function () {
// $("#face").text(':(');
//};
var ifHappy = function () {
changingToHappy = true;
setTimeout(function () {
if (changingToHappy) {
$("#face").text(':)');
}
}, 500);
};
var ifNotHappy = function () {
changingToHappy = false;
setTimeout(function () {
if (!changingToHappy) {
$("#face").text(':(');
}
}, 500);
};
$("#textBox").keypress(
function (event) {
if (event.which == 49) {
ifHappy();
$("#flickerFace").text(':)');
}
if (event.which == 50) {
ifNotHappy();
$("#flickerFace").text(':(');
}
}
);
如果您在 fiddle 中快速按 1、2、1、2 等,面部将暂时不闪烁,然后超时将赶上并开始改变状态。
这个fiddlehttp://jsfiddle.net/9w70wxgz/4/模拟了这个问题
澄清一下,如果在设定的时间内没有任何尝试改变其状态,我只希望面部发生变化。
您正在寻找的是去抖动函数,这是一个包含您的一段代码的示例(您快完成了):
//storage for timer
var notHappyTimer;
var ifNotHappy = function () {
changingToHappy = false;
//removes timer if event fires in less than 500ms
clearTimeout(notHappyTimer);
//resets it to attempt again in 500ms
notHappyTimer = setTimeout(function () {
if (!changingToHappy) {
$("#face").text(':(');
}
}, 500);
};
如您所见,您只需将超时分配给一个变量,该变量会在每次触发函数时自行清除,然后再次启动计时器。这确保只有在函数未在 500 毫秒内被触发时才会发生文本更改。