Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 03.04.2014, 15:37
Новичок на форуме
Отправить личное сообщение для Faantoom Посмотреть профиль Найти все сообщения от Faantoom
 
Регистрация: 14.03.2014
Сообщений: 4

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

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

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

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

Последний раз редактировалось Faantoom, 03.04.2014 в 15:42.
Ответить с цитированием
  #2 (permalink)  
Старый 03.04.2014, 15:56
Отправить личное сообщение для Octane Посмотреть профиль Найти все сообщения от Octane  
Регистрация: 10.07.2008
Сообщений: 3,873

var el = document.getElementById("text_input");
    el.onpaste = el.ondrop = el.oncontextmenu = null;
Ответить с цитированием
  #3 (permalink)  
Старый 03.04.2014, 16:04
Новичок на форуме
Отправить личное сообщение для Faantoom Посмотреть профиль Найти все сообщения от Faantoom
 
Регистрация: 14.03.2014
Сообщений: 4

Octane,
Это было первым, что я попробовал
Но эффекта никакого не дало, предыдущий ивент все равно висит.
Ответить с цитированием
  #4 (permalink)  
Старый 03.04.2014, 16:13
Отправить личное сообщение для Octane Посмотреть профиль Найти все сообщения от Octane  
Регистрация: 10.07.2008
Сообщений: 3,873

А точно твой скрипт выполняется позже? Если там через addEventListener еще такой же обработчик добавлен где-нибудь, то никак не уберешь.
Ответить с цитированием
  #5 (permalink)  
Старый 03.04.2014, 19:10
Аватар для Aetae
Тлен
Отправить личное сообщение для Aetae Посмотреть профиль Найти все сообщения от Aetae
 
Регистрация: 02.01.2010
Сообщений: 6,586

Сообщение от Faantoom Посмотреть сообщение
Octane,
Это было первым, что я попробовал
Но эффекта никакого не дало, предыдущий ивент все равно висит.
А не должен. Ищите проблему в другом месте.

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

Сообщение от Octane Посмотреть сообщение
А точно твой скрипт выполняется позже? Если там через addEventListener еще такой же обработчик добавлен где-нибудь, то никак не уберешь.
Если свой плагин, то очевидно можно и раньше. Тогда можно просто подменить addEventListener на свой.
Или вообще по-хардкору - грузить отредактированную версию скрипта вместо оригинального.
__________________
29375, 35

Последний раз редактировалось Aetae, 03.04.2014 в 19:26.
Ответить с цитированием
  #6 (permalink)  
Старый 03.04.2014, 23:05
Аватар для Vlasenko Fedor
Профессор
Отправить личное сообщение для Vlasenko Fedor Посмотреть профиль Найти все сообщения от Vlasenko Fedor
 
Регистрация: 13.03.2013
Сообщений: 1,572

для этого достаточно переопределить функцию написав
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>
Ответить с цитированием
Ответ



Опции темы Искать в теме
Искать в теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Получение элемента в функции, используя each() ansi_str jQuery 0 30.11.2012 09:48
Как вызвать eval в контексте другой функции для доступа к ее локальным переменным? Почемучкин Общие вопросы Javascript 8 29.10.2012 22:31
Вставка элемента в место вызова функции belkir Элементы интерфейса 21 05.08.2011 08:59
Обращение к функции click по id элемента MCTrane jQuery 4 05.12.2010 18:18