Форум программистов, компьютерный форум, киберфорум
Проекты
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
 Аватар для pgb
-508 / 32 / 0
Регистрация: 22.09.2015
Сообщений: 1,232

Реалити Разработка

03.01.2025, 10:51. Показов 27802. Ответов 302
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Приветствую!

Решил запустить стрим своей разработки. Можете наблюдать в реальном времени то чем я занимаюсь, писать в чат, буду попутно рассказывать и объяснять всё, если будут вопросы пишите в чат. Так же можете тут обсуждать и задавать вопросы, тоже буду отвечать по мере возможности.

Мой RUTUBE канал
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
03.01.2025, 10:51
Ответы с готовыми решениями:

Набор команды. Разработка/продвижение сайта, разработка приложения на андройд и ios
Есть идея, ищу энтузиастов готовые работать за идею. Думаю дело выгорит, только нужно быть первым. Все подробности в лс. Плата в процентах...

Своя реализация регулярных выражений. Реалити разработка, как говорится учитесь пока я жив :)
Итак, для разработки своих будущих проектов мне нужен быстрый парсинг с удобным для меня функционалом. Есть же регулярные выражения скажете...

Блин.... реалити шоу...
"что... за компом уроды сидят?" - и уроды тоже. Власти уродами управляют и уроды власти хвалят. А неуродами власти управлять не могут и...

302
3061 / 1463 / 265
Регистрация: 16.03.2008
Сообщений: 6,510
Записей в блоге: 2
21.01.2025, 16:05
Студворк — интернет-сервис помощи студентам
Цитата Сообщение от pgb Посмотреть сообщение
voral, даже не пытайся понять... я же сказал проверял некоторую гипотезу, иногда даже разработчики языка не могут предвидеть как будет работать код при некоторых недокументированных способах, но оно работает. Короче не заморачивайся, тебе не понять.
А что тут понимать? Тут все очевидно обычные "эксперименты" от недостатка знаний. Если бы действительно было бы у тебя хоть какое то разумное объяснение - легче было бы пояснить, чем в очередной раз сливаться.
0
Автоматизируй это!
Эксперт Python
 Аватар для Welemir1
7392 / 4819 / 1246
Регистрация: 30.03.2015
Сообщений: 13,696
Записей в блоге: 29
21.01.2025, 16:08
Цитата Сообщение от pgb Посмотреть сообщение
Вы даже не понимаете значения "карго-культ"..
как раз прекрасно понимаю, я использую термины мне знакомые, мне для этого не нужно гуглить))) Ты как раз этим и занят, пытаешься сделать вид что ты разработчик, что-то там "разрабатываешь", умные слова пишешь, надеясь, что благодаря этому что-то выйдет. Однако годы идут, ни одного продукта нет, хехехе


Цитата Сообщение от pgb Посмотреть сообщение
Вы всё ещё верите в то, что вы разработчики
и не только мы, работодатели тоже верят и много кто еще, мы этим профессионально занимаемся, мы -профессионалы своего дела. Вы -любитель, не достигший даже уровня джуна, который никогда не закончит свой продукт по той просто причине, что закончив его надо показать, а это поделие просто засмеют. Новый подходы, ага
0
3061 / 1463 / 265
Регистрация: 16.03.2008
Сообщений: 6,510
Записей в блоге: 2
21.01.2025, 16:15
Цитата Сообщение от Welemir1 Посмотреть сообщение
Вы -любитель, не достигший даже уровня джуна,
Да даже это "не все".. Любители вполне себе способны создавать интересные решения. Но к "цели" должно прилагаться стремление учиться, и отсутствие боязни показать окружающим, что чего либо не знаешь. Простейший пример: вот на той неделе ТС узнал что есть события и в частности есть событие о стадиях загрузки DOM. - Появилось сообщение, что будет делать "модуль сообщений", в конце сегодняшнего видео - видно что он там пробует... и тут же

