Несовместимость vkontakte openapi с prototype.js в IE6/7

Oct 06, 2010 09:43

Проблема

Разрабатывая приложение с использованием 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-тематике вы можете прочитать здесь

Разработка

Previous post Next post
Up