Mootools уничтожает мои глобалы !!! Google Maps + Mootools - PullRequest
1 голос
/ 30 января 2011

Я использую Mootools для нескольких вещей, таких как bumpboxes и прочее в приложении Google Maps. Все работало на 100%, до того, как я добавил скрипт 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, все работает. Есть идеи?

Ответы [ 3 ]

4 голосов
/ 30 января 2011

Самый простой способ исправить это - переписать ваш цикл с помощью шаблона:

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

1 голос
/ 30 января 2011

Хорошо, спасибо за вводные данные, и особая благодарность Джейсону за то, что он указал на прототип массива mootools .... используя mootools .each function

    markersArrayAreas.each (function (item){
        item.setMap(null);
    });
0 голосов
/ 30 января 2011

Вы можете использовать пространство имен этих глобальных переменных. Это потребует немного доработки, но гарантированно защитит ваши вещи от других скриптов:

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

Затем, когда вы ссылаетесь на эти переменные, просто переходите к объекту:

my_globals_with_a_very_unique_name_mf.markersArrayProps
...