由jQuery添加的div上的Google Maps addDomListener只能看到循环的最后一次迭代
我有以下简单的脚本:
var fruits = new Array("apple","orange","lemon"); $("#fruit_canvas").append("Mouse over these fruits:"); for(var i = 0; i < fruits.length; i++) { var fruit = fruits[i]; var html = "" + fruit + ""; var fruitdiv = $(html); $("#fruit_canvas").append(fruitdiv); google.maps.event.addDomListener($(fruitdiv)[0], 'mouseover', function() { $("#result_canvas").append("Mouse over " + fruit); }); google.maps.event.addDomListener($(fruitdiv)[0], 'mouseout', function() { $("#result_canvas").empty(); }); }
它遍历一个简单的数组,使用jQuery从每个元素中创建一个div,并将它附加到另一个div。 然后将Google Maps DOM侦听器添加到每个附加的div中。 这一切都很好,但是DOM监听器似乎只知道数组的最后一个元素,即它总是返回“lemon”作为水果,无论你将鼠标hover在哪个div上。
要查看我的意思,请访问http://www.pinksy.co.uk/maptest.html并将鼠标hover在每个div上。
我确信这与我如何将DOM元素传递给DOM侦听器有明显的关系,但我不确定如何!
我也尝试过没有jQuery,但得到相同的结果:
document.getElementById('fruit_canvas2').appendChild(document.createTextNode("Mouse over these fruits:")); for(var i = 0; i = 1) { cell.removeChild(cell.firstChild); } } }); }
提前致谢…
你遇到的问题是范围问题。 当你创建监听器时, fruit
确实具有正确的值,但是当它被执行时,它会在你的情况下采用最后的fruit
状态lemon
。
你需要做的很简单,你需要创建一个委托。 你可以这样做:
var someFunction = (function(vars) { return function() { //Do something with vars... }; })(vars);
而你在someFunction
存储的someFunction
将在someFunction
时保留变量的值。 使用它的代码如下所示:
var fruits = new Array("apple","orange","lemon"); $("#fruit_canvas").append("Mouse over these fruits:"); for(var i = 0; i < fruits.length; i++) { var fruit = fruits[i]; var html = "" + fruit + ""; var fruitdiv = $(html); $("#fruit_canvas").append(fruitdiv); var mouseoverListener = (function(fruit) { return function() { $("#result_canvas").append("Mouse over " + fruit); }; })(fruit); google.maps.event.addDomListener($(fruitdiv)[0], 'mouseover', mouseoverListener); google.maps.event.addDomListener($(fruitdiv)[0], 'mouseout', function() { $("#result_canvas").empty(); }); }