Skip to content

Commit 875944c

Browse files
focus|blur|mouseenter|mouseleave: ensuring natively triggered events are handled properly
1 parent 57c9b4f commit 875944c

5 files changed

Lines changed: 41 additions & 6 deletions

File tree

src/core/types.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,8 @@ interface Event {
33
namespace: string,
44
data: any,
55
___cd?: boolean, // Delegate
6+
___ifocus?: boolean, // Ignore focus
7+
___iblur?: boolean, // Ignore blur
68
___ot?: string, // Original type
79
___td?: boolean // Trigger data
810
}

src/events/off.ts

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -47,14 +47,17 @@ fn.off = function ( this: Cash, eventFullName?: string | Record<string, EventCal
4747
each ( getSplitValues ( eventFullName ), ( i, eventFullName ) => {
4848

4949
const [nameOriginal, namespaces] = parseEventName ( eventFullName ),
50-
name = getEventNameBubbling ( nameOriginal );
50+
name = getEventNameBubbling ( nameOriginal ),
51+
isEventBubblingProxy = ( nameOriginal !== name );
5152

5253
this.each ( ( i, ele ) => {
5354

5455
if ( !isElement ( ele ) && !isDocument ( ele ) && !isWindow ( ele ) ) return;
5556

5657
removeEvent ( ele, name, namespaces, selector, callback );
5758

59+
if ( isEventBubblingProxy ) removeEvent ( ele, nameOriginal, namespaces, selector, callback );
60+
5861
});
5962

6063
});

src/events/on.ts

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -90,7 +90,7 @@ function on ( this: Cash, eventFullName: Record<string, EventCallback> | string,
9090

9191
const finalCallback = function ( event: Event ) {
9292

93-
if ( isEventBubblingProxy && event.___ot !== nameOriginal ) return;
93+
if ( isEventBubblingProxy && ( event.___ot ? event.___ot !== nameOriginal : event.type !== nameOriginal || ( event.target[`___i${nameOriginal}`] && ( delete event.target[`___i${nameOriginal}`], event.stopImmediatePropagation (), true ) ) ) ) return;
9494

9595
if ( event.namespace && !hasNamespaces ( namespaces, event.namespace.split ( eventsNamespacesSeparator ) ) ) return;
9696

@@ -159,6 +159,8 @@ function on ( this: Cash, eventFullName: Record<string, EventCallback> | string,
159159

160160
addEvent ( ele, name, namespaces, selector, finalCallback );
161161

162+
if ( isEventBubblingProxy ) addEvent ( ele, nameOriginal, namespaces, selector, finalCallback );
163+
162164
});
163165

164166
});

src/events/trigger.ts

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -35,7 +35,13 @@ fn.trigger = function ( this: Cash, event: Event | string, data?: any ) {
3535

3636
return this.each ( ( i, ele ) => {
3737

38-
if ( isEventFocus && isFunction ( ele[event.___ot] ) ) ele[event.___ot]();
38+
if ( isEventFocus && isFunction ( ele[event.___ot] ) ) {
39+
40+
ele[`___i${event.___ot}`] = true; // Ensuring this event gets ignored
41+
42+
ele[event.___ot]();
43+
44+
}
3945

4046
ele.dispatchEvent ( event );
4147

test/modules/events.js

Lines changed: 25 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ var fixture = '\
66
<div class="grandchild"></div>\
77
</div>\
88
</div>\
9+
<input class="input" />\
910
<div class="event-focus" tabindex="-1">\
1011
<div class="event-focus-child" tabindex="-1"></div>\
1112
</div>\
@@ -102,7 +103,7 @@ describe ( 'Events', { beforeEach: getFixtureInit ( fixture ) }, function () {
102103

103104
events.forEach ( function ( event, index ) {
104105

105-
it ( `[${event} -> ${eventsTrigger[index]}]`, function ( t ) {
106+
it ( '[' + event + ' -> ' + eventsTrigger[index] + ']', function ( t ) {
106107

107108
var doc = $(document);
108109
var ele = $('.event-focus');
@@ -183,6 +184,28 @@ describe ( 'Events', { beforeEach: getFixtureInit ( fixture ) }, function () {
183184

184185
});
185186

187+
( document.hasFocus () ? it : it.skip )( 'listens to native focus/blur', function ( t ) { // If the document isn't focused the element won't get the focus either
188+
189+
var events = ['focus', 'blur'];
190+
191+
events.forEach ( function ( event ) {
192+
193+
var input = $('.input');
194+
var count = 0;
195+
196+
function handler () {
197+
count++;
198+
}
199+
200+
input.on ( event, handler );
201+
input[0][event] ();
202+
203+
t.is ( count, 1 );
204+
205+
});
206+
207+
});
208+
186209
it ( 'supports namespaces', function ( t ) {
187210

188211
var ele = $('.event');
@@ -737,10 +760,9 @@ describe ( 'Events', { beforeEach: getFixtureInit ( fixture ) }, function () {
737760
nativeHandler.apply ( this, arguments );
738761
};
739762

740-
ele.on ( event, handler );
741763
ele.trigger ( event );
742764

743-
t.is ( count, 2 );
765+
t.is ( count, 1 );
744766

745767
});
746768

0 commit comments

Comments
 (0)