2011-04-11 122 views
0

任何人都可以告訴我循環來自哪裏?太多的遞歸

JS:

if (zahl > 1) { 
    document.getElementById('makroclickm2').innerHTML = data_split[zahlm2]; 
    document.getElementById('makroclickm2').onclick = getwords(zahlm2++); 
} 
else { 
    document.getElementById('makroclickm2').innerHTML = ""; 
    document.getElementById('makroclickm2').onclick = ""; 
} 

if (zahl > 0) { 
    document.getElementById('makroclickm1').innerHTML = data_split[zahlm1]; 
    document.getElementById('makroclickm1').onclick = getwords(zahlm1++); 
} 
else { 
    document.getElementById('makroclickm1').innerHTML = ""; 
    document.getElementById('makroclickm1').onclick = ""; 
} 

document.getElementById('makroclick').innerHTML = data_split[zahl]; 
document.getElementById('makroclick').onclick = getwords(zahl++); 

document.getElementById('makroclickp1').innerHTML = data_split[zahlp1]; 
document.getElementById('makroclickp1').onclick = getwords(zahlp1++); 
if (typeof(data_split[zahlp1]) == "undefined") { 
    document.getElementById('makroclickp1').innerHTML = ""; 
    document.getElementById('makroclickp1').onclick = ""; 
} 

document.getElementById('makroclickp2').innerHTML = data_split[zahlp2]; 
document.getElementById('makroclickp2').onclick = getwords(zahlp2++); 
if (typeof(data_split[zahlp2]) == "undefined") { 
    document.getElementById('makroclickp2').innerHTML = ""; 
    document.getElementById('makroclickp2').onclick = ""; 
} 

HTML:

<div id="makroclickm2" onclick="" class="makroclick"></div> 
<div id="makroclickm1" onclick="" class="makroclick"></div> 
<div id="makroclick" onclick="getwords(0);" class="makroclick_center"></div> 
<div id="makroclickp1" onclick="getwords(1);" class="makroclick"></div> 
<div id="makroclickp2" onclick="getwords(2);" class="makroclick"></div> 

(不完整代碼) 該函數被調用一次onload事件。

Thx提前!

+0

凡\什麼是'getwords'功能瞭解更多有關事件註冊? – Adam 2011-04-11 20:22:33

+1

我懷疑上面的代碼是'getwords'函數... – Alnitak 2011-04-11 20:24:28

回答

8

在這樣的臺詞:

document.getElementById('makroclickm2').onclick = getwords(zahlm2++); 

你分配onclick處理到結果getwords(zahlm2++),還沒到那個函數本身。

如果我懷疑上面的代碼實際上是getwords函數,那意味着它正在調用自己(遞歸)。

你應該寫:

document.getElementById('makroclickm2').onclick = function() { 
    getwords(zahlm2++); 
} 
+0

非常感謝你! – iceteea 2011-04-11 20:25:22

1

這部分可能會給你一噸的問題:

if (zahl > 1) { 
    document.getElementById('makroclickm2').innerHTML = data_split[zahlm2]; 
    document.getElementById('makroclickm2').onclick = getwords(zahlm2++); 
} 
else { 
    document.getElementById('makroclickm2').innerHTML = ""; 
    document.getElementById('makroclickm2').onclick = ""; 
} 

if (zahl > 0) { 
    document.getElementById('makroclickm1').innerHTML = data_split[zahlm1]; 
    document.getElementById('makroclickm1').onclick = getwords(zahlm1++); 
} 
else { 
    document.getElementById('makroclickm1').innerHTML = ""; 
    document.getElementById('makroclickm1').onclick = ""; 
} 

嘗試使用else if代替if語句的另一個塊。此外,我會使用function(){},而不是""(和getwords(),作爲評估的功能,並且不將其設置爲運行,即使被調用時):

if (zahl > 1) { 
    document.getElementById('makroclickm2').innerHTML = data_split[zahlm2]; 
    document.getElementById('makroclickm2').onclick = function(){getwords(zahlm2++)}; 
} else if (zahl > 0) { 
    document.getElementById('makroclickm1').innerHTML = ""; 
    document.getElementById('makroclickm1').onclick = null; 

    document.getElementById('makroclickm1').innerHTML = data_split[zahlm1]; 
    document.getElementById('makroclickm1').onclick = function(){getwords(zahlm1++)}; 
} else { 
    document.getElementById('makroclickm2').innerHTML = ""; 
    document.getElementById('makroclickm2').onclick = null; 
} 
+0

謝謝,我會編輯它。 – Blender 2011-04-11 20:45:48

3

這不回答這個問題(甚至嘗試)。但是,它可以解決重複代碼的過度豐富問題。

// instead of repeating the document.getElementById 
// many times over... 
document.getElementById('makroclickm2').innerHTML = ""; 
document.getElementById('makroclickm2').onclick = ""; 

// get the element once 
var elm = document.getElementById('makroclickm2') 
// and use it many times over 
elm.innerHTML = "" 
elm.onclick = null // do not use strings here 

這將使代碼更容易遵循(請使用適當的變量名稱)。

另外,不要使用具有onclick屬性的字符串。改用功能。

快樂編碼。

2

你也可以考慮使用事件註冊而不是直接分配。這樣你就不必擔心後來意外覆蓋任何東西。 @參宿一的解決方案看起來會像這樣:

var myEl = document.getElementById('makroclickm2'); 
var myFunc = function() { 
    getwords(zahlm2++); 
} 

if (myEl.addEventListener) myEl.addEventListener("click", myFunc, false); 
else if (myEl.attachEvent) myEl.attachEvent("onclick", myFunc); 
else myEl.onclick = myFunc; 

顯然,這是相當冗長,但它會很容易寫一個快速的輔助函數需要MYEL和myFunc的作爲輸入,併爲您處理一切。

您可以在http://www.quirksmode.org/js/events_advanced.html