@whitesev/domutils 1.9.9 → 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 +109 -84
- 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 +109 -84
- 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 +109 -84
- 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 +109 -84
- 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 +109 -84
- 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 +109 -84
- 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 +10 -10
- package/dist/types/src/types/DOMUtilsEvent.d.ts +1 -0
- package/package.json +1 -1
- package/src/ElementEvent.ts +129 -98
- package/src/types/DOMUtilsEvent.d.ts +1 -0
package/dist/index.cjs.js
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
'use strict';
|
|
2
2
|
|
|
3
|
-
const version = "1.9.
|
|
3
|
+
const version = "1.9.11";
|
|
4
4
|
|
|
5
5
|
class WindowApi {
|
|
6
6
|
/** 默认的配置 */
|
|
@@ -1380,7 +1380,7 @@ class ElementEvent extends ElementAnimate {
|
|
|
1380
1380
|
* @param startIndex
|
|
1381
1381
|
* @param option
|
|
1382
1382
|
*/
|
|
1383
|
-
function
|
|
1383
|
+
const getOption = function (args, startIndex, option) {
|
|
1384
1384
|
const currentParam = args[startIndex];
|
|
1385
1385
|
if (typeof currentParam === "boolean") {
|
|
1386
1386
|
option.capture = currentParam;
|
|
@@ -1402,7 +1402,7 @@ class ElementEvent extends ElementAnimate {
|
|
|
1402
1402
|
option.isComposedPath = currentParam.isComposedPath;
|
|
1403
1403
|
}
|
|
1404
1404
|
return option;
|
|
1405
|
-
}
|
|
1405
|
+
};
|
|
1406
1406
|
const that = this;
|
|
1407
1407
|
// eslint-disable-next-line prefer-rest-params
|
|
1408
1408
|
const args = arguments;
|
|
@@ -1457,74 +1457,96 @@ class ElementEvent extends ElementAnimate {
|
|
|
1457
1457
|
// 这是存在selector的情况
|
|
1458
1458
|
listenerOption = getOption(args, 4, listenerOption);
|
|
1459
1459
|
}
|
|
1460
|
-
|
|
1461
|
-
|
|
1462
|
-
|
|
1463
|
-
|
|
1464
|
-
|
|
1465
|
-
|
|
1466
|
-
|
|
1467
|
-
|
|
1468
|
-
|
|
1469
|
-
/**
|
|
1470
|
-
* 事件回调
|
|
1471
|
-
* @param event
|
|
1472
|
-
*/
|
|
1473
|
-
const handlerCallBack = function (event) {
|
|
1474
|
-
if (selectorList.length) {
|
|
1475
|
-
/* 存在子元素选择器 */
|
|
1476
|
-
// 这时候的this和target都是子元素选择器的元素
|
|
1477
|
-
let eventTarget = listenerOption.isComposedPath
|
|
1478
|
-
? event.composedPath()[0]
|
|
1479
|
-
: event.target;
|
|
1480
|
-
let totalParent = elementItem;
|
|
1481
|
-
if (CommonUtils.isWin(totalParent)) {
|
|
1482
|
-
if (totalParent === that.windowApi.document) {
|
|
1483
|
-
totalParent = that.windowApi.document.documentElement;
|
|
1484
|
-
}
|
|
1460
|
+
$elList.forEach(($elItem) => {
|
|
1461
|
+
// 遍历事件名设置元素事件
|
|
1462
|
+
eventTypeList.forEach((eventName) => {
|
|
1463
|
+
/**
|
|
1464
|
+
* 如果是option.once,那么删除该监听和元素上的事件和监听
|
|
1465
|
+
*/
|
|
1466
|
+
const checkOptionOnceToRemoveEventListener = () => {
|
|
1467
|
+
if (listenerOption.once) {
|
|
1468
|
+
this.off($elItem, eventName, selector, callback, option);
|
|
1485
1469
|
}
|
|
1486
|
-
|
|
1487
|
-
|
|
1488
|
-
|
|
1489
|
-
|
|
1490
|
-
|
|
1470
|
+
};
|
|
1471
|
+
/**
|
|
1472
|
+
* 事件回调
|
|
1473
|
+
* @param event
|
|
1474
|
+
*/
|
|
1475
|
+
const handlerCallBack = function (event) {
|
|
1476
|
+
let call_this = void 0;
|
|
1477
|
+
let call_event = void 0;
|
|
1478
|
+
let call_$selector = void 0;
|
|
1479
|
+
let execCallback = false;
|
|
1480
|
+
if (selectorList.length) {
|
|
1481
|
+
// 存在子元素选择器
|
|
1482
|
+
// 这时候的this和target都是子元素选择器的元素
|
|
1483
|
+
let $target;
|
|
1484
|
+
if (listenerOption.isComposedPath) {
|
|
1485
|
+
// 可能为空
|
|
1486
|
+
const composedPath = event.composedPath();
|
|
1487
|
+
if (!composedPath.length && event.target) {
|
|
1488
|
+
composedPath.push(event.target);
|
|
1489
|
+
}
|
|
1490
|
+
$target = composedPath[0];
|
|
1491
1491
|
}
|
|
1492
|
-
|
|
1493
|
-
|
|
1494
|
-
if ($closestMatches && totalParent?.contains?.($closestMatches)) {
|
|
1495
|
-
eventTarget = $closestMatches;
|
|
1496
|
-
return true;
|
|
1492
|
+
else {
|
|
1493
|
+
$target = event.target;
|
|
1497
1494
|
}
|
|
1498
|
-
|
|
1499
|
-
|
|
1500
|
-
|
|
1501
|
-
|
|
1502
|
-
|
|
1503
|
-
OriginPrototype.Object.defineProperty(event, "target", {
|
|
1504
|
-
get() {
|
|
1505
|
-
return eventTarget;
|
|
1506
|
-
},
|
|
1507
|
-
});
|
|
1495
|
+
let $parent = $elItem;
|
|
1496
|
+
if (CommonUtils.isWin($parent)) {
|
|
1497
|
+
// window和document共用一个对象
|
|
1498
|
+
// 这样就能处理子元素选择器无法匹配的问题
|
|
1499
|
+
$parent = that.windowApi.document.documentElement;
|
|
1508
1500
|
}
|
|
1509
|
-
|
|
1510
|
-
//
|
|
1501
|
+
const findValue = selectorList.find((selectors) => {
|
|
1502
|
+
// 判断目标元素是否匹配选择器
|
|
1503
|
+
if (that.matches($target, selectors)) {
|
|
1504
|
+
// 当前目标可以被selector所匹配到
|
|
1505
|
+
return true;
|
|
1506
|
+
}
|
|
1507
|
+
// 在上层与主元素之间寻找可以被selector所匹配到的
|
|
1508
|
+
const $closestMatches = that.closest($target, selectors);
|
|
1509
|
+
if ($closestMatches && $parent?.contains?.($closestMatches)) {
|
|
1510
|
+
$target = $closestMatches;
|
|
1511
|
+
return true;
|
|
1512
|
+
}
|
|
1513
|
+
return false;
|
|
1514
|
+
});
|
|
1515
|
+
if (findValue) {
|
|
1516
|
+
// 这里尝试使用defineProperty修改event的target值
|
|
1517
|
+
try {
|
|
1518
|
+
OriginPrototype.Object.defineProperty(event, "target", {
|
|
1519
|
+
get() {
|
|
1520
|
+
return $target;
|
|
1521
|
+
},
|
|
1522
|
+
});
|
|
1523
|
+
// oxlint-disable-next-line no-empty
|
|
1524
|
+
}
|
|
1525
|
+
catch { }
|
|
1526
|
+
execCallback = true;
|
|
1527
|
+
call_this = $target;
|
|
1528
|
+
call_event = event;
|
|
1529
|
+
call_$selector = $target;
|
|
1511
1530
|
}
|
|
1512
|
-
|
|
1531
|
+
}
|
|
1532
|
+
else {
|
|
1533
|
+
execCallback = true;
|
|
1534
|
+
call_this = $elItem;
|
|
1535
|
+
call_event = event;
|
|
1536
|
+
}
|
|
1537
|
+
if (execCallback) {
|
|
1538
|
+
const result = listenerCallBack.call(call_this, call_event, call_$selector);
|
|
1513
1539
|
checkOptionOnceToRemoveEventListener();
|
|
1540
|
+
if (typeof result === "boolean" && !result) {
|
|
1541
|
+
return false;
|
|
1542
|
+
}
|
|
1514
1543
|
}
|
|
1515
|
-
}
|
|
1516
|
-
|
|
1517
|
-
|
|
1518
|
-
|
|
1519
|
-
|
|
1520
|
-
|
|
1521
|
-
};
|
|
1522
|
-
/* 遍历事件名设置元素事件 */
|
|
1523
|
-
eventTypeList.forEach((eventName) => {
|
|
1524
|
-
elementItem.addEventListener(eventName, handlerCallBack, listenerOption);
|
|
1525
|
-
/* 获取对象上的事件 */
|
|
1526
|
-
const elementEvents = Reflect.get(elementItem, GlobalData.domEventSymbol) || {};
|
|
1527
|
-
/* 初始化对象上的xx事件 */
|
|
1544
|
+
};
|
|
1545
|
+
// add listener
|
|
1546
|
+
$elItem.addEventListener(eventName, handlerCallBack, listenerOption);
|
|
1547
|
+
// 获取对象上的事件
|
|
1548
|
+
const elementEvents = Reflect.get($elItem, GlobalData.domEventSymbol) || {};
|
|
1549
|
+
// 初始化对象上的xx事件
|
|
1528
1550
|
elementEvents[eventName] = elementEvents[eventName] || [];
|
|
1529
1551
|
elementEvents[eventName].push({
|
|
1530
1552
|
selector: selectorList,
|
|
@@ -1532,8 +1554,8 @@ class ElementEvent extends ElementAnimate {
|
|
|
1532
1554
|
handlerCallBack: handlerCallBack,
|
|
1533
1555
|
callback: listenerCallBack,
|
|
1534
1556
|
});
|
|
1535
|
-
|
|
1536
|
-
Reflect.set(
|
|
1557
|
+
// 覆盖事件
|
|
1558
|
+
Reflect.set($elItem, GlobalData.domEventSymbol, elementEvents);
|
|
1537
1559
|
});
|
|
1538
1560
|
});
|
|
1539
1561
|
return {
|
|
@@ -1547,7 +1569,7 @@ class ElementEvent extends ElementAnimate {
|
|
|
1547
1569
|
/**
|
|
1548
1570
|
* 主动触发事件
|
|
1549
1571
|
* @param extraDetails 赋予触发的Event的额外属性,如果是Event类型,那么将自动代替默认new的Event对象
|
|
1550
|
-
* @param useDispatchToTriggerEvent 是否使用dispatchEvent来触发事件,默认true,如果为false,则直接调用callback
|
|
1572
|
+
* @param useDispatchToTriggerEvent 是否使用dispatchEvent来触发事件,默认true,如果为false,则直接调用callback,但是这种会让使用了`$selector`的没有值
|
|
1551
1573
|
*/
|
|
1552
1574
|
emit: (extraDetails, useDispatchToTriggerEvent) => {
|
|
1553
1575
|
that.emit($elList, eventTypeList, extraDetails, useDispatchToTriggerEvent);
|
|
@@ -1561,7 +1583,7 @@ class ElementEvent extends ElementAnimate {
|
|
|
1561
1583
|
* @param startIndex
|
|
1562
1584
|
* @param option
|
|
1563
1585
|
*/
|
|
1564
|
-
function
|
|
1586
|
+
const getOption = function (args1, startIndex, option) {
|
|
1565
1587
|
const currentParam = args1[startIndex];
|
|
1566
1588
|
if (typeof currentParam === "boolean") {
|
|
1567
1589
|
option.capture = currentParam;
|
|
@@ -1570,7 +1592,7 @@ class ElementEvent extends ElementAnimate {
|
|
|
1570
1592
|
option.capture = currentParam.capture;
|
|
1571
1593
|
}
|
|
1572
1594
|
return option;
|
|
1573
|
-
}
|
|
1595
|
+
};
|
|
1574
1596
|
const that = this;
|
|
1575
1597
|
// eslint-disable-next-line prefer-rest-params
|
|
1576
1598
|
const args = arguments;
|
|
@@ -1628,40 +1650,43 @@ class ElementEvent extends ElementAnimate {
|
|
|
1628
1650
|
filter = option;
|
|
1629
1651
|
}
|
|
1630
1652
|
$elList.forEach(($elItem) => {
|
|
1631
|
-
|
|
1653
|
+
// 获取对象上的事件
|
|
1632
1654
|
const elementEvents = Reflect.get($elItem, GlobalData.domEventSymbol) || {};
|
|
1633
1655
|
eventTypeList.forEach((eventName) => {
|
|
1634
1656
|
const handlers = elementEvents[eventName] || [];
|
|
1635
|
-
|
|
1636
|
-
|
|
1637
|
-
|
|
1657
|
+
// 过滤出需要删除的事件
|
|
1658
|
+
const handlersFiltered = typeof filter === "function" ? handlers.filter(filter) : handlers;
|
|
1659
|
+
for (let index = 0; index < handlersFiltered.length; index++) {
|
|
1660
|
+
const handler = handlersFiltered[index];
|
|
1661
|
+
// 过滤出的事件再根据下面的条件进行判断处理移除
|
|
1662
|
+
// 1. callback内存地址必须相同
|
|
1663
|
+
// 2. selector必须相同
|
|
1664
|
+
// 3. option.capture必须相同
|
|
1638
1665
|
let flag = true;
|
|
1639
1666
|
if (flag && listenerCallBack && handler.callback !== listenerCallBack) {
|
|
1640
|
-
// callback不同
|
|
1641
1667
|
flag = false;
|
|
1642
1668
|
}
|
|
1643
1669
|
if (flag && selectorList.length && Array.isArray(handler.selector)) {
|
|
1644
1670
|
if (JSON.stringify(handler.selector) !== JSON.stringify(selectorList)) {
|
|
1645
|
-
// 子元素选择器不同
|
|
1646
1671
|
flag = false;
|
|
1647
1672
|
}
|
|
1648
1673
|
}
|
|
1649
1674
|
if (flag &&
|
|
1650
1675
|
typeof handler.option.capture === "boolean" &&
|
|
1651
1676
|
listenerOption.capture !== handler.option.capture) {
|
|
1652
|
-
// 事件的配置项不同
|
|
1653
1677
|
flag = false;
|
|
1654
1678
|
}
|
|
1655
1679
|
if (flag) {
|
|
1656
1680
|
$elItem.removeEventListener(eventName, handler.handlerCallBack, handler.option);
|
|
1657
|
-
|
|
1658
|
-
|
|
1659
|
-
|
|
1681
|
+
for (let i = handlers.length - 1; i >= 0; i--) {
|
|
1682
|
+
if (handlers[i] === handler) {
|
|
1683
|
+
handlers.splice(i, 1);
|
|
1684
|
+
}
|
|
1660
1685
|
}
|
|
1661
1686
|
}
|
|
1662
1687
|
}
|
|
1663
1688
|
if (handlers.length === 0) {
|
|
1664
|
-
|
|
1689
|
+
// 如果没有任意的handler,那么删除该属性
|
|
1665
1690
|
CommonUtils.delete(elementEvents, eventType);
|
|
1666
1691
|
}
|
|
1667
1692
|
});
|
|
@@ -2422,11 +2447,11 @@ class ElementEvent extends ElementAnimate {
|
|
|
2422
2447
|
* 阻止事件的默认行为发生,并阻止事件传播
|
|
2423
2448
|
*/
|
|
2424
2449
|
const stopEvent = (event, onlyStopPropagation) => {
|
|
2450
|
+
// 停止事件的传播,阻止它继续向更上层的元素冒泡,事件将不会再传播给其他的元素
|
|
2451
|
+
event?.stopPropagation();
|
|
2452
|
+
// 阻止事件传播,并且还能阻止元素上的其他事件处理程序被触发
|
|
2453
|
+
event?.stopImmediatePropagation();
|
|
2425
2454
|
if (typeof onlyStopPropagation === "boolean" && onlyStopPropagation) {
|
|
2426
|
-
// 停止事件的传播,阻止它继续向更上层的元素冒泡,事件将不会再传播给其他的元素
|
|
2427
|
-
event?.stopPropagation();
|
|
2428
|
-
// 阻止事件传播,并且还能阻止元素上的其他事件处理程序被触发
|
|
2429
|
-
event?.stopImmediatePropagation();
|
|
2430
2455
|
return;
|
|
2431
2456
|
}
|
|
2432
2457
|
// 阻止事件的默认行为发生。例如,当点击一个链接时,浏览器会默认打开链接的URL,或者在输入框内输入文字
|