Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/404.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/6/ant/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 设置onClick会导致无限循环_Javascript - Fatal编程技术网

Javascript 设置onClick会导致无限循环

Javascript 设置onClick会导致无限循环,javascript,Javascript,我用右上角的挂锁图标锁定了页面的某些部分。这将更新数据库,图标将从打开的锁更改为关闭的锁。我希望现在使用相同的图标解锁相同的数据。我试图做的是每次单击onclick函数时将其从lockRun()更改为unlockRun()。但现在发生的事情是,不仅是设置onclick,而且还执行click,所以它只是不断地从锁定变为解锁,这不是我想要的!下面是执行此循环的代码 function lockRun(runNum) { var lockID = 'Lock' + runNum; var run

我用右上角的挂锁图标锁定了页面的某些部分。这将更新数据库,图标将从打开的锁更改为关闭的锁。我希望现在使用相同的图标解锁相同的数据。我试图做的是每次单击onclick函数时将其从lockRun()更改为unlockRun()。但现在发生的事情是,不仅是设置onclick,而且还执行click,所以它只是不断地从锁定变为解锁,这不是我想要的!下面是执行此循环的代码

function lockRun(runNum) {
  var lockID = 'Lock' + runNum;
  var runID = 'Run' + runNum;
  var runIDCode = document.getElementById(lockID).dataset.runid;
  console.log(runIDCode);
  $.ajax({
    url: '/runs/lock',
    type: 'POST',
    data: {
      runCode: runIDCode
    }
  }).done(function (response) {
    //console.log(siblings[1].dataset.contno);
    var dbResponse = JSON.parse(response);
    document.getElementById(lockID).classList.remove("fa-lock-open");
    document.getElementById(lockID).classList.add("fa-lock");
    document.getElementById(runID).classList.add('locked');
    document.getElementById(lockID).onclick = unlockRun(runNum);
  });
}

function unlockRun(runNum) {
  var lockID = 'Lock' + runNum;
  var runID = 'Run' + runNum;
  var runIDCode = document.getElementById(lockID).dataset.runid;
  console.log(runIDCode);
  $.ajax({
    url: '/runs/unlock',
    type: 'POST',
    data: {
      runCode: runIDCode
    }
  }).done(function (response) {
    //console.log(siblings[1].dataset.contno);
    var dbResponse = JSON.parse(response);
    document.getElementById(lockID).classList.remove("fa-lock");
    document.getElementById(lockID).classList.add("fa-lock-open");
    document.getElementById(runID).classList.remove('locked');
    document.getElementById(lockID).onclick = lockRun(runNum);
  });
}

因此,一旦单击挂锁图标,它将立即执行解锁功能,然后重复执行锁定功能。

您的问题在这一行-

document.getElementById(lockID).onclick=unlockRun(runNum)

您正在将
onclick
设置为该函数返回的值,而不是函数本身。通过使用带有
(参数)
的函数,您可以立即调用它,而不是将其传递给以后调用

有一种方法可以解决这个问题-使用闭包:

document.getElementById(lockID).onclick=function(){
解锁运行(runNum)
};

有关这方面的更多信息,请参阅

编辑:


正如@get off my lawn在一篇评论中指出的那样,同样的策略需要应用于设置了
onclick
的两个地方。

您的问题就在这一行-

document.getElementById(lockID).onclick=unlockRun(runNum)

您正在将
onclick
设置为该函数返回的值,而不是函数本身。通过使用带有
(参数)
的函数,您可以立即调用它,而不是将其传递给以后调用

有一种方法可以解决这个问题-使用闭包:

document.getElementById(lockID).onclick=function(){
解锁运行(runNum)
};

有关这方面的更多信息,请参阅

编辑:


正如@get off my lawn在一篇评论中指出的,同样的策略需要应用于设置了
onclick
的两个地方。

我建议根据“锁定”和“解锁”的类使用两种不同的绑定。这样你就不必重新绑定东西了。我建议根据“locked”和“unlocked”的类使用两种不同的绑定。这样你就不必重新绑定东西了。我认为这是因为两个函数都在互相调用。所以你需要对两个函数都这样做Shello Rose谢谢你的回答它解决了问题。我感谢你的帮助!我会在允许的情况下尽快接受答案。谢谢@GetOffMyLawn我刚刚更新了我的答案,这样以后阅读的人都会非常清楚:)我想这是因为两个函数都在互相调用。所以你需要对两个函数都这样做Shello Rose谢谢你的回答它解决了问题。我感谢你的帮助!我会在允许的情况下尽快接受答案。谢谢@GetOffMyLawn我刚刚更新了我的答案,让以后阅读的人都非常清楚:)