Проблема
Разрабатывая приложение с использованием js openapi столкнулся с проблемой: при совместном использовании с
prototype.js в браузерах IE6/7 возникает js-ошибка Function expected.
Покопавшись пару часов в исходниках api выяснил, что ошибка возникает при инициализации вспомогательного модуля XDM, который, судя по всему, помогает выполнять кросс-доменные запросы.
Проблема проявляется только в IE6/7 и, возможно она когда размер запроса > 1500 символов. Именно в этих случаях запрос производится через XDM.
Решение
Для обхода конкретно проблемы я использовал хак - перед вызовами openapi я удалял метод toJSON у Array.prototype, дабы для json-сериализации не использовался prototype.js
// ...
var _hackStore = Array.prototype.toJSON;
delete Array.prototype.toJSON;
// do smth with openapi
Array.prototype.toJSON = _hackStore;
Технические подробности
Объект, подготовленный для передачи в XDM proxy, имеет метод each, появившееся после того, как библиотека prototype.js расширила стандартный массив Array дополнительными методами. Перед вызовом XDM функция openapi.js:applyMethod заменяет все методы передаваемого объекта на хеши.
Далее, в функции xdmHelper.js:str() делается проверка на наличие метода toJSON у передаваемого объекта, и его вызов. В методе prototype.js:Enumerable.toJSON объек рекурсивно обходится с помощью each, и как только дело доходит до ветки, обработанной applyMethod - возникает ошибка, т.к вместо метода each у объекта - хеш.
Чтобы обойти проблему оказалось достаточно перебить метод toJSON, чтобы openapi не предпринимала попыток сериализации через prototype, а пользовалась только внутренними методами.
Пример кода, демонстрирующий проблему -
http://ilazarev.ru/vkapi/index.html
- нажать login + поехали.
--
Этот, а также другие мои посты по it-тематике вы можете прочитать
здесь