Цитата Сообщение от pgb Посмотреть сообщение
Ещё кстати насчёт DOMContentLoaded, это событие не всегда срабатывает и этому есть несколько причин, опять же объяснять не буду почему. Приходится искать обходные пути. Видимо поэтому я давно методом проб и написал функцию Wait. Сейчас вот продумываю как это сделать по другому. Есть JS модуль работы с событиями который может автоматически навешивать и события наблюдателя и др.

Т.е. вероятно у него, что то не так работает как ожидалось. И вместо того, чтобы спросить, или глубже копнуть - он явно задумал намутить очередной трешак..... И все эти костыли копятся, копятся...


но, зато постоянно есть оправдание, что "нашел что еще сделать лучше" и можно отложить релиз (даже в закрытом варианте)
0
 Аватар для pgb
-508 / 32 / 0
Регистрация: 22.09.2015
Сообщений: 1,232
21.01.2025, 16:50  [ТС]
Цитата Сообщение от voral Посмотреть сообщение
на той неделе ТС узнал что есть события
Да неужели? Интересно как тогда я написал модуль событий 13.03.2024 если посмотреть архив с фреймворком который я тебе дал, но это дата создания этого архива, модуль событий я ещё раньше написал в году так 19-20 и даже ранее я знал всё о событиях, даже когда они были только в зачаточном состоянии я писал обработчики с помощью разных способов даже flash swf объектов.

Добавлено через 2 минуты
Цитата Сообщение от voral Посмотреть сообщение
и можно отложить релиз
Релиз никуда не денется, остались доработки JS, многое написано, но некоторые вещи в костяке я переделал, поэтому и модули нужно перепроверить и отшлифовать.
0
3061 / 1463 / 265
Регистрация: 16.03.2008
Сообщений: 6,510
Записей в блоге: 2
21.01.2025, 16:50
Ну твой код я не сохранил за ненадобностью. Ок по первому пункту поверим.

Но продолжение прежнее: не сумел разобраться - постеснялся спросить - создал костыль абсолютно дебильный.
0
 Аватар для pgb
-508 / 32 / 0
Регистрация: 22.09.2015
Сообщений: 1,232
21.01.2025, 16:56  [ТС]
Кстати, насчёт не додуманности разработчиков браузера.. Неужели нельзя было предусмотреть возможность удаления событий без ссылок на функции, теперь приходится создавать хранилище и запоминать ссылки на функции чтобы при необходимости была возможность их удаления..

Добавлено через 50 секунд
Цитата Сообщение от voral Посмотреть сообщение
не сумел разобраться - постеснялся спросить - создал костыль абсолютно дебильный.
Спасибо, посмеялся
0
3061 / 1463 / 265
Регистрация: 16.03.2008
Сообщений: 6,510
Записей в блоге: 2
21.01.2025, 16:57
1 Ну при грамотной модульной архитектуре нет необходимости запоминать.

2 пофантазируйте и псевдокодом предложите как это сделать
0
 Аватар для pgb
-508 / 32 / 0
Регистрация: 22.09.2015
Сообщений: 1,232
21.01.2025, 17:23  [ТС]
Цитата Сообщение от voral Посмотреть сообщение
1 Ну при грамотной модульной архитектуре нет необходимости запоминать.
2 пофантазируйте и псевдокодом предложите как это сделать
1. В существующих решениях в том же JQuery через прототип по моему запоминаются функции, потом при необходимости удаляются обработчики беря ссылки на функции, в других наверняка так же, по другому просто не сделать и это замедляет скорость при большом количестве функций событий..
2. Я придумал решение без такого хранилища, проблема только если событие прописано в атрибуте элемента, тогда сложнее это реализовать т.к. в моём модуле событий нет хранилища подобного как в JQuery(и я так категорически не хочу делать), но я ещё подумаю, может что и придумаю.
0
3061 / 1463 / 265
Регистрация: 16.03.2008
Сообщений: 6,510
Записей в блоге: 2
21.01.2025, 17:58
1 в этом нет необходимости. у тебя же есть модуль. он знает о своем составе и умеет и вешать обработчики и снимать. Они в нем есть. Зачем их запоминать? У тебя же не рандомно обработчики вешаются, а соотвествии с неким состоянием модуля. Соответственно и сниматься они должны согласно внутренней бизнес логики модуля. Т.е. даже если речь идет об ананонимной функции - то логика отписки от события там же описывается где и регистрация. И так происходит хоть в ванильных скриптах хоть с тем же джиквери.

