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