我有一个输入和一个按钮。当我从输入模糊并且输入已更改时,应调用price()函数。此外,当我单击按钮时,应调用price()函数。
问题是当用户修改输入值并单击按钮时,会调用price()函数两次。我不希望这种情况发生。
我尝试了老式的方法,在输入时检查是否未设置变量“inPriceFunction”为true。这没有用,因为两个事件(模糊和点击)在完全相同的时间内执行,if和变量集没有时间发生。
我该如何避免?
我尝试过:
<div>
<input type=text onchange="price();" />
</div>
<button onclick="price();" />test</button>
<script>
called = 0;
function price() {
if(called == true){
return;
} else {
called = true;
}
console.log("called");
called=false;
}
</script>
答案 0 :(得分:3)
Underscore让您满意:http://underscorejs.org/#throttle
throttle
将阻止您的函数在a中被调用两次
指定的时间长度。 once
会阻止您的函数被调用两次。答案 1 :(得分:1)
点击和更改事件不会同时发生。他们一个接一个地发生。
called = true
,然后执行console.log("called");
并再次设置called=false
。called == false
,因此它设置called = true;
,然后执行console.log("called");
并再次设置called=false
。答案 2 :(得分:1)
这是一个将完成这项工作的jsfiddle。当然,您不应该使用全局变量:
var clicktimer = null;
function clickfunc() {
var BLOCK_TIME = 500;
function handleclick() {
console.log("Pressed!");
}
if (clicktimer) {
console.log("Skipping handling of click!");
} else {
handleclick();
clicktimer = setTimeout(function() {
clicktimer = null;
}, BLOCK_TIME);
}
}
答案 3 :(得分:0)
添加超时,类似这样的
function schedludePrice() {
if(myTimeOut){
clearTimeout(myTimeOut);
}
myTimeOut = setTimeout('price()', 10);
}
这样,如果函数在模糊和点击事件的短时间内被调用两次,价格函数只会被调用一次。
答案 4 :(得分:0)
最简单的处理方式可能是在调用Price时存储日期时间并使用它来检查它是否最近被调用过。
if (refDate > new Date(10000 + (new Date())) { // 1 second delay?
return;
}
refDate = new Date();
对Date的两次调用可能会返回完全相同的日期(因此不需要日期操作)。