太多的递归

问题描述:

任何人都可以告诉我循环来自哪里?太多的递归

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

在这样的台词:

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

这部分可能会给你一吨的问题:

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

这不回答这个问题(甚至尝试)。但是,它可以解决重复代码的过度丰富问题。

// 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属性的字符串。改用功能。

快乐编码。

你也可以考虑使用事件注册而不是直接分配。这样你就不必担心后来意外覆盖任何东西。 @参宿一的解决方案看起来会像这样:

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