@whitesev/pops 3.3.3 → 3.3.5

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.
Files changed (43) hide show
  1. package/dist/index.amd.js +93 -34
  2. package/dist/index.amd.js.map +1 -1
  3. package/dist/index.amd.min.js +1 -1
  4. package/dist/index.amd.min.js.map +1 -1
  5. package/dist/index.cjs.js +93 -34
  6. package/dist/index.cjs.js.map +1 -1
  7. package/dist/index.cjs.min.js +1 -1
  8. package/dist/index.cjs.min.js.map +1 -1
  9. package/dist/index.esm.js +93 -34
  10. package/dist/index.esm.js.map +1 -1
  11. package/dist/index.esm.min.js +1 -1
  12. package/dist/index.esm.min.js.map +1 -1
  13. package/dist/index.iife.js +93 -34
  14. package/dist/index.iife.js.map +1 -1
  15. package/dist/index.iife.min.js +1 -1
  16. package/dist/index.iife.min.js.map +1 -1
  17. package/dist/index.system.js +93 -34
  18. package/dist/index.system.js.map +1 -1
  19. package/dist/index.system.min.js +1 -1
  20. package/dist/index.system.min.js.map +1 -1
  21. package/dist/index.umd.js +93 -34
  22. package/dist/index.umd.js.map +1 -1
  23. package/dist/index.umd.min.js +1 -1
  24. package/dist/index.umd.min.js.map +1 -1
  25. package/dist/types/src/Pops.d.ts +11 -10
  26. package/dist/types/src/components/folder/types/index.d.ts +18 -13
  27. package/dist/types/src/components/tooltip/index.d.ts +1 -1
  28. package/dist/types/src/config/GlobalConfig.d.ts +1 -0
  29. package/dist/types/src/handler/PopsHandler.d.ts +2 -5
  30. package/dist/types/src/types/components.d.ts +7 -0
  31. package/package.json +1 -1
  32. package/src/components/alert/defaultConfig.ts +1 -0
  33. package/src/components/confirm/defaultConfig.ts +1 -0
  34. package/src/components/drawer/defaultConfig.ts +1 -0
  35. package/src/components/folder/defaultConfig.ts +1 -0
  36. package/src/components/folder/index.ts +58 -33
  37. package/src/components/folder/types/index.ts +29 -19
  38. package/src/components/iframe/defaultConfig.ts +1 -0
  39. package/src/components/loading/defaultConfig.ts +1 -0
  40. package/src/components/panel/defaultConfig.ts +1 -0
  41. package/src/components/prompt/defaultConfig.ts +1 -0
  42. package/src/handler/PopsHandler.ts +34 -10
  43. package/src/types/components.d.ts +7 -0
@@ -37,16 +37,16 @@ declare class Pops {
37
37
  };
38
38
  /** icon图标的svg代码 */
