递归太多了

时间:2011-04-11 20:18:33

标签: javascript

谁能告诉我这个循环来自哪里?

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上调用一次。

提前谢谢!

4 个答案:

答案 0 :(得分:8)

在这样的行中:

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

您将onclick处理程序分配给getwords(zahlm2++)结果,而不是该函数本身。

如果我怀疑上面的代码实际上是getwords函数,那就意味着它正在调用它自己(递归地)。

相反,写一下:

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

答案 1 :(得分: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 :(得分:2)

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

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

了解有关活动报名的详情

答案 3 :(得分: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(),因为它会评估函数,并且在调用even时不会将其设置为运行:

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;
}