Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/384.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/arduino/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 两个调用同一函数的dom事件如果同时发生,则只应调用该函数一次_Javascript - Fatal编程技术网

Javascript 两个调用同一函数的dom事件如果同时发生,则只应调用该函数一次

Javascript 两个调用同一函数的dom事件如果同时发生,则只应调用该函数一次,javascript,Javascript,我有一个输入和一个按钮。当我从输入中模糊并且输入已更改时,应该调用price()函数。另外,当我单击按钮时,应该调用price()函数 问题在于,当用户修改输入值并单击按钮时,price()函数会被调用两次。我不想发生这种事 我尝试了老式的方法,在输入时将变量“inPriceFunction”设置为true,并在输入前检查它是否未设置。这不起作用,因为两个事件(模糊和单击)是在完全相同的时间执行的,if和变量集没有时间发生 我怎样才能避免呢 我所尝试的: <div> <

我有一个输入和一个按钮。当我从输入中模糊并且输入已更改时,应该调用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;
函数价格(){
if(调用==true){
返回;
}否则{
调用=真;
}
控制台日志(“调用”);
调用=错误;
}

添加一个超时,类似这样

function schedludePrice() {

   if(myTimeOut){
      clearTimeout(myTimeOut);
   }
   myTimeOut = setTimeout('price()', 10);

}

这样,如果函数在短时间内被blur and click事件调用两次,则Price函数将只被调用一次。

最简单的处理方法可能是在调用Inver Price时存储一个日期时间,并使用它检查是否最近调用过

if (refDate > new Date(10000 + (new Date())) { // 1  second delay?
    return;
}

refDate = new Date();

但是,两个对Date的调用很可能返回完全相同的日期(因此不需要进行日期操作)。

单击并更改事件不会同时发生。它们一个接一个地发生

  • 首先,触发“change”事件,设置
    called=true
    ,然后执行
    console.log(“called”)
    并再次设置
    called=false
  • 然后,触发“click”事件,但是
    called==false
    ,因此它设置
    called=trueconsole.log(“调用”)
    并再次设置
    called=false

    • 这里有一个JSFIDLE可以完成这项工作。当然,您不应该使用全局变量:


      您已经介绍了:

      • throttle
        将防止您的函数在同一时间内被调用两次 指定的时间长度
      • 一次
        将阻止函数被调用两次

      JavaScript是单线程的,因此不能同时执行。您能否分享一些代码,说明如何调用此函数以及函数的外观?因为@eaterofcasters说,你不能同时调用同一个函数。模糊和点击事件会一个接一个地发出。price()函数的作用是什么?它是否会改变一种状态,意味着如果你两次调用它就会出现问题,或者你只是想避免某些东西被渲染两次?如果您只想先调用它,然后设置一个类似“priceFunctionHasBeenCalled”的标志,在另一种情况下使用缓冲超时。在您的示例中,似乎在方法退出之前called总是设置为false。这只会使它更复杂。我正在尝试这样做。谢谢。这是最直截了当的回答。
      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);
          }
      }