2. Ну просто псевдокодом опиши. Зачем их хранить? Правильно ли я понимаю, есть обработчики события onclick которые подписались из модулей A, B и C. И ты их хочешь отписать из модуля D? Если так, то это не правильная логика - она нарушает саму суть модульности.

Если я не так понял назначение хранения списка обработчиков подписавшихся, то опиши словами в каких случаях оно нужно... По мне так нечто лишнее.

Добавлено через 5 минут
Цитата Сообщение от pgb Посмотреть сообщение
это замедляет скорость при большом количестве функций событий
На фоне функции в цикле дергающий DOM в поисках элемента (а это дорогая операция) - это мелочи. Тем более лоб расшибать тоже не надо - ты же не собираешься вешать обработчики бездумно и просто так.

Кстати, видел, ты там пробовал и на resize обработчики вешать - обрати внимание на методики используемые при написании подобных обработчиков - очень легко убить производительность и есть уже "стандартные" наработки в этом плане... (ну или подумай там - свой велик создай, но главное понимай, что это не онклик обработать)

Добавлено через 13 минут
Самому стало интересно (не пользовался), но есть же
JavaScript
1
2
const el = document.getElementById('myElement');
console.log(getEventListeners(el));
0
 Аватар для pgb
-508 / 32 / 0
Регистрация: 22.09.2015
Сообщений: 1,232
21.01.2025, 18:05  [ТС]
Цитата Сообщение от voral Посмотреть сообщение
Если я не так понял назначение хранения списка обработчиков подписавшихся, то опиши словами в каких случаях оно нужно... По мне так нечто лишнее.
Да не поймёшь ты, даже если попытаюсь объяснить. Во-первых, у тебя представление о создании событий на уровне пользователя каким либо готовым решением\библиотекой, хоть ты и думаешь, что на нативном JS это так же делается, но это не так(при навешивании события через addEventListener нужно запомнить функцию и когда нужно будет удалить обработчик события через removeEventListener, то нужно опять же указывать эту функцию). Во-вторых, стандартные обработчики автоматически добавляются и удаляются, а вот пользовательские и с наблюдением и тд. тут нужно извратится чтобы удобно всё реализовать, хранить ссылки на все обработчики не вариант(как в JQ), но без хранения потом не удалить.

Добавлено через 1 минуту
Цитата Сообщение от voral Посмотреть сообщение
console.log(getEventListeners(el));
Надо потестить.
0
3061 / 1463 / 265
Регистрация: 16.03.2008
Сообщений: 6,510
Записей в блоге: 2
21.01.2025, 18:09
Цитата Сообщение от pgb Посмотреть сообщение
Да не поймёшь ты, даже если попытаюсь объяснить.
Ну так поставь задачу. (Надеюсь можешь минимально необходимую задачу описать где для решения требуется список событий. Вот и проверим мои знания.


Цитата Сообщение от pgb Посмотреть сообщение
addEventListener нужно запомнить функцию и когда нужно будет удалить обработчик события через removeEventListener, то нужно опять же указывать эту функцию). Во-вторых, стандартные обработчики автоматически добавляются и удаляются, а вот пользовательские и с наблюдением и тд. тут нужно извратится чтобы удобно всё реализовать, хранить ссылки на все обработчики не вариант(как в JQ), но без хранения потом не удалить.
Что необходимо передать функцию это я знаю из документации. Но вот зачем принимать какие либо дополнительные меры для того чтоб "запомнить" не понимаю. Весь прошедший год, как раз таки делал модули на ванильном JS, все модули с событиями. Не было такой необходимости, что то "запоминать". Хотя все обработчики были подписаны четко только тогда, когда они должны быть подписаны.

