Последние несколько дней занимаюсь прикручиванием Яндекс карт к нашему сайту и уже нашел несколько серьезных багов. Опишу самый вопиющий. Рядом с картой у нас на странице есть ползунок, который пользователь может перетаскивать. Реализован этот контрол с использованием jquery.draggable. Сегодня заметил, что ползунок работает корректно ровно до того момента, пока не кликнешь на карту. После этого он просто умирает, и сдвинуть его с места нет никакой возможности. Стал копать код. Сначала поставил нежатую библиотеку JQuery UI, думал, что они там что-то нахимичили. Покопавшись с часок с евентами и успевши не раз чертыхнуться, понял, что кто-то делает preventDefault событию dragstart, из-за чего перестает работать перетаскивание ползунка. Пришлось следом поставить нежатую версию самой jQuery и копаться уже в ней. В конце концов оказалось, что на элемент document в свойстве ondragstart повешена некая функция falseFunction:
falseFunction = function () {
return false;};
Как видим, она ничего не делает кроме того, что режет все события, на которые она повешена, и находится эта функция в коде яндекс карт. После этого дело пошло куда быстрее. Вот что выяснилось:
В момент начала перетаскивания карты выполняется функция карт _setupDragger, в которой есть такое место:
// Предотвращаем стандартное поведение выделения текста.
if ('ondragstart' in document) {onDragStartBackup = document.ondragstart;document.ondragstart = falseFunction;}if ('onselectstart' in document) {onSelectStartBackup = document.onselectstart;document.onselectstart = falseFunction;}
_clearDragger: function () {.....if (onSelectStartBackup) {document.onselectstart = onSelectStartBackup;}if (onDragStartBackup) {document.ondragstart = onDragStartBackup;}}
onDragStartBackup у нас пустой и, соответственно, falseFunction прдолжает как ни в чем не бывало сидеть на своем месте вечно, убивая все события drag.
document.ondragstart=function(){return true};