mirror of
https://github.com/jquery/jquery.git
synced 2025-01-10 18:24:24 +00:00
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
This commit is contained in:
parent
5a3e0664d2
commit
d5c505e35d
@ -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;
|
||||
}
|
||||
|
||||
|
@ -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 );
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user