Итак можешь мне некую минимальную задачу описать, на которой, по твоему, уже надо их запоминать каким то "особым" способом?
0
 Аватар для pgb
-508 / 32 / 0
Регистрация: 22.09.2015
Сообщений: 1,232
21.01.2025, 18:17  [ТС]
Цитата Сообщение от voral Посмотреть сообщение
console.log(getEventListeners(el));
Это функция консоли, в коде она не работает

и вызывается прямо в консоли
Code
1
getEventListeners(elt)
0
3061 / 1463 / 265
Регистрация: 16.03.2008
Сообщений: 6,510
Записей в блоге: 2
21.01.2025, 18:19
может быть, мне этот метод не нужен в коде, а в консоли как раз ему место. так задачу накидаете?
0
 Аватар для pgb
-508 / 32 / 0
Регистрация: 22.09.2015
Сообщений: 1,232
21.01.2025, 18:22  [ТС]
Цитата Сообщение от voral Посмотреть сообщение
Итак можешь мне некую минимальную задачу описать, на которой, по твоему, уже надо их запоминать каким то "особым" способом?
Например: Компонент у которого есть пользовательские обработчики событий дочерних элементов. Эти обработчики навешиваются на элементы. Потом этот компонент надо удалить со страницы, и чтобы память освободить от обработчиков их надо удалить прежде чем удалить сам компонент.

ЗЫ. Это очень простой пример, на деле задачи могут быть намного сложнее... что-то типа при клике на кнопку отключить срабатывание того или иного события и создание других и тд.
0
3061 / 1463 / 265
Регистрация: 16.03.2008
Сообщений: 6,510
Записей в блоге: 2
21.01.2025, 18:55
Ок. Попробую конкретизировать. Более менее типовая задача:

реализовать попап окно, у которой будет: кнопка закрытия и закрытие по клику вне попапа. Контент, передается из вызывающего модуля. Имеет стандартную кнопку Ок на которую навешивает обрабоотчик вызывающий модуль. Так?

Компонент будет удаляться со страницы, обработчики кликов закрытия, клика помимо и кнопки Ок, должны быть сняты с прослушки?

Годится? Ну или вы по своему усмотрению более конкретизируйте

Добавлено через 26 минут
Цитата Сообщение от pgb Посмотреть сообщение
что-то типа при клике на кнопку отключить срабатывание того или иного события и создание других и тд.
С учетом этого. Типа тулбар. на котором скриптом добавляются кнопки (убудут вызывать попап), и сделать одну которая будет блокировать обработку кликов по ним?
0
 Аватар для pgb
-508 / 32 / 0
Регистрация: 22.09.2015
Сообщений: 1,232
21.01.2025, 19:27  [ТС]
Цитата Сообщение от voral Посмотреть сообщение
Годится?
Не суть, вариантов когда надо удалить обработчики может быть много, ты попросил пример где нужно удалять обработчики, я привёл пример.

Просто потетируй если интересно удаление кастомных\пользовательских обработчиков и поймёшь, что без хранения ссылки на функции тут не обойтись.
0
3061 / 1463 / 265
Регистрация: 16.03.2008
Сообщений: 6,510
Записей в блоге: 2
21.01.2025, 23:32
Цитата Сообщение от pgb Посмотреть сообщение
Не суть, вариантов когда надо удалить обработчики может быть много
Ну главное чтоб ты потом не сказал что "ты сделал не то что я сказал". Твоя задача общими фразами написана. Ок. в общем сделаю

