Cpt 파라미터 저장 예외처리(debounce) » 이력 » 버전 1
김 미진, 2025/04/22 10:34
1 | 1 | 김 미진 | h1. Cpt 파라미터 저장 예외처리(debounce) |
---|---|---|---|
2 | |||
3 | <pre> |
||
4 | document.addEventListener('DOMContentLoaded', function () { |
||
5 | const today = new Date(); |
||
6 | |||
7 | // debounce 함수 정의 |
||
8 | function debounce(func, delay) { |
||
9 | let timeoutId; |
||
10 | return function (...args) { |
||
11 | if (timeoutId) { |
||
12 | clearTimeout(timeoutId); |
||
13 | } |
||
14 | timeoutId = setTimeout(() => { |
||
15 | func.apply(this, args); |
||
16 | }, delay); |
||
17 | }; |
||
18 | } |
||
19 | |||
20 | // widget 처리 공통 로직 |
||
21 | function handleWidget(target) { |
||
22 | if (target) { |
||
23 | console.log(`Handling widget: ${target.getAttribute('widgetname')}`); |
||
24 | let dateFilter = 'Y'; |
||
25 | // const paramContainer = _g().getParameterContainer(); |
||
26 | if (typeof _g().getParameterContainer().getWidgetByName('date_filter_YN') !== 'undefined') { |
||
27 | dateFilter = _g().getParameterContainer().getWidgetByName('date_filter_YN').getValue(); |
||
28 | } |
||
29 | if (dateFilter === 'N') { |
||
30 | if (typeof _g().getParameterContainer().getWidgetByName('p_to_date') !== 'undefined') { |
||
31 | _g().getParameterContainer().getWidgetByName('p_to_date').setValue(today); |
||
32 | } |
||
33 | if (typeof _g().getParameterContainer().getWidgetByName('p_from_date') !== 'undefined') { |
||
34 | _g().getParameterContainer().getWidgetByName('p_from_date').setValue(today); |
||
35 | } |
||
36 | } |
||
37 | } |
||
38 | } |
||
39 | |||
40 | // debounce 처리할 공통 로직 |
||
41 | const handleDebouncedEvent = debounce(function (event) { |
||
42 | console.log('Debounced Event Triggered:', event?.type || 'DOM Mutation'); |
||
43 | if (event?.type === 'click') { |
||
44 | const target = event.target.closest("[widgetname^=sortable]"); |
||
45 | if (target) { |
||
46 | handleWidget(target); |
||
47 | } |
||
48 | } else { |
||
49 | // MutationObserver로 감지된 경우 widgetname 조건 만족하는 모든 요소 처리 |
||
50 | const sortableWidgets = document.querySelectorAll("[widgetname^=sortable]"); |
||
51 | sortableWidgets.forEach((widget) => { |
||
52 | handleWidget(widget); |
||
53 | }); |
||
54 | } |
||
55 | }, 100); // 100ms debounce delay |
||
56 | |||
57 | // 클릭 이벤트 감지 |
||
58 | document.body.addEventListener('click', handleDebouncedEvent); |
||
59 | |||
60 | // MutationObserver로 DOM 변경 감지 |
||
61 | const observerCallback = function (mutationsList) { |
||
62 | console.log('1'); |
||
63 | for (const mutation of mutationsList) { |
||
64 | if (mutation.type === 'childList' || mutation.type === 'attributes') { |
||
65 | const target = mutation.target; |
||
66 | if (target.getAttribute && target.getAttribute('widgetname')?.startsWith('sortable')) { |
||
67 | handleWidget(target); |
||
68 | console.log('1 sortable'); |
||
69 | } else { |
||
70 | console.log('all'); |
||
71 | console.log(target); |
||
72 | console.log(target.getAttribute('widgetname')); |
||
73 | // 전체 DOM에서 조건 만족하는 widget 처리 |
||
74 | handleDebouncedEvent(); |
||
75 | } |
||
76 | } |
||
77 | } |
||
78 | }; |
||
79 | |||
80 | // MutationObserver 설정 |
||
81 | const observer = new MutationObserver(observerCallback); |
||
82 | observer.observe(document.body, { |
||
83 | // childList: true, // 자식 노드 변경 감지 |
||
84 | attributes: true, // 속성 변경 감지 |
||
85 | // subtree: true, // 하위 모든 노드 감지 |
||
86 | }); |
||
87 | console.log('Observer and click listener initialized.'); |
||
88 | }); |
||
89 | </pre> |