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