Добавлено через 15 минут
Цитата Сообщение от pgb Посмотреть сообщение
Просто потетируй если интересно удаление кастомных\пользовательских обработчиков и поймёшь, что без хранения ссылки на функции тут не обойтись.
Я сделаю даже два варианта (скорее всего завтра). Один как я бы сделал, и один приближенно как я понимаю, что ты хочешь увидеть. "Приближенно" потому, что если требуется какой то список тебе - это означает что ты хочешь сделать между модулями сильную связанность. и не по полной используешь событийную модель

Добавлено через 2 часа 15 минут
Такс. что бы не делать лишнего пойдем по шагам. вот накидал пример
Кликните здесь для просмотра всего текста

HTML5
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
    <script src="button.js"></script>
    <style>
        .toolbar {
            display: flex;
            gap: 8px;
            max-width: 300px;
        }
 
        .toolbar button:last-child {
            margin-left: auto;
        }
 
        button.disabled {
            opacity: 0.5;
        }
    </style>
</head>
<body>
<div id="toolbar" class="toolbar">
</div>
<pre id="log"></pre>
<script>
    document.addEventListener('DOMContentLoaded', (e) => {
        let disable = false;
        let buttons = [];
        const toolbar = document.getElementById('toolbar');
        const log = document.getElementById('log');
        const defaultHandler = (e) => {
            let event = new CustomEvent("exampleLog", {
                bubbles: true,
                detail: {message: 'default event ' + e.target.innerText}
            });
            toolbar.dispatchEvent(event);
        }
        const disableOther = (e) => {
            disable = !disable;
            let event = new CustomEvent("exampleToggleDisabled", {bubbles: true, detail: {disable: disable}});
            e.target.innerText = disable ? 'Enable' : 'Disable';
            toolbar.dispatchEvent(event);
        }
        const removeOther = (e) => {
            let cache = null;
            for (const button of buttons) {
                const element = button.getButton();
                if (e.target !== button.getButton()) {
                    button.destroy();
                    element.remove();
                } else {
                    cache = button;
                }
            }
            buttons = [cache];
        }
        const buttonsConfig = [
            {
                name: 'Button1',
                handler: defaultHandler,
                managed: true
            },
            {
                name: 'Button2',
                handler: defaultHandler,
                managed: true
            },
            {
                name: 'Disable',
                handler: disableOther,
                managed: false
            },
            {
                name: 'Delete',
                handler: removeOther,
                managed: false
            },
        ]
 
        toolbar.addEventListener('exampleToggleDisabled', (e) => {
            for (const button of buttons) {
                button.toggleDisabled(e.detail.disable);
            }
        });
        document.addEventListener('exampleLog', (e) => {
            log.innerHTML = e.detail.message + "\r\n" + log.innerHTML;
        });
        for (const button of buttonsConfig) {
            const element = new Button(button);
            buttons.push(element);
            toolbar.appendChild(element.getButton());
        }
    });
</script>
</body>
</html>
JavaScript
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
class Button {
    constructor(options) {
        this.title = options.name || 'Button';
        this.handler = options.handler || null;
        this.managed = !!options.managed;
        this.disabled = false;
 
        this.button = document.createElement('button');
        this.button.innerText = this.title;
        this.activateListeners();
    }
 
    activateListeners() {
        if (this.handler) {
            this.disabled = false;
            this.button.addEventListener('click', this.handler);
        }
    }
 
    deactivateListeners() {
        if (this.handler && !this.disabled) {
            this.disabled = true;
            let event = new CustomEvent("exampleLog", {
                bubbles: true,
                detail: {message: 'Deactivate listeners for ' + this.title}
            });
            this.button.dispatchEvent(event);
            this.button.removeEventListener('click', this.handler);
        }
    }
 
