Decidí probar esto y chico, es mucho trabajo con poco progreso usando un nodo de iframe interno como asa. De todos modos, aquí hay dos soluciones, la primera no funciona muy bien, pero si puede hacer que funcione, puede ser más conveniente.
principal.html (plagio de la demo)
<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>
interior 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;
});
});
});
Me tomó un tiempo para encontrar algo que " trabajó." El problema aquí es que, dado que el evento mousedown se produjo en un elemento dentro del iframe, el evento del mouse es relativo al iframe, no al documento principal. La solución alternativa es tener un evento de movimiento en el documento y tomar la posición del mouse desde allí. El problema, una vez más, es que si el mouse está dentro del iframe, "no" se mueve de acuerdo con el documento principal. Esto significa que el evento de arrastre solo ocurre cuando el mouse alcanza el borde del iframe en el documento principal.
Una solución para esto podría ser generar eventos manualmente con la posición calculada del iframe en relación con el movimiento del mouse. Entonces, cuando su mouse se mueve dentro del iframe, calcule su movimiento usando la coordenada del iframe al documento principal. Esto significa que es necesario utilizar el evento desde el mousedown y no mousemove,
$('iframe', '#draggable')[0].contentWindow.$('#innerHandle').mousedown(function (e) {
// do something with e
$('#draggable').draggable().data('draggable')._mouseDown(e);
return false;
});
La segunda solución es la forma en que usted ha mencionado, tiene un div posicionado absoluto sobre el propio marco flotante.No tengo problemas en conseguir el div a estar en la cima del marco flotante, es decir,
<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>
El problema con el div estar detrás del marco flotante podría ser debido a que el índice z está apagado. Si declara su div antes del iframe y no especifica el índice z, entonces el iframe estará en la parte superior.
¡De cualquier forma que elija, buena suerte!
Arrastrable con iFrameFix todavía era lento para mí. El diálogo funcionó mejor, si un diálogo es una solución aceptable. Todavía es arrastrable pero también se puede cerrar. – user420667