Ответ 1
Вы можете сделать что-то вроде
target = (event.currentTarget) ? event.currentTarget : event.srcElement;
Хотя, как упоминалось в @Marc, вы можете использовать структуру JQuery, которая нормализует событие для вас.
Есть ли способ взять текущую цель события с IE 7 или 8?
С другим браузером (firefox, opera, chrome и т.д.) мы можем использовать
event.currentTarget
, а также мы можем использовать ключевое слово this
.
обратитесь к объекту, обрабатывающему событие.
Но в Internet Explorer у нас нет свойства currentTarget
, а this
- объект окна!
Итак, как я могу это сделать?
Вы можете сделать что-то вроде
target = (event.currentTarget) ? event.currentTarget : event.srcElement;
Хотя, как упоминалось в @Marc, вы можете использовать структуру JQuery, которая нормализует событие для вас.
У меня была аналогичная проблема. Я решил это, используя ключевое слово this
, как указано в статью о brainjar.com
Чтобы получить эквивалент свойства currentTarget в IE, используйте это ключевое слово в качестве аргумента при установке обработчика события в теге.
...
function myHandler (событие, ссылка) {...}
На той же странице вы можете найти следующую таблицу:
Короткий ответ: используйте jQuery.
Хотя event.currentTarget
недоступен в IE, jQuery будет нормализовать событие для вас, чтобы ваш код также работал на IE (как указано здесь)
Обратите внимание, что использование event.srcElement
, как предлагается в других ответах, эквивалентно не, поскольку srcElement
соответствует target
, а не currentTarget
, как объясняется в конце эта страница.
с помощью этой функции вы можете передать объект при добавлении и получить его в слушателе. проблема в том, что у вас есть анонимная функция как 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.
Я предполагаю, что вы хотите использовать контекст 'this', потому что тот же обработчик будет иметь дело с множеством возможных объектов. В этом случае см. Отличный AddEvent script из конкурса перекодировки quirksmode. (http://www.quirksmode.org/blog/archives/2005/09/addevent_recodi.html). Этот код позволил мне получить последний из javascript из html. Что еще более важно, похоже, это работает на всех браузерах, которые я тестировал. Простой и компактный.
Дополнительная заметка: Иногда 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.
Эта функция создает 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);
С помощью Prototype JS вы можете использовать:
var target = Event.element(event);
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.
Свойство currentTarget поддерживается от версии IE версии 9 и далее.
Я хотел бы дать более простой ответ: мясо это то же самое, что мясо в 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.
Я не уверен, но это может быть решение: поскольку дочерний элемент, заданный 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..
Вы всегда можете использовать закрытие и передать элемент, к которому привязан обработчик событий. Что-то в этом роде...
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);