0

我正在尝试将函数绑定到 Internet Explorer 7 中节点列表中的项目。

for(var j = 0; j < navLabels.length; j++)
{
    navInsets[j].onmouseover = function(){showLabel(navLabels[j], true);};
    navInsets[j].onmouseout = function(){showLabel(navLabels[j], false);};
    navInsets[j].onclick = function(){selectNew(j);};
    navLabels[j].onclick = function(){selectNew(j);};
}

showLabel() 和 selectNew() 都是我自己的函数。它们每个都需要传递一个索引,在本例中为 j。

我知道,在匿名函数中,j 最终会成为对 j 的引用,而不是 j 的值。我也知道我可以使用 addEventListener 或 bind 方法来执行此操作,但在 IE 7 中都不允许这样做。我什至知道 attachEvent 方法适用于 ie7,但由于我需要传递参数,所以我需要包装匿名函数中的函数使用 attachEvent (至少这似乎是真的),这是最初的问题。

关于这个主题的任何不太老套的想法?谢谢。

4

4 回答 4

3

使用匿名函数来隐藏j

(function(j) {
    navInsets[j].onclick = function() {selectNew(j);};
    ...
})(j);

这将强制j在您的函数范围内按值传递。

于 2013-01-29T23:20:50.300 回答
2

您不一定需要为每个绑定事件使用 IIFE。j您可以在所有事件绑定中使用相同的捕获:

for(var j = 0; j < navLabels.length; j++) {
    (function(j) {
        navInsets[j].onmouseover = function(){showLabel(navLabels[j], true);};
        navInsets[j].onmouseout = function(){showLabel(navLabels[j], false);};
        navInsets[j].onclick = function(){selectNew(j);};
        navLabels[j].onclick = function(){selectNew(j);};
    })(j);
}

我不认为你能得到比这更“干净”的东西。您可能能够提取匿名函数并使其成为命名函数(在与 and 相同的范围内navInsetsnavLabels,但这可能会使您很难看到循环的实际作用(因为您必须查找一次性函数) . 我没有看到任何明显的其他解决方案,因为无论如何您都需要关闭。

于 2013-01-29T23:24:19.863 回答
0

查看您的代码,我认为您可以通过使用事件冒泡/委托来优化您的代码。如果您准备投入一些时间,那么学习 jQuery 可能会收获很多。

如果没有您网站的 HTML 代码(以及 showLabel() 和 selectNew() 的确切工作原理,我无法进一步帮助您,但通常,在导航列表上设置单击和鼠标悬停处理程序可以通过以下简单操作来完成这;

 $('ul#nav').on('click', 'label', function(){
     selectNew(this);
 });
于 2013-01-29T23:30:12.350 回答
0

老实说,在这种你只需要一个索引的情况下,我会将它直接存储在元素上。

for(var j = 0; j < navLabels.length; j++)
{
    navInsets[j].j = j;
    navInsets[j].onmouseover = function(){showLabel(navLabels[this.j], true);};
    navInsets[j].onmouseout = function(){showLabel(navLabels[this.j], false);};
    navInsets[j].onclick = function(){selectNew(this.j);};
    navLabels[j].onclick = function(){selectNew(this.j);};
}

这是一种非常轻便、干净且快速的解决方案。只是不要存储元素本身,因为这可能会导致泄漏。

但是只存储一个索引是无害的,它避免了闭包泄漏的可能性。


此外,可能有更好的“DOM 遍历”解决方案,但这取决于您的标记。

于 2013-01-29T23:33:03.720 回答