@whitesev/domutils 1.9.0 → 1.9.2

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.esm.js CHANGED
@@ -1,4 +1,4 @@
1
- const version = "1.9.0";
1
+ const version = "1.9.2";
2
2
 
3
3
  class WindowApi {
4
4
  /** 默认的配置 */
@@ -1704,7 +1704,7 @@ class ElementEvent extends ElementAnimate {
1704
1704
  }
1705
1705
  for (const handler of handlers) {
1706
1706
  $elItem.removeEventListener(eventName, handler.handlerCallBack, {
1707
- capture: handler["option"]["capture"],
1707
+ capture: handler.option.capture,
1708
1708
  });
1709
1709
  }
1710
1710
  const events = Reflect.get($elItem, symbolItem);
@@ -1718,36 +1718,6 @@ class ElementEvent extends ElementAnimate {
1718
1718
  // 异步回调
1719
1719
  let resolve = void 0;
1720
1720
  const that = this;
1721
- /**
1722
- * 检测文档是否加载完毕
1723
- */
1724
- function checkDOMReadyState() {
1725
- try {
1726
- if (that.windowApi.document.readyState === "complete" ||
1727
- (that.windowApi.document.readyState !== "loading" &&
1728
- !that.windowApi.document.documentElement.doScroll)) {
1729
- return true;
1730
- }
1731
- else {
1732
- return false;
1733
- }
1734
- }
1735
- catch {
1736
- return false;
1737
- }
1738
- }
1739
- /**
1740
- * 成功加载完毕后触发的回调函数
1741
- */
1742
- function completed() {
1743
- removeDomReadyListener();
1744
- if (typeof callback === "function") {
1745
- callback();
1746
- }
1747
- if (typeof resolve === "function") {
1748
- resolve();
1749
- }
1750
- }
1751
1721
  /**
1752
1722
  * 监听目标
1753
1723
  */
@@ -1755,52 +1725,90 @@ class ElementEvent extends ElementAnimate {
1755
1725
  {
1756
1726
  target: that.windowApi.document,
1757
1727
  eventType: "DOMContentLoaded",
1758
- callback: completed,
1728
+ callback: () => {
1729
+ ReadyChecker.completed();
1730
+ },
1759
1731
  },
1760
1732
  {
1761
1733
  target: that.windowApi.window,
1762
1734
  eventType: "load",
1763
- callback: completed,
1735
+ callback: () => {
1736
+ ReadyChecker.completed();
1737
+ },
1764
1738
  },
1765
1739
  ];
1766
- /**
1767
- * 添加监听
1768
- */
1769
- function addDomReadyListener() {
1770
- for (const item of listenTargetList) {
1771
- that.on(item.target, item.eventType, item.callback);
1772
- }
1773
- }
1774
- /**
1775
- * 移除监听
1776
- */
1777
- function removeDomReadyListener() {
1778
- for (const item of listenTargetList) {
1779
- that.off(item.target, item.eventType, item.callback);
1780
- }
1781
- }
1782
- /**
1783
- * 执行检查
1784
- */
1785
- function check() {
1786
- if (checkDOMReadyState()) {
1787
- /* 检查document状态 */
1788
- setTimeout(completed, 0);
1789
- }
1790
- else {
1791
- /* 添加监听 */
1792
- addDomReadyListener();
1793
- }
1794
- }
1795
- if (args.length === 0) {
1796
- return new Promise((__resolve__) => {
1797
- resolve = __resolve__;
1798
- check();
1799
- });
1800
- }
1801
- else {
1802
- check();
1803
- }
1740
+ const ReadyChecker = {
1741
+ init() {
1742
+ if (args.length === 0) {
1743
+ return new Promise((__resolve__) => {
1744
+ resolve = __resolve__;
1745
+ ReadyChecker.check();
1746
+ });
1747
+ }
1748
+ else {
1749
+ ReadyChecker.check();
1750
+ }
1751
+ },
1752
+ check() {
1753
+ if (ReadyChecker.isReady()) {
1754
+ /* 检查document状态 */
1755
+ setTimeout(() => {
1756
+ ReadyChecker.completed();
1757
+ }, 0);
1758
+ }
1759
+ else {
1760
+ /* 添加监听 */
1761
+ ReadyChecker.onCompleted();
1762
+ }
1763
+ },
1764
+ /**
1765
+ * 检测文档是否加载完毕
1766
+ */
1767
+ isReady() {
1768
+ try {
1769
+ if (that.windowApi.document.readyState === "complete" ||
1770
+ // @ts-expect-error
1771
+ (that.windowApi.document.readyState !== "loading" && !that.windowApi.document.documentElement.doScroll)) {
1772
+ return true;
1773
+ }
1774
+ else {
1775
+ return false;
1776
+ }
1777
+ }
1778
+ catch {
1779
+ return false;
1780
+ }
1781
+ },
1782
+ /**
1783
+ * 成功加载完毕后触发的回调函数
1784
+ */
1785
+ completed() {
1786
+ ReadyChecker.offCompleted();
1787
+ if (typeof callback === "function") {
1788
+ callback();
1789
+ }
1790
+ if (typeof resolve === "function") {
1791
+ resolve();
1792
+ }
1793
+ },
1794
+ /**
1795
+ * 添加监听
1796
+ */
1797
+ onCompleted() {
1798
+ for (const item of listenTargetList) {
1799
+ that.on(item.target, item.eventType, item.callback);
1800
+ }
1801
+ },
1802
+ /**
1803
+ * 移除监听
1804
+ */
1805
+ offCompleted() {
1806
+ for (const item of listenTargetList) {
1807
+ that.off(item.target, item.eventType, item.callback);
1808
+ }
1809
+ },
1810
+ };
1811
+ return ReadyChecker.init();
1804
1812
  }
1805
1813
  /**
1806
1814
  * 主动触发事件
@@ -3575,6 +3583,41 @@ class DOMUtils extends ElementHandler {
3575
3583
  return parseHTMLByCreateDom();
3576
3584
  }
3577
3585
  }
3586
+ /**
3587
+ * 将字符串转为Element元素数组
3588
+ * @param html
3589
+ * @param useParser 是否使用DOMParser来生成元素,有些时候通过DOMParser生成的元素有点问题
3590
+ * + true 使用DOMPraser来转换字符串
3591
+ * + false (默认)创建一个div,里面放入字符串,然后提取childNodes
3592
+ * @example
3593
+ * // 将字符串转为Element元素数组
3594
+ * DOMUtils.toElements("<a href='xxxx'></a>")
3595
+ * > [<a href="xxxx"></a>]
3596
+ * @example
3597
+ * // 使用DOMParser将字符串转为Element元素数组
3598
+ * DOMUtils.toElements("<a href='xxxx'></a>",true)
3599
+ * > [<a href="xxxx"></a>]
3600
+ */
3601
+ toElements(html, useParser = false) {
3602
+ const that = this;
3603
+ // 去除html前后的空格
3604
+ html = html.trim();
3605
+ function parseHTMLByDOMParser() {
3606
+ const parser = new DOMParser();
3607
+ return Array.from(parser.parseFromString(html, "text/html").body.childNodes);
3608
+ }
3609
+ function parseHTMLByCreateDom() {
3610
+ const $el = that.windowApi.document.createElement("div");
3611
+ that.html($el, html);
3612
+ return Array.from($el.childNodes);
3613
+ }
3614
+ if (useParser) {
3615
+ return parseHTMLByDOMParser();
3616
+ }
3617
+ else {
3618
+ return parseHTMLByCreateDom();
3619
+ }
3620
+ }
3578
3621
  /**
3579
3622
  * 序列化表单元素
3580
3623
  * @param $form 表单元素
@@ -3583,26 +3626,29 @@ class DOMUtils extends ElementHandler {
3583
3626
  * > xxx=xxx&aaa=
3584
3627
  */
3585
3628
  serialize($form) {
3629
+ if (!($form instanceof HTMLFormElement)) {
3630
+ throw new TypeError("DOMUtils.serialize 参数必须是HTMLFormElement");
3631
+ }
3586
3632
  const elements = $form.elements;
3587
3633
  const serializedArray = [];
3588
- for (let i = 0; i < elements.length; i++) {
3589
- const element = elements[i];
3590
- if (element.name &&
3591
- !element.disabled &&
3592
- (element.checked ||
3593
- ["text", "hidden", "password", "textarea", "select-one", "select-multiple"].includes(element.type))) {
3594
- if (element.type === "select-multiple") {
3595
- for (let j = 0; j < element.options.length; j++) {
3596
- if (element.options[j].selected) {
3634
+ for (let index = 0; index < elements.length; index++) {
3635
+ const $el = elements[index];
3636
+ if ($el.name &&
3637
+ !$el.disabled &&
3638
+ ($el.checked ||
3639
+ ["text", "hidden", "password", "textarea", "select-one", "select-multiple"].includes($el.type))) {
3640
+ if ($el.type === "select-multiple") {
3641
+ for (let j = 0; j < $el.options.length; j++) {
3642
+ if ($el.options[j].selected) {
3597
3643
  serializedArray.push({
3598
- name: element.name,
3599
- value: element.options[j].value,
3644
+ name: $el.name,
3645
+ value: $el.options[j].value,
3600
3646
  });
3601
3647
  }
3602
3648
  }
3603
3649
  }
3604
3650
  else {
3605
- serializedArray.push({ name: element.name, value: element.value });
3651
+ serializedArray.push({ name: $el.name, value: $el.value });
3606
3652
  }
3607
3653
  }
3608
3654
  }
@@ -3918,10 +3964,6 @@ class DOMUtils extends ElementHandler {
3918
3964
  }
3919
3965
  }
3920
3966
  const domUtils = new DOMUtils();
3921
- domUtils.emit(document, "test");
3922
- domUtils.emit(document, "click");
3923
- domUtils.emit(document, ["test", "click"]);
3924
- domUtils.emit(document, ["test", "click"], true);
3925
3967
 
3926
3968
  export { domUtils as default };
3927
3969
  //# sourceMappingURL=index.esm.js.map