2012-08-27 147 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函數,一個在腳本中,另一個(我沒有寫入)在頁面中。 我有很多東西需要學習,我不是一名開發人員,我敢肯定這很明顯,而且我從我公司的實際開發人員編寫的代碼中學習了很多東西 - 所以也許我一直在挑選一些陋習! :) 雖然這不是我的日常工作,但學習像這樣的新方法來思考構造代碼是很有趣的。再次感謝分享,我會嘗試實施這種方法。 –