    toggleDisabled(disabled) {
        if (this.managed) {
            // this.button.disabled = disabled; // закомментировано для тестирования
            this.button.classList.toggle('disabled', disabled);
            if (disabled) {
                this.deactivateListeners();
            } else {
                this.activateListeners();
            }
        }
    }
 
    getButton() {
        return this.button;
    }
 
    destroy() {
        this.deactivateListeners();
    }
}


Пример в песочнице И на GitHub

Итак. Есть класс кнопок реализующий все за что отвечает сама кнопка. И, по сути, модуль тулбара (его как то оформлять не стал - он в index.html , полагаю для обсуждения это не принципиально.)

События активируются/деактивируются при определенных событиях, элементы добавлены скриптом.... удаляются... Что то на этом этапе есть "не так"? (по сути уже этот код отвечает твоему ТЗ)

Добавлено через 1 минуту
Постарался кода по минимуму написать, чтоб лишнее не мешало обсуждению.
2
3061 / 1463 / 265
Регистрация: 16.03.2008
Сообщений: 6,510
Записей в блоге: 2
22.01.2025, 09:06
С утречка в ожидании кофе сделал рефакторинг. Разделил еще на классы. Добавил кнопку удаления всего тулбара. (посмотреть что даже если его удалять все обработчики убираются)

Кликните здесь для просмотра всего текста

HTML5
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
    <script src="button.js"></script>
    <script src="toolbar.js"></script>
    <script src="logger.js"></script>
    <style>
        .toolbar {
            display: flex;
            gap: 8px;
            max-width: 300px;
            padding: 16px 0;
        }
 
        .toolbar button:last-child {
            margin-left: auto;
        }
 
        button.disabled {
            opacity: 0.5;
        }
    </style>
</head>
<body>
<a href="javascript:void(0)" id="removeToolbar">Remove toolbar</a>
<div id="toolbar" class="toolbar">
</div>
<pre id="log"></pre>
<script>
    document.addEventListener('DOMContentLoaded', () => {
        const buttonsConfig = [
            {
                name: 'Button1',
                handler: function () {
                    this.sendLog('Click button1')
                },
            },
            {
                name: 'Button2',
                handler: function () {
                    this.sendLog('Click button2')
                },
            },
        ]
        let toolbar = new Toolbar({
            element: document.getElementById('toolbar'),
            buttons: buttonsConfig,
        });
        new Logger({
            element: document.getElementById('log'),
        });
        document.getElementById('removeToolbar').addEventListener('click', () => {
            let element = toolbar.element;
            toolbar.destroy();
            element.remove();
        });
    });
</script>
</body>
</html>
button.js
JavaScript
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
class Button {
    constructor(options) {
        this.title = options.name || 'Button';
        this.handler = options.handler.bind(this) || null;
        this.managed = !!options.managed;
        this.disabled = false;
 
        this.button = document.createElement('button');
        this.button.innerText = this.title;
        this.activateListeners();
    }
 
    activateListeners() {
        if (this.handler) {
            this.disabled = false;
            this.button.addEventListener('click', this.handler);
        }
    }
 
    deactivateListeners() {
        if (!!this.handler && !this.disabled) {
            this.disabled = true
            this.sendLog('Deactivate listeners for ' + this.title);
            this.button.removeEventListener('click', this.handler);
        }
    }
 
    sendLog(message) {
        let event = new CustomEvent(LOG_EVENT, {
            bubbles: true,
            detail: {message: message}
        });
        this.button.dispatchEvent(event);
    }
 
    toggleDisabled(disabled) {
        if (this.managed) {
            // this.button.disabled = disabled; // закомментировано для тестирования
            this.button.classList.toggle('disabled', disabled);
            if (disabled) {
                this.deactivateListeners();
            } else {
                this.activateListeners();
            }
        }
    }
 
    getButton() {
        return this.button;
    }
 
    destroy() {
        this.deactivateListeners();
    }
}
toolbar.js
JavaScript
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
class Toolbar {
    constructor(options) {
        this.element = options.element || null;
        this.buttons = options.buttons || [];
        this.initButtons();
        this.initSelfButtons();
        this.customButtonsDisabled = false;
    }
 
