Skip to content

Commit 8243dd9

Browse files
Bumped version to 8.0.0
1 parent a66b43e commit 8243dd9

8 files changed

Lines changed: 63 additions & 69 deletions

File tree

CHANGELOG.md

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,6 @@
1+
### Version 8.0.0
2+
- Improved alignment with jQuery regarding handling of non-bubbling events significantly
3+
14
### Version 7.0.4
25
- Ensuring unusual but valid simple selectors are handled properly
36

README.md

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -31,10 +31,10 @@ If you're migrating from jQuery be sure to read our [migration guide](https://gi
3131

3232
## Usage
3333

34-
Get Cash from [CloudFlare](https://cdnjs.cloudflare.com/ajax/libs/cash/7.0.4/cash.min.js) or [jsDelivr](https://cdn.jsdelivr.net/npm/cash-dom@7.0.4/dist/cash.min.js) and use it like this:
34+
Get Cash from [CloudFlare](https://cdnjs.cloudflare.com/ajax/libs/cash/8.0.0/cash.min.js) or [jsDelivr](https://cdn.jsdelivr.net/npm/cash-dom@8.0.0/dist/cash.min.js) and use it like this:
3535

3636
```html
37-
<script src="https://cdnjs.cloudflare.com/ajax/libs/cash/7.0.4/cash.min.js"></script>
37+
<script src="https://cdnjs.cloudflare.com/ajax/libs/cash/8.0.0/cash.min.js"></script>
3838
<script>
3939
$(function () {
4040
$('html').addClass ( 'dom-loaded' );

dist/cash.d.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
interface Event {
22
namespace: string;
33
data: any;
4+
relatedTarget?: Node | null;
45
___cd?: boolean;
56
___ifocus?: boolean;
67
___iblur?: boolean;

dist/cash.esm.js

Lines changed: 8 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -586,13 +586,11 @@ fn.off = function (eventFullName, selector, callback) {
586586
selector = '';
587587
}
588588
each(getSplitValues(eventFullName), (i, eventFullName) => {
589-
const [nameOriginal, namespaces] = parseEventName(eventFullName), name = getEventNameBubbling(nameOriginal), isEventBubblingProxy = (nameOriginal !== name);
589+
const [nameOriginal, namespaces] = parseEventName(eventFullName), name = getEventNameBubbling(nameOriginal);
590590
this.each((i, ele) => {
591591
if (!isElement(ele) && !isDocument(ele) && !isWindow(ele))
592592
return;
593593
removeEvent(ele, name, namespaces, selector, callback);
594-
if (isEventBubblingProxy)
595-
removeEvent(ele, nameOriginal, namespaces, selector, callback);
596594
});
597595
});
598596
}
@@ -626,17 +624,19 @@ function on(eventFullName, selector, data, callback, _one) {
626624
if (!callback)
627625
return this;
628626
each(getSplitValues(eventFullName), (i, eventFullName) => {
629-
const [nameOriginal, namespaces] = parseEventName(eventFullName), name = getEventNameBubbling(nameOriginal), isEventBubblingProxy = (nameOriginal !== name), isEventFocus = (nameOriginal in eventsFocus);
627+
const [nameOriginal, namespaces] = parseEventName(eventFullName), name = getEventNameBubbling(nameOriginal), isEventHover = (nameOriginal in eventsHover), isEventFocus = (nameOriginal in eventsFocus);
630628
if (!name)
631629
return;
632630
this.each((i, ele) => {
633631
if (!isElement(ele) && !isDocument(ele) && !isWindow(ele))
634632
return;
635633
const finalCallback = function (event) {
636-
if (isEventBubblingProxy && (event.___ot ? event.___ot !== nameOriginal : event.type !== nameOriginal || (event.target[`___i${nameOriginal}`] && (delete event.target[`___i${nameOriginal}`], event.stopImmediatePropagation(), true))))
637-
return;
634+
if (event.target[`___i${event.type}`])
635+
return event.stopImmediatePropagation(); // Ignoring native event in favor of the upcoming custom one
638636
if (event.namespace && !hasNamespaces(namespaces, event.namespace.split(eventsNamespacesSeparator)))
639637
return;
638+
if (!selector && ((isEventFocus && (event.target !== ele || event.___ot === name)) || (isEventHover && event.relatedTarget && ele.contains(event.relatedTarget))))
639+
return;
640640
let thisArg = ele;
641641
if (selector) {
642642
let target = event.target;
@@ -650,9 +650,6 @@ function on(eventFullName, selector, data, callback, _one) {
650650
thisArg = target;
651651
event.___cd = true; // Delegate
652652
}
653-
else if (isEventFocus && event.___ot === nameOriginal && ele !== event.target && ele.contains(event.target)) {
654-
return;
655-
}
656653
if (event.___cd) {
657654
Object.defineProperty(event, 'currentTarget', {
658655
configurable: true,
@@ -678,8 +675,6 @@ function on(eventFullName, selector, data, callback, _one) {
678675
};
679676
finalCallback.guid = callback.guid = (callback.guid || cash.guid++);
680677
addEvent(ele, name, namespaces, selector, finalCallback);
681-
if (isEventBubblingProxy)
682-
addEvent(ele, nameOriginal, namespaces, selector, finalCallback);
683678
});
684679
});
685680
return this;
@@ -715,8 +710,9 @@ fn.trigger = function (event, data) {
715710
const isEventFocus = (event.___ot in eventsFocus);
716711
return this.each((i, ele) => {
717712
if (isEventFocus && isFunction(ele[event.___ot])) {
718-
ele[`___i${event.___ot}`] = true; // Ensuring this event gets ignored
713+
ele[`___i${event.type}`] = true; // Ensuring the native event is ignored
719714
ele[event.___ot]();
715+
ele[`___i${event.type}`] = false; // Ensuring the custom event is not ignored
720716
}
721717
ele.dispatchEvent(event);
722718
});

dist/cash.js

Lines changed: 8 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -728,13 +728,11 @@ fn.off = function (eventFullName, selector, callback) {
728728
var _a = parseEventName(eventFullName),
729729
nameOriginal = _a[0],
730730
namespaces = _a[1],
731-
name = getEventNameBubbling(nameOriginal),
732-
isEventBubblingProxy = nameOriginal !== name;
731+
name = getEventNameBubbling(nameOriginal);
733732

734733
_this.each(function (i, ele) {
735734
if (!isElement(ele) && !isDocument(ele) && !isWindow(ele)) return;
736735
removeEvent(ele, name, namespaces, selector, callback);
737-
if (isEventBubblingProxy) removeEvent(ele, nameOriginal, namespaces, selector, callback);
738736
});
739737
});
740738
}
@@ -777,7 +775,7 @@ function on(eventFullName, selector, data, callback, _one) {
777775
nameOriginal = _a[0],
778776
namespaces = _a[1],
779777
name = getEventNameBubbling(nameOriginal),
780-
isEventBubblingProxy = nameOriginal !== name,
778+
isEventHover = nameOriginal in eventsHover,
781779
isEventFocus = nameOriginal in eventsFocus;
782780

783781
if (!name) return;
@@ -786,8 +784,10 @@ function on(eventFullName, selector, data, callback, _one) {
786784
if (!isElement(ele) && !isDocument(ele) && !isWindow(ele)) return;
787785

788786
var finalCallback = function finalCallback(event) {
789-
if (isEventBubblingProxy && (event.___ot ? event.___ot !== nameOriginal : event.type !== nameOriginal || event.target["___i" + nameOriginal] && (delete event.target["___i" + nameOriginal], event.stopImmediatePropagation(), true))) return;
787+
if (event.target["___i" + event.type]) return event.stopImmediatePropagation(); // Ignoring native event in favor of the upcoming custom one
788+
790789
if (event.namespace && !hasNamespaces(namespaces, event.namespace.split(eventsNamespacesSeparator))) return;
790+
if (!selector && (isEventFocus && (event.target !== ele || event.___ot === name) || isEventHover && event.relatedTarget && ele.contains(event.relatedTarget))) return;
791791
var thisArg = ele;
792792

793793
if (selector) {
@@ -801,8 +801,6 @@ function on(eventFullName, selector, data, callback, _one) {
801801

802802
thisArg = target;
803803
event.___cd = true; // Delegate
804-
} else if (isEventFocus && event.___ot === nameOriginal && ele !== event.target && ele.contains(event.target)) {
805-
return;
806804
}
807805

808806
if (event.___cd) {
@@ -834,7 +832,6 @@ function on(eventFullName, selector, data, callback, _one) {
834832

835833
finalCallback.guid = callback.guid = callback.guid || cash.guid++;
836834
addEvent(ele, name, namespaces, selector, finalCallback);
837-
if (isEventBubblingProxy) addEvent(ele, nameOriginal, namespaces, selector, finalCallback);
838835
});
839836
});
840837
return this;
@@ -882,9 +879,11 @@ fn.trigger = function (event, data) {
882879
var isEventFocus = event.___ot in eventsFocus;
883880
return this.each(function (i, ele) {
884881
if (isEventFocus && isFunction(ele[event.___ot])) {
885-
ele["___i" + event.___ot] = true; // Ensuring this event gets ignored
882+
ele["___i" + event.type] = true; // Ensuring the native event is ignored
886883

887884
ele[event.___ot]();
885+
886+
ele["___i" + event.type] = false; // Ensuring the custom event is not ignored
888887
}
889888

890889
ele.dispatchEvent(event);

0 commit comments

Comments
 (0)