Internet Explorer и JavaScript событие currentTarget - PullRequest
44 голосов
/ 13 мая 2009

Есть ли способ получить текущую цель события с помощью IE 7 или 8?

С другим браузером (Firefox, Opera, Chrome и т. Д.) Мы можем использовать event.currentTarget или также мы можем использовать ключевое слово this для обратитесь к объекту, обрабатывающему событие.

Но в Internet Explorer у нас нет свойства currentTarget, а this относится к объекту окна!

Так как я могу это сделать?

Ответы [ 13 ]

30 голосов
/ 16 февраля 2011

Вы можете сделать что-то вроде

target = (event.currentTarget) ? event.currentTarget : event.srcElement;

Хотя, как упоминал @Marc, вы можете использовать JQuery Framework, который нормализует событие для вас.

25 голосов
/ 06 марта 2012

У меня была похожая проблема. Я решил это, используя ключевое слово this, как указано в статье на brainjar.com

Чтобы получить эквивалент свойства currentTarget в IE, используйте это ключевое слово в качестве аргумента при установке обработчика события в теге.

...

функция myHandler (событие, ссылка) {...}

На этой же странице вы можете найти следующую таблицу:

enter image description here

12 голосов
/ 09 декабря 2009

Краткий ответ: используйте jQuery.

Хотя event.currentTarget недоступно в IE, jQuery нормализует событие для вас, поэтому ваш код также будет работать в IE (как указано здесь )

Обратите внимание, что использование event.srcElement, как предлагается в других ответах, равно , а не эквивалентно, поскольку srcElement соответствует target, а не currentTarget, как объяснено в конце эта страница .

2 голосов
/ 16 марта 2011

с помощью этой функции вы можете передать объект при добавлении и получить его в слушателе. проблема в том, что у вас есть анонимная функция в качестве обработчика событий, и в ActionScript вы не можете удалить анонимного слушателя не знаю о JS.

addEvent:function(object,type,listener,param)
    {
    if(object.addEventListener)
      object.addEventListener(type, function(e){ listener(object, e, param);}, false );
    else
    if(object.attachEvent)
      object.attachEvent('on'+type, function(e){ e = getEvent(e); listener(object, e, param);});
    },

getEvent:function(e)
        {
    if(!e) e = window.event; // || event
    if(e.srcElement) e.target = e.srcElement;
    return e;
    },

removeEvent:function(object,type,listener)
    {
    if(object.removeEventListener)
    object.removeEventListener(type, listener, false);
    else
    object.detachEvent('on'+type, listener);
    }

var div = document.getElementById('noobsafediv');
var div2 = document.getElementById('noobsafediv2');
addEvent(div,'mouseover',mouseover,['astring',111,div2]);


function mouseover(object,e,param)
 {
 console.log(object,e,param);
 }

это мои рамки, и я называю это jNoob.

1 голос
/ 05 марта 2014

Internet Explorer 6 - 8 не реализует event.currentTarget.

Цитата из Сеть разработчиков Mozilla :

В Internet Explorer с 6 по 8 модель событий отличается. Слушатели событий присоединяются с помощью нестандартного метода element.attachEvent. В этой модели нет эквивалента event.currentTarget, и это глобальный объект. Одним из решений для эмуляции функции event.currentTarget является обертывание вашего обработчика в функцию, вызывающую обработчик, используя Function.prototype.call с элементом в качестве первого аргумента. Таким образом, это будет ожидаемое значение.

Если вы все равно используете jQuery , то jQuery позаботится о нормализации объекта события и его свойств (как неоднократно указывалось в других ответах). Цитата из Документация по jQuery API :

Система событий jQuery нормализует объект события в соответствии со стандартами W3C.

1 голос
/ 23 мая 2013

С Prototype JS вы можете использовать:

var target = Event.element(event);
1 голос
/ 03 февраля 2013

Эта функция создает currentTarget в случае, если это IE, поэтому вам больше не нужно исправлять свой код!

function eventListener(e,t,f) {
   if(e.addEventListener)
       e.addEventListener(t,f);
   else
       e.attachEvent('on' + t,
                     function(a){
                         a.currentTarget = e;
                         f(a);
                     });
}

Обычный JS (не будет работать в IE ниже 9):

function myfunction(e) {
    alert(e.currentTarget.id);
}

e = document.getElementById('id');
e.AddEventListener(e,'mouseover',myfunction);

С этой функцией (будет работать в IE ниже 9):

function myfunction(e) {
    alert(e.currentTarget.id);
}
e = document.getElementById('id');
eventListener(e,'mouseover',myfunction);
1 голос
/ 24 июля 2012

Дополнительное примечание: иногда IE (например, 7) возвращает undefined для event.target, поэтому он даже не оценивает его как true или false (как в операторе if, так и в троичном операторе) Более того, даже если вы попробуете typeof event.target == 'undefined', он все равно выдаст ошибку, сообщив, что «event.target не определен». Что, конечно, глупо, потому что это то, что вы тестируете.
По-видимому, это проблема с передачей событий в функции в старых IE. Что вы делаете, чтобы исправить это:

event = event ? event : window.event;
if (typeof event.target == 'undefined') {
    var target = event.srcElement;
    } else {
    var target = event.target;
    }

Обратите внимание, что вы переписываете событие в совместимых со стандартами браузерах и захватываете глобальное событие для IE.

1 голос
/ 14 мая 2009

Я предполагаю, что вы хотите использовать контекст 'this', потому что один и тот же обработчик будет иметь дело с множественными возможными объектами. В этом случае, посмотрите отличный скрипт AddEvent от конкурса перекодирования quirksmode. (http://www.quirksmode.org/blog/archives/2005/09/addevent_recodi.html). Этот код позволил мне получить самый последний из моих javascript из html. Более того, он работает во всех протестированных мной браузерах. Простой и компактный.

0 голосов
/ 23 марта 2016

Вы всегда можете использовать замыкание и передавать элемент, к которому прикреплен обработчик события. Что-то в этом роде ...

function handlerOnClick (currentTarget) {
    return function () {
        console.log(currentTarget);
    } 
}

var domElement = document.createElement('DIV');
domElement.innerHTML = 'Click me!';
domElement.onclick = handlerOnClick(domElement);
document.body.appendChild(domElement);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...