From 0a0a39f896f83412dc91bedd6819c3a3a0932302 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Scott=20Gonz=C3=A1lez?= Date: Fri, 3 Sep 2010 09:49:29 -0400 Subject: [PATCH] Widget: Hook into jQuery.cleanData to auto-destroy widgets. Fixes #6008 - Widget: auto-destroy is broken in jQuery 1.4. --- tests/unit/widget/widget.html | 4 +- tests/unit/widget/widget_core.js | 67 ++++++++++++++++++++++++++++++++ ui/jquery.ui.widget.js | 36 ++++++++++------- 3 files changed, 93 insertions(+), 14 deletions(-) diff --git a/tests/unit/widget/widget.html b/tests/unit/widget/widget.html index 712f14409..9f7a0f040 100644 --- a/tests/unit/widget/widget.html +++ b/tests/unit/widget/widget.html @@ -29,7 +29,9 @@
-
+
+
...
+
diff --git a/tests/unit/widget/widget_core.js b/tests/unit/widget/widget_core.js index 2d5502838..604222106 100644 --- a/tests/unit/widget/widget_core.js +++ b/tests/unit/widget/widget_core.js @@ -409,4 +409,71 @@ test( "._trigger() - provide event and ui", function() { .testWidget( "testEvent" ); }); +test( "auto-destroy - .remove()", function() { + expect( 1 ); + $.widget( "ui.testWidget", { + _create: function() {}, + destroy: function() { + ok( true, "destroyed from .remove()" ); + } + }); + $( "#widget" ).testWidget().remove(); +}); + +test( "auto-destroy - .remove() on parent", function() { + expect( 1 ); + $.widget( "ui.testWidget", { + _create: function() {}, + destroy: function() { + ok( true, "destroyed from .remove() on parent" ); + } + }); + $( "#widget" ).testWidget().parent().remove(); +}); + +test( "auto-destroy - .remove() on child", function() { + $.widget( "ui.testWidget", { + _create: function() {}, + destroy: function() { + ok( false, "destroyed from .remove() on child" ); + } + }); + $( "#widget" ).testWidget().children().remove(); + // http://github.com/jquery/qunit/pull/34 + $.ui.testWidget.prototype.destroy = $.noop; +}); + +test( "auto-destroy - .empty()", function() { + $.widget( "ui.testWidget", { + _create: function() {}, + destroy: function() { + ok( false, "destroyed from .empty()" ); + } + }); + $( "#widget" ).testWidget().empty(); + // http://github.com/jquery/qunit/pull/34 + $.ui.testWidget.prototype.destroy = $.noop; +}); + +test( "auto-destroy - .empty() on parent", function() { + expect( 1 ); + $.widget( "ui.testWidget", { + _create: function() {}, + destroy: function() { + ok( true, "destroyed from .empty() on parent" ); + } + }); + $( "#widget" ).testWidget().parent().empty(); +}); + +test( "auto-destroy - .detach()", function() { + $.widget( "ui.testWidget", { + _create: function() {}, + destroy: function() { + ok( false, "destroyed from .detach()" ); + } + }); + $( "#widget" ).testWidget().detach(); +}); + })( jQuery ); diff --git a/ui/jquery.ui.widget.js b/ui/jquery.ui.widget.js index d08dbb81f..dbfea2574 100644 --- a/ui/jquery.ui.widget.js +++ b/ui/jquery.ui.widget.js @@ -9,20 +9,30 @@ */ (function( $, undefined ) { -var _remove = $.fn.remove; - -$.fn.remove = function( selector, keepData ) { - return this.each(function() { - if ( !keepData ) { - if ( !selector || $.filter( selector, [ this ] ).length ) { - $( "*", this ).add( [ this ] ).each(function() { - $( this ).triggerHandler( "remove" ); - }); - } +// jQuery 1.4+ +if ( $.cleanData ) { + var _cleanData = $.cleanData; + $.cleanData = function( elems ) { + for ( var i = 0, elem; (elem = elems[i]) != null; i++ ) { + $( elem ).triggerHandler( "remove" ); } - return _remove.call( $(this), selector, keepData ); - }); -}; + _cleanData( elems ); + }; +} else { + var _remove = $.fn.remove; + $.fn.remove = function( selector, keepData ) { + return this.each(function() { + if ( !keepData ) { + if ( !selector || $.filter( selector, [ this ] ).length ) { + $( "*", this ).add( [ this ] ).each(function() { + $( this ).triggerHandler( "remove" ); + }); + } + } + return _remove.call( $(this), selector, keepData ); + }); + }; +} $.widget = function( name, base, prototype ) { var namespace = name.split( "." )[ 0 ],