Javascript无止境循环
此功能在不启动循环的情况下连续运行 setTimeout允许refreshTags函数运行 我肯定这不是最好的剧本——我不是大师——但是你知道为什么这个剧本在无休止的循环中运行吗Javascript无止境循环,javascript,infinite-loop,Javascript,Infinite Loop,此功能在不启动循环的情况下连续运行 setTimeout允许refreshTags函数运行 我肯定这不是最好的剧本——我不是大师——但是你知道为什么这个剧本在无休止的循环中运行吗 function addTag() { console.log('running'); refreshTags(); var t = document.getElementById('existingTags').textContent.match(/tag1/); var u = 'tag1'; if (t
function addTag()
{
console.log('running');
refreshTags();
var t = document.getElementById('existingTags').textContent.match(/tag1/);
var u = 'tag1';
if (t == u) {alert('This ticket has already been resolved by our team.')};
if (t != u)
{
refreshTags();
setTimeout(function()
{
document.getElementById('tagToAdd').value = 'tag1';
document.getElementById('tagSubmit').click();
alert('Ticket resolved!');
}, 2000)
};
}
编辑:代码调用下面的addTag
var resolveButton = document.createElement("a");
resolveButton.href = '#';
resolveButton.innerHTML = '<span>Resolve</span>';
resolveButton.setAttribute("onClick", "addTag()");
resolveButton.setAttribute("type", "button");
resolveButton.setAttribute("class", "button1");
var cha = document.getElementById('chatter_view');
cha.parentNode.insertBefore(resolveButton, cha);
var resolveButton=document.createElement(“a”);
resolveButton.href='#';
resolveButton.innerHTML='Resolve';
setAttribute(“onClick”,“addTag()”);
setAttribute(“类型”、“按钮”);
resolveButton.setAttribute(“类”、“按钮1”);
var cha=document.getElementById('chatter_view');
cha.parentNode.insertBefore(resolveButton,cha);
我将尝试回答一个更大的问题“如何防止和调试无限循环?”,而不是试图回答为什么这段代码有一个无限循环
我发现最好的防御方法之一是构造代码,使控制总是朝一个方向流动。这里有许多不同的层:
- onclick事件处理程序正在调用addTag()
- addTag()正在调用refreshTags()
- addTag()正在调用setTimeout,它稍后会触发对DOM的单击
resolvebuttonclick(){addTag()}
。ResolveButtonNonClick仅从resolveButton的onclick处理程序调用。这使得审核代码变得更加容易。您已经在addTag()函数的顶部放置了一个console.log('running')
。现在,如果您在resolveButtonOnclick()中放置一个console.log(),您将立即知道onclick处理程序是否包含在无限循环中
我们看不到您的代码,但是如果refreshTags()调用addTag(),您将有一个循环控制流——这些并不总是坏的,但是您需要特别小心,它们会在某个点终止
您可能拥有的最大循环控制流是addTag()使用.click()方法回调DOM。直接从Javascript或使用XHR提交表单会更好、更快、更干净
要调试此循环,您需要使用console.log()s找到正确的轨道。添加更多的标签(例如,您调用addTag()的每个位置),并确定从何处调用它。您可以尝试的另一件事是使用Chrome的DevTools:添加一个“调试器;”调用addTag()的顶部并检查堆栈跟踪。可能是因为这一行模拟了click文档。getElementById('tagSubmit')。click();再一次,请原谅我的无知-为什么这会引起问题?refreshTags函数是什么样子的?它是偶然调用addTag的吗?只是猜测而已。需要查看更多的代码。特别是当您运行add tag函数时。他没有错,如果tagSubmit元素有一个onclick处理程序,该处理程序会再次调用addTag,这可能是一个问题。感谢您深思熟虑的回答,James。我能够在早些时候解决我的问题-请参阅我对原始问题的评论-有两个addTag函数,一个在脚本中,一个(我没有编写)在页面中。我有很多东西要学,我不是一个开发人员,这一点我确信是显而易见的,我从公司的实际开发人员编写的代码中学到了很多东西——所以也许我已经养成了一些坏习惯!)但是,虽然这不是我的日常工作,但学习像这样思考结构化代码的新方法是非常有趣的。再次感谢分享,我将尝试实现这个方法。