Перетащите элементы в iframe. Область Droppable имеет неправильные координаты, и коллизии ошибочны

Мне нужно реализовать функции перетаскивания в веб-приложении между элементами, присутствующими на веб-странице, и элементами внутри iframe (прежде чем вы начнете жаловаться на iframe, мне это нужно по техническим причинам, это не вариант).

У меня есть элементы на странице, которые можно перетащить в целевые отбрасываемые элементы внутри iframe.

Мне удалось это сделать как с помощью jQuery UI, так и с YUI, хотя обе библиотеки представляют одну и ту же проблему: координаты целевого элемента (droppable target) неверно истолкованы, область перетаскивания, рассмотренная обеими библиотеками, неверна и не представляет собой фактический отбрасываемый объект, поэтому столкновения между перетаскиваемым объектом и отброшенным элементом полностью перепутаны. Это похоже на библиотеку, где элемент droppable располагается в другом месте, где он эффективно.

Я думаю, что это связано с тем, что iframe не позиционируется в верхнем левом углу страницы, а посередине. Я думаю, это потому, что я читал много людей, жалующихся на эту проблему, и проблема исчезла, если iframe был позиционирован сверху слева. Кто-то предполагает, что координаты элемента droppable могут быть вычислены на основе screenX и screenY вместо clientX и clientY, и это может быть причиной проблемы, не принимая во внимание, что элементы находятся внутри iframe, и поэтому координаты различаются между другими элементами вне iframe.

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

Вопросы:

1) Раньше кто-то испытал это поведение и сумел исправить проблему? Или есть библиотека, которая может сделать это безупречно?

2) Есть ли способ исправить эту проблему, используя методы и функции самой библиотеки? И если нет,

3) Кто-нибудь знает, какая часть библиотеки вычисляет координаты области сбрасываемой области, так что я могу исправить ее как последний экстремальный вариант?

Спасибо заранее, даже самая маленькая помощь будет оценена!


ИЗМЕНИТЬ

Эта скрипка демонстрирует проблему. Попробуйте переместить зеленый квадрат внутри красного квадрата (который находится внутри iframe). Вы заметите, что столкновение между двумя квадратами неверно.

http://jsfiddle.net/DQdZ9/23/

Ответ 1

Это не "серебряная пуля", но я пойду дальше и опубликую это как ответ, но я не уверен, сколько это будет у вас для вас. Я отследил ключевую функцию в пользовательском интерфейсе jQuery, который может быть тем, что вы ищете. Он находится в $.ui.ddmanager (менеджер перетаскивания), а функция prepareOffsets. Эта строка:

m[i].offset = m[i].element.offset();

похоже, тот, который устанавливает смещение для использования, когда элемент фактически отбрасывается. Это может быть место для скрипта, чтобы настроить результирующее смещение, основанное на том, является ли droppable элементом дочерний элемент iframe.

У него есть еще одна функция $.ui.intersect, которая выполняет логику, чтобы увидеть, пересекаются ли перетаскиваемые и droppable друг с другом.

Я в последней версии jQuery UI, и файл jquery-ui-1.8.14.custom.js в строке 2012-2029. Если вы получаете единственный файл с возможностью распаковки, jquery.ui.droppable.js, он находится в строках 203-220. И это файлы dev, а не файлы min.