我正在使用Mootools来做一些事情,比如谷歌地图应用程序中的碰碰盒之类的东西。在我添加Mootools脚本之前,无论我是在声明全局变量之前还是之后添加脚本都没有关系,Mootools会杀死them...take一看代码片段
<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>有很多more...but,这只是说明了发生了什么,如果我删除调用mootools.js的代码行,一切都会正常工作。在XMLHTTPRequest过程中,markersArrayProps基本上是这样填充的:
markersArrayAreas.push(marker);然后有一个idle地图的事件侦听器,它会进行一些计算,看看是否应该删除区域标记,并根据地图的边界加载属性标记。不需要详细介绍,只要调用这个idle函数,我就像这样遍历数组:
function clearAreaOverlays() {
if (markersArrayAreas) {
for (i in markersArrayAreas) {
markersArrayAreas[i].setMap(null);
}
}
}它返回markersArrayAreas[i].setMap()不是一个函数。只有在页面中包含mootools脚本时,如果我删除mootools,一切都会正常工作。有什么想法吗?
发布于 2011-01-30 05:59:32
好的,感谢大家的参与,特别感谢Jason指出了mootools array prototype....using mootools .each函数
markersArrayAreas.each (function (item){
item.setMap(null);
});发布于 2011-01-30 05:21:19
解决这个问题的最简单方法是使用以下模式重写循环:
for(var i=0,l=markersArrayAreas.length, i<l, i++) { if(i in markersArrayAreas) { ... } }看起来您正在使用markersArrayAreas作为标准的整数索引数组。因此,您不应该使用(for i in array)模式来遍历它。首先,它的效率远低于使用基于索引的计数循环。
此外,此模式还会遍历对象的所有成员。在您的示例中,MooTools使用一些更多的自定义函数扩展了数组原型,因此每当您创建数组时,除了编号的数组值之外,对象中现在还有其他属性。如果您打印i的值,您应该看到它不再仅仅是数字。
您可以通过检查每个属性名是否引用了不是使用hasOwnProperty函数从原型继承的属性来解决此问题,但同样,这样做的效率要比。
有关显示这些不同循环构造的相对性能的快速基准测试,请参阅此处:http://jsperf.com/for-in-test
发布于 2011-01-30 05:23:13
您可以命名这些全局变量。这将需要一些返工,但它可以保证您的内容不受其他脚本的影响:
var my_globals_with_a_very_unique_name_mf = {
// redeclare all your variables in here
}然后,每当您引用这些变量时,只需进入对象:
my_globals_with_a_very_unique_name_mf.markersArrayPropshttps://stackoverflow.com/questions/4839412
复制相似问题