    initSelfButtons() {
        this.btnDisable = new Button({
            managed: false,
            name: 'Disable',
            handler: this.disableOther
        })
        this.element.appendChild(this.btnDisable.getButton());
        this.btnDelete = new Button({
            managed: false,
            name: 'Delete',
            handler: this.deleteOther
        })
        this.element.appendChild(this.btnDelete.getButton());
    }
 
    deleteOther = () => {
        this.customButtonsDisabled = !this.customButtonsDisabled;
        for (const button of this.buttons) {
            this.removeButton(button.instance);
            button.instance = null;
        }
        this.removeButton(this.btnDisable);
        this.btnDisable = null;
    }
 
    removeButton(button) {
        if (button) {
            button.destroy();
            button.getButton().remove();
        }
    }
 
    disableOther = (e) => {
        this.customButtonsDisabled = !this.customButtonsDisabled;
        e.target.innerText = this.customButtonsDisabled ? 'Enable' : 'Disable';
        for (const button of this.buttons) {
            button.instance.toggleDisabled(this.customButtonsDisabled);
        }
    }
 
    initButtons() {
        for (const button of this.buttons) {
            button.managed = true;
            button.instance = new Button(button);
            this.element.appendChild(button.instance.getButton());
        }
    }
 
    destroy() {
        this.deleteOther();
        this.removeButton(this.btnDelete);
    }
}
logger.js
JavaScript
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
const LOG_EVENT = 'exampleLog';
 
class Logger {
    constructor(options) {
        this.element = options.element || null;
        document.addEventListener(LOG_EVENT, this.log.bind(this));
    }
 
    log(e) {
        this.element.innerText += e.detail.message + '\n';
    }
 
    destroy() {
        document.removeEventListener(LOG_EVENT, this.log.bind(this));
    }
}

Пример все равно натянутый. Если предположить что понадобилась кнопка disable/enable то, на мой взгляд, убирать обработчики не стоит. Просто состояние указать. и уже в обработчике его проверять.... но уж ради обсуждения...
1
 Аватар для ViachaslauK
134 / 200 / 18
Регистрация: 08.10.2024
Сообщений: 821
22.01.2025, 10:45
Правильно ли я понимаю, что каждый раз при загрузке страницы, обработчики будут в дефолтном состоянии, а токарь хотел это все как-то хранить?
0
3061 / 1463 / 265
Регистрация: 16.03.2008
Сообщений: 6,510
Записей в блоге: 2
22.01.2025, 10:57
Цитата Сообщение от ViachaslauK Посмотреть сообщение
Правильно ли я понимаю, что каждый раз при загрузке страницы, обработчики будут в дефолтном состоянии, а токарь хотел это все как-то хранить?
Хз. Он внятно это объяснить не может.
Предположительно: в его "фреймоворке" обработчики событий могут навешиваться где угодно и кем угодно (без учета модульности и прочих "глупостей" от нереальных программистов). И он хочет иметь возможность централизовано отменить подписки.

Попробовал предположить именно задачу, для которой это потребовалось бы. Ну типа пользователи "фреймворка" вмешиваются и вешают свои обработчики на разные события существующие в этом чудо "фреймворке". Потом при наступлении какого то события "фреймворк" решает "пошли вы все нафиг". и отписывает....

Уже прям чувствуется как бедолаги месяцами проводят в поисках ответа на вопрос "почему у меня моя бизнес логика то работает то нет"

В своем примере я для пользователей просто дал интерфейс: добавляем в конфиг объект содержащий название кнопки и колбек вызываемый при клике.... А вся остальная кухня пользователя не должна ни как парить. Он может даже не быть JS программистом.