39
39
  iconSVG: {
40
- loading: string;
41
40
  min: string;
42
- max: string;
43
- search: string;
44
41
  mise: string;
42
+ max: string;
45
43
  close: string;
46
44
  edit: string;
47
45
  share: string;
48
46
  delete: string;
47
+ search: string;
49
48
  upload: string;
49
+ loading: string;
50
50
  next: string;
51
51
  prev: string;
52
52
  eleme: string;
@@ -72,14 +72,14 @@ declare class Pops {
72
72
  };
73
73
  /** 存储已创建的元素 */
74
74
  instData: {
75
- iframe: import("./types/inst").PopsInstGeneralConfig[];
76
- folder: import("./types/inst").PopsInstGeneralConfig[];
77
75
  loading: import("./types/inst").PopsInstGeneralConfig[];
78
76
  alert: import("./types/inst").PopsInstGeneralConfig[];
79
77
  confirm: import("./types/inst").PopsInstGeneralConfig[];
80
78
  prompt: import("./types/inst").PopsInstGeneralConfig[];
79
+ iframe: import("./types/inst").PopsInstGeneralConfig[];
81
80
  tooltip: import("./types/inst").PopsInstGeneralConfig[];
82
81
  drawer: import("./types/inst").PopsInstGeneralConfig[];
82
+ folder: import("./types/inst").PopsInstGeneralConfig[];
83
83
  panel: import("./types/inst").PopsInstGeneralConfig[];
84
84
  rightClickMenu: import("./types/inst").PopsInstGeneralConfig[];
85
85
  };
@@ -726,6 +726,7 @@ declare class Pops {
726
726
  forbiddenScroll?: boolean | undefined;
727
727
  lightStyle?: string | undefined;
728
728
  darkStyle?: string | undefined;
729
+ stopKeyDownEventPropagation?: boolean | undefined;
729
730
  beforeAppendToPageCallBack?: void;
730
731
  drag?: boolean | undefined;
731
732
  dragLimit?: boolean | undefined;
@@ -788,16 +789,16 @@ declare class Pops {
788
789
  showArrow: boolean;
789
790
  arrowDistance: number;
790
791
  otherDistance: number;
791
- useShadowRoot: boolean;
792
- only: boolean;
793
792
  zIndex: IFunction<number>;
794
793
  style: string | null;
794
+ useShadowRoot: boolean;
795
+ only: boolean;
795
796
  lightStyle: string | null;
796
797
  darkStyle: string | null;
797
798
  beforeAppendToPageCallBack: ($shadowRoot: ShadowRoot | HTMLElement, $shadowContainer: HTMLDivElement) => void;
798
799
  };
799
800
  $shadowContainer: HTMLDivElement;
800
- $shadowRoot: HTMLDivElement | ShadowRoot;
801
+ $shadowRoot: ShadowRoot | HTMLElement;
801
802
  toolTip: import("./components/tooltip").ToolTip;
802
803
  };
803
804
  /**
@@ -817,9 +818,9 @@ declare class Pops {
817
818
  panel: (config: PopsPanelConfig) => {
818
819
  addEventListener: <K extends keyof import("./components/panel/types").PopsPanelEventType>(event: K, listener: (evt: CustomEvent<import("./components/panel/types").PopsPanelEventType[K]>) => void, options?: boolean | EventListenerOptions) => void;
819
820
  removeEventListener: <K extends keyof import("./components/panel/types").PopsPanelEventType>(event: K, listener: (evt: CustomEvent<import("./components/panel/types").PopsPanelEventType[K]>) => void, options?: boolean | EventListenerOptions) => void;
820
- mode: import("./types/main").PopsType;
821
821
  close: () => Promise<void>;
822
822
  hide: () => Promise<void>;
823
+ mode: import("./types/main").PopsType;
823
824
  show: ($parent?: HTMLElement | Document | ShadowRoot) => Promise<void>;
824
825
  $shadowContainer: HTMLDivElement;
825
826
  $shadowRoot: ShadowRoot | HTMLElement;
@@ -907,7 +908,7 @@ declare class Pops {
907
908
  * searchSuggestion.setAllEvent();
908
909
  */
909
910
  searchSuggestion: <T = any>(config: PopsSearchSuggestionConfig<T>) => {
910
- selfDocument: Document | ShadowRoot | (Document | ShadowRoot)[];
911
+ selfDocument: ShadowRoot | Document | (ShadowRoot | Document)[];
911
912
  $el: {
912
913
  root: HTMLElement;
913
914
  $dropdownWrapper: HTMLElement;
@@ -4,18 +4,11 @@ import type { PopsTitleConfig, PopsDragConfig, PopsGeneralConfig, PopsMoreButton
4
4
  */
5
5
  export type PopsFolderDownloadOption = {
6
6
  /**
7
- * 是否点击后自动触发下载
8
7
  *
9
- * + `true`: 自动根据设置的`mode`值来选择下载方式
10
- * + `false`: 不触发下载
11
- */
12
- autoDownload: boolean;
13
- /**
14
- * 触发下载后会根据提供的url链接进行下载
15
- */
16
- url: string;
17
- /**
18
- * 下载方式
8
+ * 前置条件:url不为空
9
+ *
10
+ * 下载方式,不传入就不下载(不做任何处理)
11
+ *
19
12
  *
20
13
  * + `a`: 使用`a标签`进行下载
21
14
  * + `aBlank`: 使用`a标签`进行下载(添加属性`target="_blank"`)
@@ -26,6 +19,10 @@ export type PopsFolderDownloadOption = {
26
19
  * @default "aBlank"
27
20
  */
28
21
  mode?: "a" | "aBlank" | "iframe" | "open" | "openBlank";
22
+ /**
23
+ * 触发下载后会根据提供的url链接进行下载
24
+ */
25
+ url: string;
29
26
  };
30
27
  /**
31
28
  * pops.folder的folder配置信息
@@ -85,14 +82,22 @@ export interface PopsFolderDataConfig {
85
82
  * 层级
86
83
  */
87
84
  index: number;
85
+ /**
86
+ * 列表项的点击事件回调
87
+ *
88
+ * 如果是配置项,则自动根据配置项来创建下载事件,也可以自定义函数
89
+ *
90
+ * 如果是自定义函数的话,根据返回值来判断,如果为空则什么都不做
91
+ */
92
+ clickEvent?: ((
88
93
  /**
89
94
  * 点击事件
90
95
  */
91
- clickEvent?: (event: MouseEvent | PointerEvent,
96
+ event: MouseEvent | PointerEvent,
92
97
  /**
93
98
  * 当前层级的文件|文件夹信息配置
94
99
  */
95
- config: PopsFolderDataConfig) => IPromise<PopsFolderDownloadOption | PopsFolderDataConfig[] | null | undefined | void>;
100
+ config: PopsFolderDataConfig) => IPromise<PopsFolderDownloadOption | PopsFolderDataConfig[] | null | undefined | void>) | PopsFolderDownloadOption | PopsFolderDataConfig[] | null | undefined | void;
96
101
  }
97
102
  /**
98
103
  * pops.folder
@@ -213,7 +213,7 @@ export declare const PopsTooltip: {
213
213
  beforeAppendToPageCallBack: ($shadowRoot: ShadowRoot | HTMLElement, $shadowContainer: HTMLDivElement) => void;
214
214
  };
215
215
  $shadowContainer: HTMLDivElement;
216
- $shadowRoot: HTMLDivElement | ShadowRoot;
216
+ $shadowRoot: HTMLElement | ShadowRoot;
217
217
  toolTip: ToolTip;
218
218
  };
219
219
  };
@@ -27,6 +27,7 @@ export declare const GlobalConfig: {
27
27
  forbiddenScroll?: boolean | undefined;
28
28
  lightStyle?: string | undefined;
29
29
  darkStyle?: string | undefined;
30
+ stopKeyDownEventPropagation?: boolean | undefined;
30
31
  beforeAppendToPageCallBack?: void;
31
32
  drag?: boolean | undefined;
32
33
  dragLimit?: boolean | undefined;
@@ -14,12 +14,9 @@ export declare const PopsHandler: {
14
14
  /**
15
15
  * 创建shadow
16
16
  */
17
- handlerShadow(config: Pick<PopsGeneralConfig, "useShadowRoot">): {
17
+ handlerShadow(config: Pick<PopsGeneralConfig, "useShadowRoot" | "stopKeyDownEventPropagation">): {
18
18
  $shadowContainer: HTMLDivElement;
19
- $shadowRoot: ShadowRoot;
20
- } | {
21
- $shadowContainer: HTMLDivElement;
22
- $shadowRoot: HTMLDivElement;
19
+ $shadowRoot: HTMLElement | ShadowRoot;
23
20
  };
24
21
  /**
25
22
  * 处理初始化
@@ -214,6 +214,13 @@ export interface PopsGeneralConfig {
214
214
  * 传入的css都在dark内
215
215
  */
216
216
  darkStyle?: string | null;
217
+ /**
218
+ * (可选)是否阻止`keydown`事件传播
219
+ *
220
+ * 主要是阻止当`keydown`触发来源为输入框时,即在输入框内按下按键不会触发页面的快捷键
221
+ * @default true
222
+ */
223
+ stopKeyDownEventPropagation?: boolean;
217
224
  /**
218
225
  * 在元素添加到页面前的事件
219
226
  * @param $shadowRoot 根元素
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@whitesev/pops",
3
- "version": "3.3.3",
3
+ "version": "3.3.5",
4
4
  "description": "弹窗库,包含了alert、confirm、prompt、drawer、folder、loading、iframe、panel、tooltip、searchSuggestion、rightClickMenu组件",
5
5
  "keywords": [
6
6
  "ScriptCat",
@@ -60,5 +60,6 @@ export const PopsAlertDefaultConfig = (): DeepRequired<PopsAlertConfig> => {
60
60
  lightStyle: null,
61
61
  darkStyle: null,
62
62
  beforeAppendToPageCallBack() {},
63
+ stopKeyDownEventPropagation: true,
63
64
  } as DeepRequired<PopsAlertConfig>;
64
65
  };
@@ -88,5 +88,6 @@ export const PopsConfirmDefaultConfig = (): DeepRequired<PopsConfirmConfig> => {
88
88
  lightStyle: null,
89
89
  darkStyle: null,
90
90
  beforeAppendToPageCallBack() {},
91
+ stopKeyDownEventPropagation: true,
91
92
  } as DeepRequired<PopsConfirmConfig>;
92
93
  };
@@ -87,5 +87,6 @@ export const PopsDrawerDefaultConfig = (): DeepRequired<PopsDrawerConfig> => {
87
87
  darkStyle: null,
88
88
  beforeAppendToPageCallBack() {},
89
89
  forbiddenScroll: false,
90
+ stopKeyDownEventPropagation: true,
90
91
  };
91
92
  };
@@ -149,5 +149,6 @@ export const PopsFolderDefaultConfig = (): DeepRequired<PopsFolderConfig> => {
149
149
  lightStyle: null,
150
150
  darkStyle: null,
151
151
  beforeAppendToPageCallBack() {},
152
+ stopKeyDownEventPropagation: true,
152
153
  };
153
154
  };
@@ -10,7 +10,7 @@ import { popsUtils } from "../../utils/PopsUtils";
10
10
  import { PopsLoading } from "../loading";
11
11
  import { PopsFolderDefaultConfig } from "./defaultConfig";
12
12
  import { Folder_ICON } from "./folderIcon";
13
- import type { PopsFolderDataConfig, PopsFolderConfig, PopsFolderDownloadOption } from "./types";
13
+ import type { PopsFolderConfig, PopsFolderDataConfig, PopsFolderDownloadOption } from "./types";
14
14
 
15
15
  export const PopsFolder = {
16
16
  init(__config__: PopsFolderConfig) {
@@ -517,10 +517,13 @@ export const PopsFolder = {
517
517
  );
518
518
  // 存储原来的值
519
519
  Reflect.set($fileName, "__value__", folderData);
520
- Reflect.set($folder, "folderData", folderData);
520
+ Reflect.set($folder, "__value__", folderData);
521
521
  $folder.appendChild($fileName);
522
522
  return {
523
523
  folderElement: $folder,
524
+ /**
525
+ * 超链接标签的容器
526
+ */
524
527
  fileNameElement: $fileName,
525
528
  };
526
529
  }
@@ -619,8 +622,16 @@ export const PopsFolder = {
619
622
  },
620
623
  addIndexCSS: false,
621
624
  });
