Javascript-форум (https://javascript.ru/forum/)
-   Events/DOM/Window (https://javascript.ru/forum/events/)
-   -   Снять ивент с элемента не имея доступа к функции-хэндлеру (https://javascript.ru/forum/events/46262-snyat-ivent-s-ehlementa-ne-imeya-dostupa-k-funkcii-khehndleru.html)

Faantoom 03.04.2014 15:37

Снять ивент с элемента не имея доступа к функции-хэндлеру
 
Всем доброго времени суток.
Вновь вынужден обратиться сюда за помощью.

Имеется следующий код:
(function(){
    var el = document.getElementById("text_input");
    el.onpaste = el.ondrop = el.oncontextmenu = M;
    function M(){
       return false;
    }
})();

Задача - разрешить контекстное меню и копипаст (снять блокирующие ивенты).
Изюминка в том, что редактировать данный код нельзя, поскольку я пишу клиентский плагин, который подключается к странице, а доступа к серверу нет.
Можно лишь добавить код к имеющемуся, но из-за того что он заключен в функцию, доступа к M() чтобы воспользоваться removeEventListener нет.
Переопределить функцию через .oncontextmenu тоже не получилось.
Была идея с клонированием элемента и удалением старого, это снимет с него все ивенты, но кроме блокирующих на нём висит еще несколько установленных таким же образом, которые необходимо оставить.

Что подскажете?

Octane 03.04.2014 15:56

var el = document.getElementById("text_input");
    el.onpaste = el.ondrop = el.oncontextmenu = null;

Faantoom 03.04.2014 16:04

Octane,
Это было первым, что я попробовал :)
Но эффекта никакого не дало, предыдущий ивент все равно висит.

Octane 03.04.2014 16:13

А точно твой скрипт выполняется позже? Если там через addEventListener еще такой же обработчик добавлен где-нибудь, то никак не уберешь.

Aetae 03.04.2014 19:10

Цитата:

Сообщение от Faantoom (Сообщение 305871)
Octane,
Это было первым, что я попробовал :)
Но эффекта никакого не дало, предыдущий ивент все равно висит.

А не должен. Ищите проблему в другом месте.

Хотя, если вы работаете через userscript, а не изнутри плагина\букмарклета то у вас действительно может не быть доступа к событиям навешанным таким образом. Навряд ли конечно, но попробуйте на всякий: .removeAttribute("onpaste") итд.

Цитата:

Сообщение от Octane (Сообщение 305875)
А точно твой скрипт выполняется позже? Если там через addEventListener еще такой же обработчик добавлен где-нибудь, то никак не уберешь.

Если свой плагин, то очевидно можно и раньше. Тогда можно просто подменить addEventListener на свой.
Или вообще по-хардкору - грузить отредактированную версию скрипта вместо оригинального.

Vlasenko Fedor 03.04.2014 23:05

для этого достаточно переопределить функцию написав
function M() {};

<div id="text_input">Contex tmenu</div>
<script>
  (function () {
    var el = document.getElementById("text_input");
    el.onpaste = el.ondrop = el.oncontextmenu = M;

    function M() {
      alert('M');
    }
  })();
</script>
<script>
  (function () {
    var el = document.getElementById("text_input");
    el.onpaste = el.ondrop = el.oncontextmenu = M;
    function M() {}; //если закомментируете выведет M
  })();
</script>


Часовой пояс GMT +3, время: 18:36.