Что за глоток.
В основном у меня есть родитель Я пытался: Он нацелен на правильный элемент DOM, но он просто не будет тянуть. Может быть возможно наложить скрытый div поверх iframe, но я обнаружил, что iframe переносит событие над div, когда позиция абсолютна. Странно.
. Мне нужен элемент внутри iframe, чтобы быть ручкой для перетаскивания родительского div. Это вообще возможно?
$(node).draggable("option","handle",$('iframe',node).contents().find('#handle'));
$(node).draggable("option","handle",$('iframe',node).contents().find('#handle')[0]);
Я решил нанести удар, и, черт возьми, это большая работа с небольшим прогрессом с использованием внутреннего узла iframe в качестве дескриптора. В любом случае, вот два решения, первое работает не очень хорошо, но если вы сможете заставить его работать, это может быть более желательным.
main.html (заимствовано из демонстрации)
<div id="draggable" class="ui-widget-content" style="position:relative;">
<p class="ui-widget-header">I can be dragged only by this handle</p>
<iframe name="iframe1" src="inner-handle.html" height=50 width=80></iframe>
</div>
inner-handle.html
<html>
<head>
<script type="text/javascript" src="../../jquery-1.4.2.js"></script>
</head>
<body>
<div id="innerHandle">handle</div>
</body>
</html>
JavaScript
$(function () {
var moveEvent;
$(document).mousemove(function (e) {
moveEvent = e;
});
$("#draggable").draggable();
$('iframe', '#draggable').load(function () {
$('iframe', '#draggable')[0].contentWindow.$('#innerHandle').mousedown(function (e) {
$('#draggable').draggable().data('draggable')._mouseDown(moveEvent);
return false;
});
});
});
Мне потребовалось время, чтобы найти что-то, что «работало». Проблема заключалась в том, что, поскольку событие mousedown произошло на элементе внутри iframe, событие мыши относится к iframe, а не к основному документу. Обходной путь состоит в том, чтобы иметь событие перемещения в документе и захватывать позицию мыши оттуда. Проблема, опять же, в том, что если мышь находится внутри iframe, она «не» движется в соответствии с родительским документом. Это означает, что событие перетаскивания происходит только тогда, когда указатель мыши достигает края iframe в родительский документ.
Чтобы решить эту проблему, можно вручную сгенерировать события с рассчитанной позицией iframe относительно движения мыши. Поэтому, когда ваша мышь перемещается внутри iframe, рассчитайте ее движение, используя координату iframe для родительского документа.Это означает, что вам нужно использовать событие из mousedown, а не mousemove,
$('iframe', '#draggable')[0].contentWindow.$('#innerHandle').mousedown(function (e) {
// do something with e
$('#draggable').draggable().data('draggable')._mouseDown(e);
return false;
});
Второе решение - это способ, которым вы упомянули, иметь абсолютное позиционирование div над самим iframe. У меня нет проблем с размещением div поверх iframe, то есть
<div id="draggable" class="ui-widget-content" style="position:relative;">
<p class="ui-widget-header">I can be dragged only by this handle</p>
<iframe name="iframe1" src="inner-handle.html" height=50 width=80></iframe>
<div style="position: absolute; height: 30px; width: 30px; background-color: black; z-index: 1000;"></div>
</div>
Проблема с тем, что ваш div находится за iframe, может быть из-за того, что z-index отключен. Если вы объявите свой div перед iframe и не указали z-index, тогда iframe будет наверху.
Какой бы путь вы ни выбрали, удачи!
что произойдет, если вы сделаете это (с активированным firebug ):
var frameContent = $('iframe',node).contents()
var handle = frameContent.find('#handle');
console.debug(frameContent, handle)
Содержит ли дескриптор
список элементов? И если это так, внимательно посмотрите на объект Document
, который является frameContent
- это URL «about: blank»
? Это просто догадка, но если вы получите эти выходные данные, вероятно, он выполняет селектор jQuery до загрузки содержимого кадра (т.е. до того, как существует элемент #handle
).
В этом случае вы можете добавить событие в документ IFRAME и связаться с родительским фреймом через window.parent
.