프로젝트

일반

사용자정보

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>