Клуб API Карт

Yandex maps IE7

Пост в архиве.

Всем привет, я использую яндекс карты версии 1.0 и у меня возникает проблема в IE7

Я подключаю JS:

<script src="http://api-maps.yandex.ru/1.0/index.xml?key=[MY API KEY] type="text/javascript"></script>

в хэде странице.

В IE7 при загрузке страницы вылазит сообщение об остановке выполнения скрипта, так как он замедляет работу Internet Explorer.

Как можно это обойти? Кто-нибудь сталкивался с подобной проблемой?

 

5 комментариев

Можно адрес страницы увидеть?

Сами яндекс карты так виснуть не умеют, но существует десятки способов их этому научить - от других скриптов до незакрытых тегов(кстати именно ИЕ7 этим сильно болеет)

Спасибо за отклик.

К сожалению ссылку дать не могу, так как эта страница редактирования контента, доступная только администраторам и сайт находится в активной работе.

 

На самой страничке просмотра такого бага не возникает, потому что я подключаю JS с параметром loadByRequire=1

 

Сами яндекс карты так виснуть не умеют, но существует десятки способов их этому научить - от других скриптов до незакрытых тегов(кстати именно ИЕ7 этим сильно болеет)

Ну когда я удалю подключение этого срипта из хэда странички, то баг исчезает.

Запарился разбираться, но все-таки проблему нашел, у вас в http://api-maps.yandex.ru/1.0.8/_YMaps.js в prototype Array'a добавляются новые свойства-функции, в том числе reduceRight и reduce.

Соответственно если на сайте, на котором происходит подключение ваших карт есть что-то типа:

 for (i in arrayVar) { ....jQuery(i).... }, где arrayVar это массив [], то в цикле будут также перебираться значения из prototype, в том числе две вышеупомянутые.

 (справедливо для IE7, В Chrome 12 и FF5 такого не происходит)

При вызове jQuery(reduceRight / reduce) в итоге вызывается fn.call(document, jQuery)

т.е. другими словами document.reduce(jQuery) или document.reduceRight(jQuery) чего по идее не может быть, так как document это не Array

 

внутри функции reduceRight и reduce используется this.length, который по идее всегда определен если вызов происходит от массива, но в нашем случае это document и length у объекта-немассива undefined

Именно это и является причиной бесконечного цикла do while, описанного дальше в обоих функциях.

Это можно исправить определив обе функции в прототипе раньше и добавить в их начало

 

  if (this.length == undefined) {

    throw new TypeError()

  }

 

П.С. У вас визивиг глючный 

 

Спасибо за проделанную работу. К сожалению не могу пообещать изменений в указанной вами версии АПИ. Мы конечно же включим ваш репорт в трекер, но указанной версии совсем нет планов на разработку.

Не могу не поинтересоваться, что вам не дает перейти на более новую версию АПИ?

не надо перебирать Array конструкцией for ... in 

 

попробуйте:

for (var i = 0; i < arrayVar.length; i++) { /* some code */ }

 

когда перебираете объекты и вам не нужны свойства прототипов:

for (var i in arrayVar) {if () {arrayVar.hasOwnPropery(i){ /* some code */ }} }