2011-01-29 38 views
1

即时通讯使用Mootools的一些东西,如在谷歌地图应用程序中的撞块和东西。一切工作100%,之前我添加了Mootools的剧本,如果我添加脚本之前或之后,我宣布我的全局不要紧,MooTools的杀死他们......看看片断Mootools破坏我的全局变量!谷歌地图+ Mootools

<script language="javascript" type="text/javascript" src="mootools.js"></script> 
<script language="javascript" type="text/javascript" src="bumpbox.js"></script> 

<script src="http://maps.google.com/maps/api/js?sensor=false" type="text/javascript"> 
</script> 
<script type="text/javascript"> 

    var currentBounds; 
    var currentMarker = null; 
    var currentInfo = null; 
    var markersArrayProps = []; 
    var markersArrayAreas = []; 
</script> 

还有更多......但这只是显示发生了什么,如果我删除了调用mootools.js的行,那么一切正常。基本上markersArrayProps是一个XMLHttpRequest中填充像这样:

markersArrayAreas.push(marker); 

再有就是对地图为idle,做一些计算,看它是否应该放弃的区域标记一个事件侦听器,以及基于边界负载特性标记的地图。无需通过这样的阵列深入细节,但每当这个idle函数被调用,我的循环:

function clearAreaOverlays() { 
    if (markersArrayAreas) { 
    for (i in markersArrayAreas) { 
     markersArrayAreas[i].setMap(null); 
    } 
    } 
} 

它返回markersArrayAreas[i].setMap()不是一个函数。只有在页面中包含mootools脚本时,如果我删除mootools,则一切正常。有任何想法吗?

回答

1

好,感谢大家的输入,并特别感谢贾森指出有关MooTools的阵列原型....使用的mootools .each功能

markersArrayAreas.each (function (item){ 
     item.setMap(null); 
    }); 
4

解决这个问题的最简单方法是使用模式来重写你的循环:

for(var i=0,l=markersArrayAreas.length, i<l, i++) { if(i in markersArrayAreas) { ... } } 

它看起来像你使用markersArrayAreas作为一个标准的整数索引数组。所以,你不应该使用(for i in array)模式来遍历它。首先,它比使用基于索引的计数循环效率低得多。

但是,此模式遍历对象的所有成员。在你的情况下,MooTools已经用一些更多的自定义函数扩展了Array原型,所以无论你何时创建一个数组,现在除了编号的数组值之外,对象中还有其他属性。如果您打印的值为i,您应该看到它不再只是数字。

你可以解决这个问题通过检查,以查看是否每个属性名称是指使用hasOwnProperty功能从原型继承财产,但同样,这将是要比效率较低。

对于一个快速的基准,显示了这些不同的循环结构的相对表现,在这里看到:http://jsperf.com/for-in-test

+0

+1'的(我在阵列)`好像平时工作,直到`Array.prototype`通过额外的方法得到丰富,这在MooTools中就是这样。但OP所使用的循环模式仍然是循环遍历一个枚举的糟糕方式。 – BGerrissen 2011-01-29 21:35:12

+0

这并没有工作,仍然markersArrayArea [i] .setMap不是一个功能...我希望这是简单的 – 2011-01-29 21:38:02

+0

你试过检查什么是标记ArrayArray [i] *的值是*?它是否为空,还是未定义,还是它是一些意想不到的对象? – 2011-01-29 21:55:05

0

你可以命名空间的全局变量。这将需要一些改造的,但它保证让你的东西免受其他脚本:

var my_globals_with_a_very_unique_name_mf = { 
    // redeclare all your variables in here 
} 

然后,当你表示这些变量,只要进入对象:

my_globals_with_a_very_unique_name_mf.markersArrayProps