625
+ let childConfig: PopsFolderDataConfig[] | undefined;
622
626
  if (typeof dataConfig.clickEvent === "function") {
623
- const childConfig = await dataConfig.clickEvent(clickEvent, dataConfig);
627
+ const result = await dataConfig.clickEvent(clickEvent, dataConfig);
628
+ if (Array.isArray(result)) {
629
+ childConfig = result;
630
+ }
631
+ } else if (Array.isArray(dataConfig.clickEvent)) {
632
+ childConfig = dataConfig.clickEvent;
633
+ }
634
+ if (childConfig) {
624
635
  // 添加顶部导航的箭头
625
636
  folderFileListBreadcrumbPrimaryElement.appendChild(this.createHeaderArrowIcon());
626
637
  // 添加顶部导航的链接文字
@@ -637,54 +648,63 @@ export const PopsFolder = {
637
648
  }
638
649
  loadingMask.close();
639
650
  }
651
+ /**
652
+ * 更新文件的显示的链接信息
653
+ *
654
+ * 这里主要用于鼠标中键或者右键触发,左键触发方式会根据mode进行处理
655
+ * @returns 更新的文件的下载链接
656
+ */
657
+ updateFileLink($row: HTMLElement, downloadInfo: PopsFolderDownloadOption) {
658
+ const downloadUrl = typeof downloadInfo?.url === "string" ? downloadInfo.url.trim() : "";
659
+ if (downloadUrl !== "" && downloadUrl !== "null" && downloadUrl !== "undefined") {
660
+ const $link = $row.querySelector("a")!;
661
+ $link.setAttribute("href", downloadUrl);
662
+ return downloadUrl;
663
+ }
664
+ }
640
665
  /**
641
666
  * 文件的点击事件 - 下载文件
642
- * @param $target
667
+ * @param evt 点击事件
668
+ * @param $row 列表项
643
669
  * @param dataConfig
644
670
  */
