Я хочу добавить чистый javascript на этой странице (мне не разрешено изменять другие js-файлы) и взять под контроль событие click.
Если код будет на этой странице, то он может использовать JQuery, что хорошо, потому что это также единственный способ, которым Вы можете разрегистрировать JQuery-зарегистрированный обработчик:
$("#someId").off("click").on("click", function() {
// Your new code here
});
Calling .off("click")
на элемент удаляет все Зарегистрированные jQuery click
обработчики из этого элемента.
Это, как правило, лучший подход, чем сплетение обработчиков, зарегистрированных другим кодом на странице.
Почему вы не можете разрегистрировать JQuery-зарегистрированный обработчик без использования JQuery: первый раз, когда конкретное событие зацепляется конкретного элемента с помощью JQuery, JQuery регистрирует один обработчик (его собственный), чтобы использовать для это событие на этом элементе; если добавлено больше обработчиков, он просто добавляет их в свой собственный внутренний список, он не регистрирует их с DOM. Вместо этого, когда событие DOM запущено, jQuery просматривает список обработчиков и запускает их.
Чтобы отменить регистрацию фактического обработчика jQuery для события на элементе, вам нужно будет получить ссылку на экземпляр jQuery конкретной функции, используемый при его регистрации. (removeEventListener
не имеет эквивалента выше «очистить все из них»). Это Ссылка доступна только из структур данных внутри закрытия jQuery, поэтому вы не можете получить ее без использования jQuery.
Что я должен делать, если другие обработчики должны возобновить быть выполнены при определенных обстоятельствах в $ .он() блок?
А, это намного сложнее. Все зависит от большего контекста, чем присутствует в вашем вопросе.Некоторые варианты:
На сегодняшний день лучше всего изменить другой код, обрабатывающий клики. Но я понимаю, вы говорите, что не можете этого сделать.
jQuery вызывает обработчики в том порядке, в котором они были зарегистрированы (это одна из причин, по которым он обрабатывает множество обработчиков, разные браузеры делают вещи в разных порядках). Поэтому, если вы можете подключить click
по адресу #someId
до, то другой код делает, тогда вы можете надежно использовать event.stopImmediatePropagation()
для предотвращения вызова других обработчиков. Это не сработает, конечно, если ваш обработчик не первый в списке, потому что другие обработчики будут вызваны первыми.
Если есть элемент внутри #someId
элемента, который полностью заполняет его, вы можете подключить click
на этого элемента вместо этого, а затем использовать event.stopPropagation()
, чтобы предотвратить событие от барботирования до #someId
элемента.
И, конечно, если есть не элемент, как # 3, вы, вероятно, можете вставить один (динамически, с кодом) и двигаться #someId
«s содержания в нем, так что вы можете придать свой обработчик в пузыриться.
Вы можете погрузиться в внутренности jQuery и выяснить, как получить доступ к цепочке обработчика событий и манипулировать им. Раньше это было довольно легко; Я думаю, что последние версии сделали это сложнее. Разумеется, это произойдет на недокументированной территории, которая может измениться с помощью любой «точечной» версии.
Почему ваше решение должны быть в «чистом JavaScript»? Почему вы не можете просто выполнить '$ ('# someId'). Off ('click')', а затем повторно привязать его? –
В jQuery нет ничего «нечистого JavaScript». Возможно, вы имеете в виду, что хотите использовать только методы DOM. –
Что вы подразумеваете под *** «кажется, не работает» ***? – RononDex