diff options
-rw-r--r-- | src/attributes/attr.js | 33 | ||||
-rw-r--r-- | test/unit/attributes.js | 14 |
2 files changed, 29 insertions, 18 deletions
diff --git a/src/attributes/attr.js b/src/attributes/attr.js index 202c7028b..170e6a39e 100644 --- a/src/attributes/attr.js +++ b/src/attributes/attr.js @@ -6,7 +6,8 @@ define([ "../support" ], function( jQuery, rnotwhite, strundefined ) { -var nodeHook, boolHook; +var nodeHook, boolHook, + attrHandle = jQuery.expr.attrHandle; jQuery.fn.extend({ attr: function( name, value ) { @@ -120,23 +121,19 @@ boolHook = { } }; jQuery.each( jQuery.expr.match.bool.source.match( /\w+/g ), function( i, name ) { - var getter = jQuery.expr.attrHandle[ name ] || jQuery.find.attr; - - jQuery.expr.attrHandle[ name ] = function( elem, name, isXML ) { - var fn = jQuery.expr.attrHandle[ name ], - ret = isXML ? - undefined : - /* jshint eqeqeq: false */ - // Temporarily disable this handler to check existence - (jQuery.expr.attrHandle[ name ] = undefined) != - getter( elem, name, isXML ) ? - - name.toLowerCase() : - null; - - // Restore handler - jQuery.expr.attrHandle[ name ] = fn; - + var getter = attrHandle[ name ] || jQuery.find.attr; + + attrHandle[ name ] = function( elem, name, isXML ) { + var ret, handle; + if ( !isXML ) { + // Avoid an infinite loop by temporarily removing this function from the getter + handle = attrHandle[ name ]; + attrHandle[ name ] = ret; + ret = getter( elem, name, isXML ) != null ? + name.toLowerCase() : + null; + attrHandle[ name ] = handle; + } return ret; }; }); diff --git a/test/unit/attributes.js b/test/unit/attributes.js index 84ac8c2b2..72da26541 100644 --- a/test/unit/attributes.js +++ b/test/unit/attributes.js @@ -470,6 +470,20 @@ test( "attr(String, Object)", function() { equal( jQuery("#name").attr( "nonexisting", undefined ).attr("nonexisting"), undefined, ".attr('attribute', undefined) does not create attribute (#5571)" ); }); +test( "attr - extending the boolean attrHandle", function() { + expect( 1 ); + var called = false, + _handle = jQuery.expr.attrHandle.checked || $.noop; + jQuery.expr.attrHandle.checked = function() { + called = true; + _handle.apply( this, arguments ); + }; + jQuery( "input" ).attr( "checked" ); + called = false; + jQuery( "input" ).attr( "checked" ); + ok( called, "The boolean attrHandle does not drop custom attrHandles" ); +}); + test( "attr(String, Object) - Loaded via XML document", function() { expect( 2 ); var xml = createDashboardXML(), |