Skip to content

Commit

Permalink
Draggable: append divs to iframe parent for iframefix
Browse files Browse the repository at this point in the history
This allows the blocking div to move with the iframe in
most situations, whereas appending to the body wouldn't.

Fixes #9671
  • Loading branch information
mikesherov committed Aug 24, 2014
1 parent df7e32f commit c7bec85
Show file tree
Hide file tree
Showing 2 changed files with 64 additions and 13 deletions.
42 changes: 42 additions & 0 deletions tests/unit/draggable/draggable_options.js
Expand Up @@ -1334,4 +1334,46 @@ test( "zIndex, default, switching after initialization", function() {

});

test( "iframeFix", function() {
expect( 5 );

var element = $( "<div>" ).appendTo( "#qunit-fixture" ).draggable({ iframeFix: true }),
element2 = $( "<div>" ).appendTo( "#qunit-fixture" ).draggable({ iframeFix: ".iframe" }),
iframe = $( "<iframe>" ).appendTo( element );

element2
.append( "<iframe class='iframe'></iframe>" )
.append( "<iframe>" );

iframe.css({
width: 1,
height: 1
});

element.one( "drag", function() {
var div = $( this ).children().not( "iframe" );
// http://bugs.jqueryui.com/ticket/9671
// iframeFix doesn't handle iframes that move
equal( div.length, 1, "blocking div added as sibling" );
equal( div.outerWidth(), iframe.outerWidth(), "blocking div is wide enough" );
equal( div.outerHeight(), iframe.outerHeight(), "blocking div is tall enough" );
deepEqual( div.offset(), iframe.offset(), "blocking div is tall enough" );
});

element.simulate( "drag", {
dx: 1,
dy: 1
});

element2.one( "drag", function() {
var div = $( this ).children().not( "iframe" );
equal( div.length, 1, "blocking div added as sibling only to matching selector" );
});

element2.simulate( "drag", {
dx: 1,
dy: 1
});
});

})( jQuery );
35 changes: 22 additions & 13 deletions ui/draggable.js
Expand Up @@ -109,20 +109,32 @@ $.widget("ui.draggable", $.ui.mouse, {
return false;
}

$(o.iframeFix === true ? "iframe" : o.iframeFix).each(function() {
$("<div class='ui-draggable-iframeFix' style='background: #fff;'></div>")
.css({
width: this.offsetWidth + "px", height: this.offsetHeight + "px",
position: "absolute", opacity: "0.001", zIndex: 1000
})
.css($(this).offset())
.appendTo("body");
});
this._blockFrames( o.iframeFix === true ? "iframe" : o.iframeFix );

return true;

},

_blockFrames: function( selector ) {
this.iframeBlocks = this.document.find( selector ).map(function() {
var iframe = $( this );

return $( "<div>" )
.css( "position", "absolute" )
.appendTo( iframe.parent() )
.outerWidth( iframe.outerWidth() )
.outerHeight( iframe.outerHeight() )
.offset( iframe.offset() )[ 0 ];
});
},

_unblockFrames: function() {
if ( this.iframeBlocks ) {
this.iframeBlocks.remove();
delete this.iframeBlocks;
}
},

_blurActiveElement: function( event ) {
var document = this.document[ 0 ];

Expand Down Expand Up @@ -297,10 +309,7 @@ $.widget("ui.draggable", $.ui.mouse, {
},

_mouseUp: function( event ) {
//Remove frame helpers
$("div.ui-draggable-iframeFix").each(function() {
this.parentNode.removeChild(this);
});
this._unblockFrames();

//If the ddmanager is used for droppables, inform the manager that dragging has stopped (see #5003)
if ( $.ui.ddmanager ) {
Expand Down

0 comments on commit c7bec85

Please sign in to comment.