aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMichał Gołębiowski-Owczarek <m.goleb@gmail.com>2019-12-09 19:50:14 +0100
committerGitHub <noreply@github.com>2019-12-09 19:50:14 +0100
commitd5c505e35d8c74ce8e9d99731a1a7eab0e0d911c (patch)
tree0b97c61ed363c80b0ab02ef5dd38818ed15903a1
parent5a3e0664d261422f11a78faaf101d70c73b3a5a8 (diff)
downloadjquery-d5c505e35d8c74ce8e9d99731a1a7eab0e0d911c.tar.gz
jquery-d5c505e35d8c74ce8e9d99731a1a7eab0e0d911c.zip
Event: Only attach events to objects that accept data - for real
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
-rw-r--r--src/event.js5
-rw-r--r--test/unit/event.js9
2 files changed, 12 insertions, 2 deletions
diff --git a/src/event.js b/src/event.js
index 7f66d49de..796d96210 100644
--- a/src/event.js
+++ b/src/event.js
@@ -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;
}
diff --git a/test/unit/event.js b/test/unit/event.js
index 43e2f3857..4019fbe81 100644
--- a/test/unit/event.js
+++ b/test/unit/event.js
@@ -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 );