645
- async downloadFile(clickEvent: MouseEvent | PointerEvent, $row: HTMLElement, dataConfig: PopsFolderDataConfig) {
646
- popsDOMUtils.preventEvent(clickEvent);
647
-
648
- const $link = $row.querySelector("a")!;
671
+ async onFileClick(evt: MouseEvent | PointerEvent, $row: HTMLElement, dataConfig: PopsFolderDataConfig) {
672
+ let downloadInfo: PopsFolderDownloadOption | undefined;
649
673
  if (typeof dataConfig.clickEvent === "function") {
650
- const downloadInfo = await dataConfig.clickEvent(clickEvent, dataConfig)!;
651
- if (
652
- downloadInfo != null &&
653
- typeof downloadInfo === "object" &&
654
- !Array.isArray(downloadInfo) &&
655
- typeof downloadInfo.url === "string" &&
656
- downloadInfo.url.trim() !== ""
657
- ) {
658
- $link.setAttribute("href", downloadInfo.url);
659
- $link.setAttribute("target", "_blank");
660
- if (downloadInfo.autoDownload) {
661
- if (downloadInfo.mode == null || String(downloadInfo.mode) === "") {
662
- // 未设置mode的话默认为aBlank
663
- downloadInfo.mode = "aBlank";
664
- }
674
+ const result = await dataConfig.clickEvent(evt, dataConfig);
675
+ if (typeof result === "object" && result != null && !Array.isArray(result)) {
676
+ downloadInfo = result;
677
+ }
678
+ } else if (
679
+ typeof dataConfig.clickEvent === "object" &&
680
+ dataConfig.clickEvent != null &&
681
+ !Array.isArray(dataConfig.clickEvent)
682
+ ) {
683
+ downloadInfo = dataConfig.clickEvent;
684
+ }
685
+ if (downloadInfo) {
686
+ const downloadUrl = this.updateFileLink($row, downloadInfo);
687
+ if (downloadUrl) {
688
+ if (typeof downloadInfo.mode === "string") {
665
689
  if (downloadInfo.mode === "a" || downloadInfo.mode === "aBlank") {
666
690
  // a标签下载
667
691
  const $anchor = popsDOMUtils.createElement("a");
668
-
669
692
  if (downloadInfo.mode === "aBlank") {
670
693
  $anchor.setAttribute("target", "_blank");
671
694
  }
672
-
673
- $anchor.href = downloadInfo.url;
695
+ $anchor.href = downloadUrl;
674
696
  $anchor.click();
675
697
  } else if (downloadInfo.mode === "open" || downloadInfo.mode === "openBlank") {
676
698
  // window.open下载
677
-
678
699
  if (downloadInfo.mode === "openBlank") {
679
- globalThis.open(downloadInfo.url, "_blank");
700
+ globalThis.open(downloadUrl, "_blank");
680
701
  } else {
681
- globalThis.open(downloadInfo.url);
702
+ globalThis.open(downloadUrl);
682
703
  }
683
704
  } else if (downloadInfo.mode === "iframe") {
684
705
  // iframe下载
685
706
  const $downloadIframe = popsDOMUtils.createElement("iframe");
686
-
687
- $downloadIframe.src = downloadInfo.url;
707
+ $downloadIframe.src = downloadUrl;
688
708
  $downloadIframe.onload = function () {
689
709
  popsUtils.setTimeout(() => {
690
710
  $downloadIframe.remove();
@@ -860,9 +880,14 @@ export const PopsFolder = {
860
880
  // 文件 - 点击事件
861
881
  popsDOMUtils.on<MouseEvent | PointerEvent>(fileNameElement, "click", (event) => {
862
882
  // 下载文件
863
- this.downloadFile(event, fileNameElement, item);
883
+ popsDOMUtils.preventEvent(event);
884
+ this.onFileClick(event, fileNameElement, item);
864
885
  });
865
-
886
+ // 如果clickEvent不是函数,那么现在就可以进行配置
887
+ if (typeof item.clickEvent === "object" && item.clickEvent !== null && !Array.isArray(item.clickEvent)) {
888
+ // {} 单文件配置
889
+ this.updateFileLink(fileNameElement, item.clickEvent);
890
+ }
866
891
  folderListBodyElement.appendChild(folderElement);
867
892
  }
868
893
  });
@@ -10,18 +10,11 @@ import type {
10
10
  */
11
11
  export type PopsFolderDownloadOption = {
12
12
  /**
13
- * 是否点击后自动触发下载
14
13
  *
15
- * + `true`: 自动根据设置的`mode`值来选择下载方式
16
- * + `false`: 不触发下载
17
- */
18
- autoDownload: boolean;
19
- /**
20
- * 触发下载后会根据提供的url链接进行下载
21
- */
22
- url: string;
23
- /**
24
- * 下载方式
14
+ * 前置条件:url不为空
15
+ *
16
+ * 下载方式,不传入就不下载(不做任何处理)
17
+ *
25
18
  *
26
19
  * + `a`: 使用`a标签`进行下载
27
20
  * + `aBlank`: 使用`a标签`进行下载(添加属性`target="_blank"`)
@@ -32,6 +25,10 @@ export type PopsFolderDownloadOption = {
32
25
  * @default "aBlank"
33
26
  */
34
27
  mode?: "a" | "aBlank" | "iframe" | "open" | "openBlank";
28
+ /**
29
+ * 触发下载后会根据提供的url链接进行下载
30
+ */
31
+ url: string;
35
32
  };
36
33
  /**
37
34
  * pops.folder的folder配置信息
@@ -96,15 +93,28 @@ export interface PopsFolderDataConfig {
96
93
  */
97
94
  index: number;
98
95
  /**
99
- * 点击事件
96
+ * 列表项的点击事件回调
97
+ *
98
+ * 如果是配置项,则自动根据配置项来创建下载事件,也可以自定义函数
99
+ *
100
+ * 如果是自定义函数的话,根据返回值来判断,如果为空则什么都不做
100
101
  */
101
- clickEvent?: (
102
- event: MouseEvent | PointerEvent,
103
- /**
104
- * 当前层级的文件|文件夹信息配置
105
- */
106
- config: PopsFolderDataConfig
107
- ) => IPromise<PopsFolderDownloadOption | PopsFolderDataConfig[] | null | undefined | void>;
102
+ clickEvent?:
103
+ | ((
104
+ /**
105
+ * 点击事件
106
+ */
107
+ event: MouseEvent | PointerEvent,
108
+ /**
109
+ * 当前层级的文件|文件夹信息配置
110
+ */
111
+ config: PopsFolderDataConfig
112
+ ) => IPromise<PopsFolderDownloadOption | PopsFolderDataConfig[] | null | undefined | void>)
113
+ | PopsFolderDownloadOption
114
+ | PopsFolderDataConfig[]
115
+ | null
116
+ | undefined
117
+ | void;
108
118
  }
109
119
 
110
120
  /**
@@ -58,5 +58,6 @@ export const PopsIframeDefaultConfig = (): DeepRequired<PopsIframeConfig> => {
58
58
  lightStyle: null,
59
59
  darkStyle: null,
60
60
  beforeAppendToPageCallBack() {},
61
+ stopKeyDownEventPropagation: true,
61
62
  };
62
63
  };
@@ -27,5 +27,6 @@ export const PopsLoadingDefaultConfig = (): DeepRequired<PopsLoadingConfig> => {
27
27
  lightStyle: null,
28
28
  darkStyle: null,
29
29
  addIndexCSS: true,
30
+ stopKeyDownEventPropagation: true,
30
31
  };
31
32
  };
@@ -866,5 +866,6 @@ export const PopsPanelDefaultConfig = (): DeepRequired<PopsPanelConfig> => {
866
866
  lightStyle: null,
867
867
  darkStyle: null,
868
868
  beforeAppendToPageCallBack() {},
869
+ stopKeyDownEventPropagation: true,
869
870
  };
870
871
  };
@@ -92,5 +92,6 @@ export const PopsPromptDefaultConfig = (): DeepRequired<PopsPromptConfig> => {
92
92
  lightStyle: null,
93
93
  darkStyle: null,
94
94
  beforeAppendToPageCallBack() {},
95
+ stopKeyDownEventPropagation: true,
95
96
  };
96
97
  };
@@ -21,22 +21,46 @@ export const PopsHandler = {
21
21
  /**
22
22
  * 创建shadow
23
23
  */
24
- handlerShadow(config: Pick<PopsGeneralConfig, "useShadowRoot">) {
24
+ handlerShadow(config: Pick<PopsGeneralConfig, "useShadowRoot" | "stopKeyDownEventPropagation">) {
25
25
  const $shadowContainer = popsDOMUtils.createElement("div", {
26
26
  className: "pops-shadow-container",
27
27
  });
28
+ let $shadowRoot: ShadowRoot | HTMLElement;
28
29
  if (config.useShadowRoot) {
29
- const $shadowRoot = $shadowContainer.attachShadow({ mode: "open" });
30
- return {
31
- $shadowContainer,
32
- $shadowRoot,
33
- };
30
+ $shadowRoot = $shadowContainer.attachShadow({ mode: "open" });
34
31
  } else {
35
- return {
36
- $shadowContainer,
37
- $shadowRoot: $shadowContainer,
38
- };
32
+ $shadowRoot = $shadowContainer;
39
33
  }
34
+ // 添加键盘监听
35
+ // rightClickMenu
36
+ // searchSuggestion
37
+ // tooltip
38
+ // 以上都不需要添加该事件监听
39
+ if (config.stopKeyDownEventPropagation) {
40
+ popsDOMUtils.on(
41
+ $shadowRoot,
42
+ "keydown",
43
+ [
44
+ 'input[type="text"]',
45
+ 'input[type="password"]',
46
+ 'input[type="number"]',
47
+ 'input[type="email"]',
48
+ 'input[type="url"]',
49
+ 'input[type="search"]',
50
+ "input:not([type])",
51
+ "textarea",
52
+ ],
53
+ (evt) => {
54
+ evt.stopImmediatePropagation();
55
+ evt.stopPropagation();
56
+ },
57
+ { capture: true }
58
+ );
59
+ }
60
+ return {
61
+ $shadowContainer,
62
+ $shadowRoot,
63
+ };
40
64
  },
41
65
  /**
42
66
  * 处理初始化
@@ -214,6 +214,13 @@ export interface PopsGeneralConfig {
214
214
  * 传入的css都在dark内
215
215
  */
216
216
  darkStyle?: string | null;
217
+ /**
218
+ * (可选)是否阻止`keydown`事件传播
219
+ *
220
+ * 主要是阻止当`keydown`触发来源为输入框时,即在输入框内按下按键不会触发页面的快捷键
221
+ * @default true
222
+ */
223
+ stopKeyDownEventPropagation?: boolean;
217
224
  /**
218
225
  * 在元素添加到页面前的事件
219
226
  * @param $shadowRoot 根元素