]> source.dussan.org Git - jquery.git/commitdiff
Event: Only attach events to objects that accept data - for real
authorMichał Gołębiowski-Owczarek <m.goleb@gmail.com>
Mon, 9 Dec 2019 18:50:14 +0000 (19:50 +0100)
committerGitHub <noreply@github.com>
Mon, 9 Dec 2019 18:50:14 +0000 (19:50 +0100)
There was a check in jQuery.event.add that was supposed to make it a noop
for objects that don't accept data like text or comment nodes. The problem was
the check was incorrect: it assumed `dataPriv.get( elem )` returns a falsy
value for an `elem` that doesn't accept data but that's not the case - we get
an empty object then. The check was changed to use `acceptData` directly.

Fixes gh-4397
Closes gh-4558

src/event.js
test/unit/event.js

index 7f66d49de2831a9d494bbb944420c4afbce55519..796d96210399e34d3b873ffb3d8d34126b6b6bed 100644 (file)
@@ -4,6 +4,7 @@ import documentElement from "./var/documentElement.js";
 import rnothtmlwhite from "./var/rnothtmlwhite.js";
 import rcheckableType from "./var/rcheckableType.js";
 import slice from "./var/slice.js";
+import acceptData from "./data/var/acceptData.js";
 import dataPriv from "./data/var/dataPriv.js";
 import nodeName from "./core/nodeName.js";
 
@@ -109,8 +110,8 @@ jQuery.event = {
                        special, handlers, type, namespaces, origType,
                        elemData = dataPriv.get( elem );
 
-               // Don't attach events to noData or text/comment nodes (but allow plain objects)
-               if ( !elemData ) {
+               // Only attach events to objects that accept data
+               if ( !acceptData( elem ) ) {
                        return;
                }
 
index 43e2f3857b59266d47fbd8531061aa7e8a331c8c..4019fbe814b6adb423611afedae6ea43e4179f76 100644 (file)
@@ -2811,6 +2811,15 @@ QUnit.test( "preventDefault() on focusin does not throw exception", function( as
        }, QUnit.config.testTimeout / 4 || 1000 );
 } );
 
+QUnit.test( ".on('focus', fn) on a text node doesn't throw", function( assert ) {
+       assert.expect( 1 );
+
+       jQuery( document.createTextNode( "text" ) )
+               .on( "focus", function() {} );
+
+       assert.ok( true, "No crash" );
+} );
+
 QUnit.test( "Donor event interference", function( assert ) {
        assert.expect( 8 );