代码之家  ›  专栏  ›  技术社区  ›  AKAust

设置onclick会导致无限循环

  •  0
  • AKAust  · 技术社区  · 6 年前

    我在页面的某些部分使用右上角的挂锁图标锁定。这将更新数据库,并且图标从打开的锁更改为关闭的锁。我希望现在使用相同的图标来解锁相同的数据。我要做的是每次单击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);
      });
    }
    

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

    1 回复  |  直到 6 年前
        1
  •  4
  •   Rose Robertson    6 年前

    你的问题在这一行-

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

    你正在设置 onclick 不管是什么功能 returns 不是函数本身。通过 (argument) 您正在立即调用它,而不是将其传递给以后调用。

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

    document.getElementById(lockID).onclick = function () { unlockRun(runNum) };

    Passing a function with parameters as a parameter? 关于这方面的更多信息。

    编辑:

    正如@get off my lawn在评论中所指出的,同样的策略需要应用于两个地方 点击 正在被设定。