Подтвердить что ты не робот

Событие Internet Explorer и JavaScript currentTarget

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

С другим браузером (firefox, opera, chrome и т.д.) мы можем использовать event.currentTarget, а также мы можем использовать ключевое слово this. обратитесь к объекту, обрабатывающему событие.

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

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

4b9b3361

Ответ 1

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

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

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

Ответ 2

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

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

...

function myHandler (событие, ссылка) {...}

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

enter image description here

Ответ 3

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

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

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

Ответ 4

с помощью этой функции вы можете передать объект при добавлении и получить его в слушателе. проблема в том, что у вас есть анонимная функция как eventlistener, а в actionscript вы не можете удалить анонимный прослушиватель. dunno bout 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.

Ответ 5

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

Ответ 6

Дополнительная заметка: Иногда IE (например, 7) возвращает undefined для event.target, поэтому он даже не оценит его как истинный или ложный (будь то в или в тройном операторе). Кроме того, даже если вы попробуете typeof event.target == 'undefined', все равно будет ошибка: "event.target is undefined". Это, конечно, глупо, потому что это то, что вы тестируете.
По-видимому, это проблема с передачей событий в функции в более старом IE. Что вы делаете, чтобы исправить это:

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

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

Ответ 7

Эта функция создает 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);

Ответ 8

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

var target = Event.element(event);

Ответ 9

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

Цитата из Mozilla Developer Network:

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

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

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

Ответ 11

Я хотел бы дать более простой ответ: мясо это то же самое, что мясо в anas 'и user1515360 отвечает:

if (browserDoesNotUnderstandCurrentTarget) {
        someElement.onclick = function (e) {
                if (!e) { var e = window.event; }
                e.currentTarget = someElement;
                yourCallback(e);
        }
}
else {
        someElement.onclick = yourCallback;
}

Замените onclick для любого события, которое вы хотите, конечно.

Это делает e.currentTarget доступным в браузерах, которые не поддерживают currentTarget.

Ответ 12

Я не уверен, но это может быть решение: поскольку дочерний элемент, заданный srcElement, не должен иметь событие, потому что это сделает помехи в событии на родительском элементе ни другим верхним элементом перед верхним элементом, где оператор события (например, onmosedown = ""), так что это код:

if (!event) event = window.event; 
if (event.currentTarget) element = event.currentTarget; 
else{element = event.srcElement; while(element.onmousedown==null) element = element.parentNode;}
if(element.nodeType==3) element=element.parentNode;  // defeat Safari bug

Кажется, что это работает до сих пор со мной, пожалуйста, исправьте меня, если u найдет проблему cz Мне нужно решение для этого Я не хочу использовать jquery..

Ответ 13

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

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);