javascript - 设置 onClick 导致无限循环

标签 javascript

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

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 设置为该函数返回的任何内容,而不是函数本身。通过使用带有 (argument) 的函数,您可以立即调用它,而不是传递它以供稍后调用。

这是解决这个问题的一种方法 - 使用闭包:

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

参见Passing a function with parameters as a parameter?有关此内容的更多信息。

编辑:

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

关于javascript - 设置 onClick 导致无限循环,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52503345/

相关文章:

javascript - 如何正确重新加载 webapp 缓存文件?

javascript - 在缩放的 div 中设置 div 鼠标坐标

javascript - 传递给 history.pushState 的状态对象是什么,它有什么作用?

javascript - IE11 javascript 屏幕分辨率

javascript - 计算一个 div 中的 div 数量,在一页 wordpress 帖子上有多个父 div

javascript - 从页面检索 CSS 而不重新加载它

javascript - Chrome 控制台将对象属性显示为未定义

javascript - 如何循环firebase的异步查询代码?

Javascript:比较由 javascript 设置的 backgroundColor

javascript - 从 Javascript 到 MySQL 的正则表达式