Savelyev_Vyacheslav

Отключить-Включить модальное окно на загрузке

Jul 9th, 2024 (edited)
298
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. async function initializeEventListenersRemoval(delay) {
  2.     const targetToListeners = new WeakMap();
  3.     const entryToOnceCb = new WeakMap();
  4.     const dynamicallyRemovedEntries = new WeakSet();
  5.  
  6.     // Эта функция возвращает неизменяемый список слушателей
  7.     function getEventListeners(target, type, phase) {
  8.         const allListeners = targetToListeners.get(target);
  9.         if (!allListeners) return [];
  10.         if (!type && !phase) return allListeners.slice();
  11.         if (!allListeners[type]) return [];
  12.         if (!phase || phase === Event.AT_TARGET) return allListeners[type].slice();
  13.         if (phase === Event.CAPTURING_PHASE) return allListeners[type].filter(listener => listener.capture);
  14.         if (phase === Event.BUBBLING_PHASE) return allListeners[type].filter(listener => !listener.capture);
  15.         throw new Error("Illegal event phase for getEventListeners: phase can only be Event.BUBBLING_PHASE, Event.CAPTURING_PHASE, or Event.AT_TARGET.");
  16.     }
  17.  
  18.     function findEquivalentListener(registryList, listener, useCapture) {
  19.         return registryList.findIndex(cbOptions => cbOptions.listener === listener && cbOptions.capture === useCapture);
  20.     }
  21.  
  22.     function makeEntry(target, type, listener, options) {
  23.         const entry = options instanceof Object ?
  24.             Object.assign({}, options, { listener, type }) :
  25.             { listener, type, capture: !!options };
  26.         entry.capture = !!entry.capture;
  27.         entry.bubbles = !!entry.bubbles;
  28.         entry.once = !!entry.once;
  29.         entry.passive = !!entry.passive;
  30.         entry.target = target;
  31.         Object.defineProperty(entry, "removed", {
  32.             get: function () {
  33.                 return dynamicallyRemovedEntries.has(this);
  34.             }
  35.         });
  36.         Object.freeze(entry);
  37.         return entry;
  38.     }
  39.  
  40.     function addListener(target, type, listener, options) {
  41.         let allListeners = targetToListeners.get(target);
  42.         if (!allListeners) targetToListeners.set(target, allListeners = {});
  43.         let typeListeners = allListeners[type] || (allListeners[type] = []);
  44.         const capture = !!(options instanceof Object ? options.capture : options);
  45.         const index = findEquivalentListener(typeListeners, listener, capture);
  46.         if (index !== -1) return null;
  47.         const entry = makeEntry(target, type, listener, options);
  48.         typeListeners.push(entry);
  49.         return entry;
  50.     }
  51.  
  52.     function removeListener(target, type, listener, options) {
  53.         let allListeners = targetToListeners.get(target);
  54.         if (!allListeners) return null;
  55.         let typeListeners = allListeners[type];
  56.         if (!typeListeners) return null;
  57.         const capture = !!(options instanceof Object ? options.capture : options);
  58.         const index = findEquivalentListener(typeListeners, listener, capture);
  59.         if (index === -1) return null;
  60.         return typeListeners.splice(index, 1)[0];  //mutates the list in the targetToListeners
  61.     }
  62.  
  63.     function addEventTargetRegistry(EventTargetPrototype = EventTarget.prototype) {
  64.         const ogAdd = EventTargetPrototype.addEventListener;
  65.         const ogRemove = EventTargetPrototype.removeEventListener;
  66.  
  67.         function addEntry(entry) {
  68.             let target = entry.target;
  69.             let type = entry.type;
  70.             let cb = entry.listener;
  71.             let options = entry;
  72.  
  73.             if (entry.once) {
  74.                 options = Object.assign({}, options);
  75.                 options.once = false;
  76.                 cb = function (e) {
  77.                     removeEntry(entry);
  78.                     entry.listener.call(this, e);
  79.                 }
  80.                 entryToOnceCb.set(entry, cb);
  81.             }
  82.             ogAdd.call(target, type, cb, options);
  83.         }
  84.  
  85.         function removeEntry(entry) {
  86.             let cb = entryToOnceCb.get(entry) || entry.listener;
  87.             ogRemove.call(entry.target, entry.type, cb, entry);
  88.         }
  89.  
  90.         function addEventListenerRegistry(type, listener, options) {
  91.             const entry = addListener(this, type, listener, options);
  92.             if (!entry) //addListener returns false when equivalent listener is already added.
  93.                 return;
  94.             addEntry(entry);
  95.         }
  96.  
  97.         function removeEventListenerRegistry(type, listener, options) {
  98.             const entry = removeListener(this, type, listener, options);
  99.             if (!entry)  //removeListener returns false when there is no listener to be removed.
  100.                 return;
  101.             dynamicallyRemovedEntries.add(entry);
  102.             removeEntry(entry);
  103.         }
  104.  
  105.         Object.defineProperty(EventTargetPrototype, "addEventListener", { value: addEventListenerRegistry });
  106.         Object.defineProperty(EventTargetPrototype, "removeEventListener", { value: removeEventListenerRegistry });
  107.  
  108.         return getEventListeners;
  109.     }
  110.  
  111.     // Инициализируем систему отслеживания событий
  112.     const getEventListeners2 = addEventTargetRegistry();
  113.  
  114.     // Теперь функция getEventListeners доступна глобально
  115.     window.getEventListeners = getEventListeners2;
  116.  
  117.     // Удаление обработчиков событий с задержкой
  118.     setTimeout(function () {
  119.         var forms = document.querySelectorAll('form');
  120.         forms.forEach(function (form) {
  121.             form.onsubmit = null;
  122.         });
  123.  
  124.         // Удалите обработчик события beforeunload
  125.         window.onbeforeunload = null;
  126.  
  127.         // Удалите любые установленные ранее слушатели события beforeunload
  128.         var listeners = getEventListeners(window, 'beforeunload');
  129.         if (Array.isArray(listeners) && listeners.length > 0) {
  130.             listeners.forEach(function (listener) {
  131.                 window.removeEventListener('beforeunload', listener.listener);
  132.             });
  133.         }
  134.  
  135.         // Удалите все обработчики событий beforeunload
  136.         var oldOnBeforeUnload = window.onbeforeunload;
  137.         window.onbeforeunload = null;
  138.         if (oldOnBeforeUnload && typeof oldOnBeforeUnload.listener === 'function') {
  139.             window.removeEventListener('beforeunload', oldOnBeforeUnload.listener);
  140.         }
  141.     }, delay); // задержка в миллисекундах
  142. }
  143.  
  144. // Вызов функции с задержкой в x секунды
  145. await initializeEventListenersRemoval(1000);
  146.  
  147.  
  148. async function enableBeforeUnload() {
  149.     setTimeout(() => {
  150.         // Функция для преобразования массива объектов в словарь
  151.         function transformToDict(data) {
  152.             return data.reduce((result, item) => {
  153.                 result[item.fieldName] = item.currentValue;
  154.                 return result;
  155.             }, {});
  156.         }
  157.  
  158.         // Функция для сравнения двух объектов
  159.         function compareObjects(obj1, obj2) {
  160.             const keys1 = Object.keys(obj1);
  161.             const keys2 = Object.keys(obj2);
  162.  
  163.             if (keys1.length !== keys2.length) {
  164.                 return false;
  165.             }
  166.  
  167.             for (let key of keys1) {
  168.                 if (obj1[key] !== obj2[key]) {
  169.                     return false;
  170.                 }
  171.             }
  172.  
  173.             return true;
  174.         }
  175.  
  176.         // Функция для валидации значений формы
  177.         function validateFormValues(data) {
  178.             // Преобразование formValues в словарь
  179.             const formValues = s_widgets.getForm('remTask');
  180.             const transformedData = transformToDict(formValues.getChanges());
  181.  
  182.             // Преобразование data (который уже является объектом) в словарь для сравнения
  183.             const originalData = data;
  184.             console.log(transformedData);
  185.             console.log(data);
  186.  
  187.             // Сравнение оригинальных данных и трансформированных данных
  188.             return compareObjects(originalData, transformedData);
  189.         }
  190.  
  191.         // Пример использования
  192.         const formValues = s_widgets.getForm('remTask');
  193.         const data = formValues.getAllFields().data;
  194.         // Создание копии объекта data
  195.         const dataCopy = JSON.parse(JSON.stringify(data));
  196.  
  197.  
  198.         window.onbeforeunload = function (event) {
  199.             const isValid = validateFormValues(dataCopy);
  200.             console.log(isValid);
  201.  
  202.             if (isValid) {
  203.                 window.onbeforeunload = null;
  204.             } else {
  205.                 const confirmationMessage = 'You have unsaved changes. Do you really want to leave?';
  206.                 event.returnValue = confirmationMessage; // For most browsers
  207.                 return confirmationMessage; // For some older browsers
  208.             }
  209.         };
  210.     }, 2000);
  211. }
  212.  
  213. // Вызов функции для включения предупреждения
  214. await enableBeforeUnload();
  215.  
Advertisement
Add Comment
Please, Sign In to add comment