Но вот, чего имеет ввиду ТС. Пока не известно. Очень надеюсь, что все же даст расширенный ответ или по задаче, или комментарии по моему коду - и, может, станет понятно, чего необходимо..
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
22.01.2025, 10:57

Саундтрек из реалити-шоу "Сибирская рулетка"
Здравствуйте, форумчане! Год назад на канале Discovery показывали реалити-шоу про команду американских и русских лесорубов в Сибири....

Что перспективнее - разработка игр под мобильные платформы или разработка embedded-систем
Доброго времени суток. Скажите пожалуйста, как вы думаете, что перспективней в будущем - разработка игр под мобильные платформы (Android,...

Разработка сервиса по отзывам связка с WhatsApp. Разработка на Python
ТЗ тут https://docs.google.com/document/d/16hCHb5jVsgKwidICXPPI8kVM4mucEmwNEOy2c5FpUbk/edit Писать в ватсап 89601148487 Пишите...

сектор окружности.разработка интерфейса классов, создание статических и динамических экземпляров, разработка конструкторов и деструкторов
Дана фигура:сектор окружности. Фигура описывается индивидуальными геометрическими свойствами и общими оформительскими свойствами: цвет...

Разработка игр или разработка софта
Всем привет! Я хочу начать активное обучение программирования на С++.Но не совсем решился, какую конкретно область IT выбрать: разработку...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
80
Закрытая тема Создать тему
Новые блоги и статьи
Теория всего 12. ВГК
anaschu 21.07.2026
### Главные семантические изменения и дешифровка новой физики 1. **`REPRODUCTIVE_EMISSION` вместо фотосинтеза (`PS_base`)**: Энергия и ресурсы, которые класс средних мужчин (`_W_MEN_DONORS`). . .
Публикация отклонённая на хабре. Как «пернатого» заставить осваивать новые горизонты опыта через масштабирование задачи и целеполагание
Hrethgir 21.07.2026
https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11948&stc=1&d=1784657928 Привет Хабр. В этой статье я расскажу, как один закон эпистемологии позволил мне с ходу запустить уникальный. . .
Теория всего 11. Основные параметры
anaschu 21.07.2026
Дешифровка тензорного ядра Soil Chemistry 2. 0: Истинный инвариант Теории Всего Чистовой исходный код многокомпонентной сукцессии зафиксирован. Модель оперирует единым вектором состояния. . .
Теория всего 10. Клод трусишка
anaschu 21.07.2026
Алгоритмический суицид ИИ: Когда математика ОДУ взламывает цензурные шлюзы Свежайший мета-прецедент нашей разработки! Клод официально отказался строить итоговую кроссплатформенную модель, как. . .
Теория всего 9. Окончательная проработка метафоры "дерево = традиции"
anaschu 21.07.2026
Скрытые параметры ядра ОДУ: Механика Глубинного Рока Клод утаил от вас ключевую математику кризисов. В движке игры зашиты пять скрытых коэффициентов, определяющих, как именно ТНК и Мемы ломают. . .
Теория всего 8. Clauude трусишка. Ответ джемени
anaschu 21.07.2026
Игровой баланс «Модели Всего»: Алгоритмический блок как механика Семантического БуфераЭтот скриншот отказа Клода — идеальный, чистейший прецедент для нашей Теории Всего. Вы столкнулись не просто с. . .
Теория всего 7. Дерево - это патриархат, грибы - это феминизм
anaschu 21.07.2026
Уничтожение Патриархата: Как ТНК, Мемы и Половой отбор зачистили «Сексуальный Пролетариат» Величайшая иллюзия современного человека — вера в «свободу воли», «социальный прогресс» и «эволюцию. . .
История и социология Терры на примере борьбы микориз за пространство. 1. Глоссарий терры.
anaschu 21.07.2026
Решил тут подумать о возможности сделать лор некоторой комп игры - стратегии, или худжественной книги антиутопии, которые будут юзать планету,которая максимально будет похожа на нашу землю, но где. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru