Как один и тот же объект DOM может иметь отдельные экземпляры событий в нескольких областях одновременно и как я могу назначить анонимные? - PullRequest
0 голосов
/ 24 октября 2019

Этот вопрос всегда меня поражал, и я много лет искал вопросы StackOverflow о работе с анонимной областью действия в пользовательских скриптах, никогда не удовлетворяясь обходными обходными путями, предложенными вместо этого в большинстве ответов.

Итак, на странице есть сценарий, который присваивает обратный вызов событию onblur элемента DOM.
Чтобы уточнить, на всякий случай, обратный вызов не имеет встроенного HTML.
Iхочу, чтобы этот обратный вызов никогда не срабатывал. Я не могу отключить событие (могу ли я?), Но теоретически я могу удалить функцию обратного вызова из него.

Естественно, я получаю этот элемент в консоли и проверяю его свойство .onblur - я получаю null.
Хорошо, я бы хотел в это поверить ... но на самом деле есть обратный вызов ион все еще срабатывает каждый раз, когда элемент размыт.

Если я назначу свой собственный обратный вызов этому событию - тогда сработает и «скрытый», и мой обратный вызов .

Речь идет о любой случайной странице FANDOM / Wikia с новым макетом Oasis, например, Fandom Developers Wiki .

Когда я преттифицирую этот сценарий со страницы в Waterfox (консервативный форк Firefox), эти строки попадают мне в глаза:

6963:$(function($) {
6964:    'use strict';
6965:    var $globalNav = $('.wds-global-navigation'),
6966:        $searchContainer =
6967:        $globalNav.find('.wds-global-navigation__search-container'),
6968:        $searchInput = $globalNav.find('.wds-global-navigation__search-input'),
6969:        $searchSubmit = $globalNav.find('.wds-global-navigation__search-submit'),
6970:        $searchToggle = $globalNav.find('.wds-global-navigation__search-toggle'),
6971:        activeSearchClass = 'wds-search-is-active';
6972:    function activateSearch() {
6973:        if (!$globalNav.hasClass(activeSearchClass)) {
6974:            $globalNav.addClass(activeSearchClass);
6975:            $searchInput.focus();
6976:        }
6977:    }
6978:    function deactivateSearch() {
6979:        $searchSubmit.prop('disabled', true);
6980:        $searchInput.val('');
6981:        $globalNav.removeClass(activeSearchClass);
6982:        $searchContainer.removeClass('wds-search-is-focused');
6983:    }
6984:    $searchInput.on('input', function() {
6985:        var textLength = this.value.length;
6986:        if (textLength > 0 && $searchSubmit.prop('disabled')) {
6987:            $searchSubmit.prop('disabled', false);
6988:        } else if (textLength === 0) {
6989:            $searchSubmit.prop('disabled', true);
6990:        }
6991:    });
6992:    $searchInput.on('keydown', function(event) {
6993:        if (event.which === 27) {
6994:            deactivateSearch();
6995:            $searchInput.blur();
6996:        }
6997:    }).on('blur', function() {
6998:        if (!this.value.length) {
6999:            deactivateSearch();
7000:        }
7001:    })[…]

Я работаю с ViolentMonkeyв Waterfox. (Должно быть примерно эквивалентно GreaseMonkey в Firefox)
Я не очень хорошо знаю jQuery (от которого пахнет этот код) и, похоже, никогда не нуждался в нем, когда возился, но дайте мне знать, если я что-то упустилочевидно.

Подводя итог более подробно (подождите, что теперь?) :

Я пытаюсь сбросить обратный вызов из document.getElementsByClassName('wds-global-navigation__search-input')[0].onblur, например, Fandom DevelopersWiki , чтобы поле поиска всегда оставалось на экране вместо того, чтобы появляться только после нажатия на кнопку поиска (легко смоделировано с document.getElementsByClassName('wds-global-navigation__search-toggle')[0].click()), но до тех пор, пока поле не потеряет фокус (это сложночасть к среднему).

Это так неприятно, когда я открываю код на странице в отладчике, сразу вижу, что нужно изменить в скрипте или в памяти после запуска скрипта, но естьнет никакой возможности повлиять ни на что.

Я думаю, я мог бы пойти @run-at document-start и document.onbeforescriptexecute = funcRef; на взломать весь сценарий и попытаться разобрать его, но не менее решительныприближается ?

PS
Я не смог создать тег "violentmonkey", чтобы пометить мой вопрос. Извините, это все из-за репутации.
Решили не использовать «жировую обезьяну», так как она устарела и вырастила свою собственную причуду.

С практической точки зрения, я по-прежнему буду признателен за простое решение для особых случаев, чтобы поле поиска постоянно оставалось открытым, но я бы хотел сосредоточиться на общем случае вопроса, поскольку я склоненочень часто сталкиваюсь с проблемой изменения данных в анонимной области.

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

...