@whitesev/domutils 1.9.10 → 1.9.11
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.amd.js +89 -86
- package/dist/index.amd.js.map +1 -1
- package/dist/index.amd.min.js +1 -1
- package/dist/index.amd.min.js.map +1 -1
- package/dist/index.cjs.js +89 -86
- package/dist/index.cjs.js.map +1 -1
- package/dist/index.cjs.min.js +1 -1
- package/dist/index.cjs.min.js.map +1 -1
- package/dist/index.esm.js +89 -86
- package/dist/index.esm.js.map +1 -1
- package/dist/index.esm.min.js +1 -1
- package/dist/index.esm.min.js.map +1 -1
- package/dist/index.iife.js +89 -86
- package/dist/index.iife.js.map +1 -1
- package/dist/index.iife.min.js +1 -1
- package/dist/index.iife.min.js.map +1 -1
- package/dist/index.system.js +89 -86
- package/dist/index.system.js.map +1 -1
- package/dist/index.system.min.js +1 -1
- package/dist/index.system.min.js.map +1 -1
- package/dist/index.umd.js +89 -86
- package/dist/index.umd.js.map +1 -1
- package/dist/index.umd.min.js +1 -1
- package/dist/index.umd.min.js.map +1 -1
- package/dist/types/src/ElementEvent.d.ts +8 -8
- package/package.json +1 -1
- package/src/ElementEvent.ts +101 -95
package/dist/index.umd.js
CHANGED
|
@@ -4,7 +4,7 @@
|
|
|
4
4
|
(global = typeof globalThis !== 'undefined' ? globalThis : global || self, global.DOMUtils = factory());
|
|
5
5
|
})(this, (function () { 'use strict';
|
|
6
6
|
|
|
7
|
-
const version = "1.9.
|
|
7
|
+
const version = "1.9.11";
|
|
8
8
|
|
|
9
9
|
class WindowApi {
|
|
10
10
|
/** 默认的配置 */
|
|
@@ -1461,91 +1461,91 @@
|
|
|
1461
1461
|
// 这是存在selector的情况
|
|
1462
1462
|
listenerOption = getOption(args, 4, listenerOption);
|
|
1463
1463
|
}
|
|
1464
|
-
/**
|
|
1465
|
-
* 如果是once,那么删除该监听和元素上的事件和监听
|
|
1466
|
-
*/
|
|
1467
|
-
const checkOptionOnceToRemoveEventListener = ($el) => {
|
|
1468
|
-
if (listenerOption.once) {
|
|
1469
|
-
this.off($el, eventTypeList, selector, callback, option);
|
|
1470
|
-
}
|
|
1471
|
-
};
|
|
1472
1464
|
$elList.forEach(($elItem) => {
|
|
1473
|
-
|
|
1474
|
-
|
|
1475
|
-
|
|
1476
|
-
|
|
1477
|
-
|
|
1478
|
-
|
|
1479
|
-
|
|
1480
|
-
|
|
1481
|
-
let execCallback = false;
|
|
1482
|
-
if (selectorList.length) {
|
|
1483
|
-
// 存在子元素选择器
|
|
1484
|
-
// 这时候的this和target都是子元素选择器的元素
|
|
1485
|
-
let $target;
|
|
1486
|
-
if (listenerOption.isComposedPath) {
|
|
1487
|
-
// 可能为空
|
|
1488
|
-
const composedPath = event.composedPath();
|
|
1489
|
-
if (!composedPath.length && event.target) {
|
|
1490
|
-
composedPath.push(event.target);
|
|
1491
|
-
}
|
|
1492
|
-
$target = composedPath[0];
|
|
1493
|
-
}
|
|
1494
|
-
else {
|
|
1495
|
-
$target = event.target;
|
|
1496
|
-
}
|
|
1497
|
-
let $parent = $elItem;
|
|
1498
|
-
if (CommonUtils.isWin($parent)) {
|
|
1499
|
-
// window和document共用一个对象
|
|
1500
|
-
// 这样就能处理子元素选择器无法匹配的问题
|
|
1501
|
-
$parent = that.windowApi.document.documentElement;
|
|
1465
|
+
// 遍历事件名设置元素事件
|
|
1466
|
+
eventTypeList.forEach((eventName) => {
|
|
1467
|
+
/**
|
|
1468
|
+
* 如果是option.once,那么删除该监听和元素上的事件和监听
|
|
1469
|
+
*/
|
|
1470
|
+
const checkOptionOnceToRemoveEventListener = () => {
|
|
1471
|
+
if (listenerOption.once) {
|
|
1472
|
+
this.off($elItem, eventName, selector, callback, option);
|
|
1502
1473
|
}
|
|
1503
|
-
|
|
1504
|
-
|
|
1505
|
-
|
|
1506
|
-
|
|
1507
|
-
|
|
1474
|
+
};
|
|
1475
|
+
/**
|
|
1476
|
+
* 事件回调
|
|
1477
|
+
* @param event
|
|
1478
|
+
*/
|
|
1479
|
+
const handlerCallBack = function (event) {
|
|
1480
|
+
let call_this = void 0;
|
|
1481
|
+
let call_event = void 0;
|
|
1482
|
+
let call_$selector = void 0;
|
|
1483
|
+
let execCallback = false;
|
|
1484
|
+
if (selectorList.length) {
|
|
1485
|
+
// 存在子元素选择器
|
|
1486
|
+
// 这时候的this和target都是子元素选择器的元素
|
|
1487
|
+
let $target;
|
|
1488
|
+
if (listenerOption.isComposedPath) {
|
|
1489
|
+
// 可能为空
|
|
1490
|
+
const composedPath = event.composedPath();
|
|
1491
|
+
if (!composedPath.length && event.target) {
|
|
1492
|
+
composedPath.push(event.target);
|
|
1493
|
+
}
|
|
1494
|
+
$target = composedPath[0];
|
|
1508
1495
|
}
|
|
1509
|
-
|
|
1510
|
-
|
|
1511
|
-
if ($closestMatches && $parent?.contains?.($closestMatches)) {
|
|
1512
|
-
$target = $closestMatches;
|
|
1513
|
-
return true;
|
|
1496
|
+
else {
|
|
1497
|
+
$target = event.target;
|
|
1514
1498
|
}
|
|
1515
|
-
|
|
1516
|
-
|
|
1517
|
-
|
|
1518
|
-
|
|
1519
|
-
|
|
1520
|
-
|
|
1521
|
-
|
|
1522
|
-
|
|
1523
|
-
|
|
1524
|
-
|
|
1525
|
-
|
|
1499
|
+
let $parent = $elItem;
|
|
1500
|
+
if (CommonUtils.isWin($parent)) {
|
|
1501
|
+
// window和document共用一个对象
|
|
1502
|
+
// 这样就能处理子元素选择器无法匹配的问题
|
|
1503
|
+
$parent = that.windowApi.document.documentElement;
|
|
1504
|
+
}
|
|
1505
|
+
const findValue = selectorList.find((selectors) => {
|
|
1506
|
+
// 判断目标元素是否匹配选择器
|
|
1507
|
+
if (that.matches($target, selectors)) {
|
|
1508
|
+
// 当前目标可以被selector所匹配到
|
|
1509
|
+
return true;
|
|
1510
|
+
}
|
|
1511
|
+
// 在上层与主元素之间寻找可以被selector所匹配到的
|
|
1512
|
+
const $closestMatches = that.closest($target, selectors);
|
|
1513
|
+
if ($closestMatches && $parent?.contains?.($closestMatches)) {
|
|
1514
|
+
$target = $closestMatches;
|
|
1515
|
+
return true;
|
|
1516
|
+
}
|
|
1517
|
+
return false;
|
|
1518
|
+
});
|
|
1519
|
+
if (findValue) {
|
|
1520
|
+
// 这里尝试使用defineProperty修改event的target值
|
|
1521
|
+
try {
|
|
1522
|
+
OriginPrototype.Object.defineProperty(event, "target", {
|
|
1523
|
+
get() {
|
|
1524
|
+
return $target;
|
|
1525
|
+
},
|
|
1526
|
+
});
|
|
1527
|
+
// oxlint-disable-next-line no-empty
|
|
1528
|
+
}
|
|
1529
|
+
catch { }
|
|
1530
|
+
execCallback = true;
|
|
1531
|
+
call_this = $target;
|
|
1532
|
+
call_event = event;
|
|
1533
|
+
call_$selector = $target;
|
|
1526
1534
|
}
|
|
1527
|
-
|
|
1535
|
+
}
|
|
1536
|
+
else {
|
|
1528
1537
|
execCallback = true;
|
|
1529
|
-
call_this = $
|
|
1538
|
+
call_this = $elItem;
|
|
1530
1539
|
call_event = event;
|
|
1531
|
-
call_$selector = $target;
|
|
1532
1540
|
}
|
|
1533
|
-
|
|
1534
|
-
|
|
1535
|
-
|
|
1536
|
-
|
|
1537
|
-
|
|
1538
|
-
|
|
1539
|
-
if (execCallback) {
|
|
1540
|
-
const result = listenerCallBack.call(call_this, call_event, call_$selector);
|
|
1541
|
-
checkOptionOnceToRemoveEventListener($elItem);
|
|
1542
|
-
if (typeof result === "boolean" && !result) {
|
|
1543
|
-
return false;
|
|
1541
|
+
if (execCallback) {
|
|
1542
|
+
const result = listenerCallBack.call(call_this, call_event, call_$selector);
|
|
1543
|
+
checkOptionOnceToRemoveEventListener();
|
|
1544
|
+
if (typeof result === "boolean" && !result) {
|
|
1545
|
+
return false;
|
|
1546
|
+
}
|
|
1544
1547
|
}
|
|
1545
|
-
}
|
|
1546
|
-
};
|
|
1547
|
-
// 遍历事件名设置元素事件
|
|
1548
|
-
eventTypeList.forEach((eventName) => {
|
|
1548
|
+
};
|
|
1549
1549
|
// add listener
|
|
1550
1550
|
$elItem.addEventListener(eventName, handlerCallBack, listenerOption);
|
|
1551
1551
|
// 获取对象上的事件
|
|
@@ -1658,31 +1658,34 @@
|
|
|
1658
1658
|
const elementEvents = Reflect.get($elItem, GlobalData.domEventSymbol) || {};
|
|
1659
1659
|
eventTypeList.forEach((eventName) => {
|
|
1660
1660
|
const handlers = elementEvents[eventName] || [];
|
|
1661
|
-
|
|
1662
|
-
|
|
1663
|
-
|
|
1661
|
+
// 过滤出需要删除的事件
|
|
1662
|
+
const handlersFiltered = typeof filter === "function" ? handlers.filter(filter) : handlers;
|
|
1663
|
+
for (let index = 0; index < handlersFiltered.length; index++) {
|
|
1664
|
+
const handler = handlersFiltered[index];
|
|
1665
|
+
// 过滤出的事件再根据下面的条件进行判断处理移除
|
|
1666
|
+
// 1. callback内存地址必须相同
|
|
1667
|
+
// 2. selector必须相同
|
|
1668
|
+
// 3. option.capture必须相同
|
|
1664
1669
|
let flag = true;
|
|
1665
1670
|
if (flag && listenerCallBack && handler.callback !== listenerCallBack) {
|
|
1666
|
-
// callback不同
|
|
1667
1671
|
flag = false;
|
|
1668
1672
|
}
|
|
1669
1673
|
if (flag && selectorList.length && Array.isArray(handler.selector)) {
|
|
1670
1674
|
if (JSON.stringify(handler.selector) !== JSON.stringify(selectorList)) {
|
|
1671
|
-
// 子元素选择器不同
|
|
1672
1675
|
flag = false;
|
|
1673
1676
|
}
|
|
1674
1677
|
}
|
|
1675
1678
|
if (flag &&
|
|
1676
1679
|
typeof handler.option.capture === "boolean" &&
|
|
1677
1680
|
listenerOption.capture !== handler.option.capture) {
|
|
1678
|
-
// 事件的配置项不同
|
|
1679
1681
|
flag = false;
|
|
1680
1682
|
}
|
|
1681
1683
|
if (flag) {
|
|
1682
1684
|
$elItem.removeEventListener(eventName, handler.handlerCallBack, handler.option);
|
|
1683
|
-
|
|
1684
|
-
|
|
1685
|
-
|
|
1685
|
+
for (let i = handlers.length - 1; i >= 0; i--) {
|
|
1686
|
+
if (handlers[i] === handler) {
|
|
1687
|
+
handlers.splice(i, 1);
|
|
1688
|
+
}
|
|
1686
1689
|
}
|
|
1687
1690
|
}
|
|
1688
1691
|
}
|