2012-08-27 150 views
0

此函数在不启动循环的情况下持续运行。Javascript无限循环无

setTimeout允许refreshTags函数运行。

我确定这不是最好的脚本 - 我不是大师 - 但是为什么这个脚本在无限循环中运行的任何想法?

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); 
+1

可能是因为这条线模拟点击document.getElementById('tagSubmit')。click(); –

+0

再次请原谅我的无知 - 为什么会造成问题? –

+3

refreshTags函数是什么样的?它是否偶然调用addTag? – jrdn

回答

0

,而不是试图回答为什么这个代码特定部分有一个无限循环,我会尝试回答一个更大的问题“你如何防止和调试无限循环?”。

我发现的最好的防御措施之一就是构造你的代码,这样控制总是在一个方向上流动。你有许多不同层次的位置:

  • onclick事件处理程序被调用到addTag()
  • addTag()被调用refreshTags()
  • addTag()被调用的setTimeout,后来触发器点击DOM。

一个简单的修复方法可以让您的代码在一个方向上流动,以创建专用的事件处理程序,例如, resolveButtonOnclick() { addTag() }。 resolveButtonOnclick只能从resolveButton的onclick处理函数调用。这使审计代码变得更加容易。您已将console.log('running')放在addTag()函数的顶部。现在,如果在resolveButtonOnclick()中放置一个console.log(),您将立即知道如果onclick处理程序包含在无限循环中。

我们看不到你的代码,但是如果refreshTags()调用addTag(),你将有一个循环控制流 - 这些并不总是坏的,但你需要特别小心,它们在某个点终止。

您可能拥有的最大循环控制流程是addTag()使用.click()方法回调DOM。直接从Javascript或使用XHR提交表单会更好,更快,更清晰。

要调试这个循环,您可以通过console.log()来正确地进行调试。添加更多(例如,您称为addTag()的每个地方)并找出它从哪里被调用。您可以尝试的另一件事是使用Chrome的DevTools:添加一个“调试器”;调用addTag()的顶部并检查堆栈跟踪。

+0

谢谢你的深思熟虑,詹姆斯。我之前能够解决我的问题 - 查看我对原始问题的评论 - 有两个addTag函数,一个在脚本中,另一个(我没有写入)在页面中。 我有很多东西需要学习,我不是一名开发人员,我敢肯定这很明显,而且我从我公司的实际开发人员编写的代码中学习了很多东西 - 所以也许我一直在挑选一些陋习! :) 虽然这不是我的日常工作,但学习像这样的新方法来思考构造代码是很有趣的。再次感谢分享,我会尝试实施这种方法。 –