2011-01-29 39 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