Javascript-форум (https://javascript.ru/forum/)
-   Events/DOM/Window (https://javascript.ru/forum/events/)
-   -   Подмена addEventListener firefox. (https://javascript.ru/forum/events/9768-podmena-addeventlistener-firefox.html)

SunnyDay 04.06.2010 16:54

Подмена addEventListener firefox.
 
Здравствуйте, мне необходимо подменить все вызовы функции addEventListener . Нужно это сделать из плагина firefox.
Пробовал так:
var _funcS = HTMLAnchorElement.prototype.addEventListener;
	HTMLAnchorElement.prototype.addEventListener = function(event, funci, bubble) {
			alert(1);
                     _funcS.call(this,event, funci, bubble); 
	};
document.getElementById('link').addEventListener("click", evecatch, false);//не работает


не выходит... Причём подмена любых других методов работает, например:
var funcSetAttr = HTMLAnchorElement.prototype.setAttribute; 
HTMLAnchorElement.prototype.setAttribute = function(name, value) {
   alert(name);
   funcSetAttr.call(this,name,value);
};
document.getElementById('link').setAttribute ("width", "100");//работает


Этот метод вообще можно подменить? Если да, то подскажите как?

Мне это нужно сделать, потому что я пытаюсь сделать 'чистую симуляцию' щелчка мышки initMouseEvent из под фаерфокс-плагина. Проблемма в том что initMouseEvent выдаёт не все аттрибуты объекта event, такими, которыми они должны быть на самом деле при щелчке, плюс фазы события идут неверно. Изменить я их никак не могу - 'not defined getter'. Либо есть какой-нибудь альтернативный способ сгенерировать событие с нужными мне параметрами?

SunnyDay 07.06.2010 16:28

Похоже никто не знает. Может какието намёки, как полностью управлять объектом Event из фаерфокс-плагина? Ладно, придётся перекомпиливать фаерфокс.. Хотя в его исходниках чёрт ногу сломит)

Octane 07.06.2010 16:40

А просто пройтись по всем ссылкам и перезаписать метод?
И еще клик по ссылке может отлавливаться не с самой ссылки, а например так:
document.onclick = function (event) {
    event = event || window.event;
    var target = event.target || event.srcElement;
    if (target.nodeName.toUpperCase() == "A") {
       alert("Нажата ссылка");
       return false;
    }
};

SunnyDay 07.06.2010 17:12

Да, кстати так можно попробовать. Только есть пару факторов - там не только клик, там все мышиные события надо перехватывать это раз. А каким макаром предлагаешь, у каждой ссылки на событие создания делать чтото типа того?
link.addEventListener = function(event, funci, bubble) {
	            /*мой код*/         HTMLAnchorElement.prototype.addEventListener.call(this,event, funci, bubble);
};
link.onclick= function(event){
              /*мой код*/
              HTMLAnchorElement.prototype.onclick.call(this,event);
};

причем моя функция в любом случае должна выполняться первее чем, функции, созданные из дочернего документа....
Идею простая - нужно сделать симуляцию клика, неотличимую от реального клика, из под плагина фаерфокс. Последовательность симулировал, координаты симулировал, движения мыши от координат прошлого клика симулировал, а вот с объектом Event туго...

SunnyDay 07.06.2010 18:45

В принципе рекомпил фаерфокса - это пока лучший вариант из тех что я придумал... Только в коде там чтобы банальные вещи сделать, нужно много копаться. Всем спасибо =)

tenshi 08.06.2010 02:24

document.addEventListener( 'click', function( evt ){ исправляем evt }, true )

SunnyDay 08.06.2010 18:04

Цитата:

Сообщение от tenshi (Сообщение 58387)
document.addEventListener( 'click', function( evt ){ исправляем evt }, true )

так точно непрокатит, проверь

document.addEventListener( 'click', function( evt ){ evt=null;}, true);
document.getElementById('link').addEventListener("click", evecatch, true);
function evecatch(evt){
	alert(evt);
};

tenshi 08.06.2010 18:13

не заменить, а изменить..

SunnyDay 08.06.2010 18:19

Цитата:

Сообщение от tenshi (Сообщение 58544)
не заменить, а изменить..

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


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