Вопрос по dom, html, events, internet-explorer – Как получить доступ к Event.target в IE9?
Объектная модель HTML DOM определяетEvent
объектсtarget
property.
Глядя на MSDN, Microsoft документируетtarget
property, Они также документируютsrcElement
как псевдонимtarget
из более ранних версий Internet Explorer:
The target property is similar to srcElement in Windows Internet Explorer 8 and earlier versions.
Итак, я нахожусь в Internet Explorer, сидя заclick
Точка останова:
<div class="day" onclick="divClick(this)">
function divClick(sender)
{
var divCell = sender;
И наF12 Tools консоль я могу попросить глобальныйevent
объект:
>> event
{
actionURL : "",
altKey : false,
altLeft : false,
behaviorCookie : 0,
behaviorPart : 0,
bookmarks : null,
boundElements : {...},
button : 0,
buttonID : 0,
cancelBubble : false
...
}
И я могу попроситьevent.srcElement
объект:
>> event.srcElement
{
align : "",
noWrap : false,
dataFld : "",
dataFormatAs : "",
dataSrc : "",
currentStyle : {...},
runtimeStyle : {...},
accessKey : "",
className : "header",
contentEditable : "inherit"
...
}
Ноevent.target
пустой:
>> event.target
И если яwatch event
, здесь нетtarget
имущество:
Так как мне получить доступ кtarget
собственностьevent
объект в Internet Explorer (9 (режим документа: стандарты IE9 (режим браузера: IE9)))?
Простой способ архивировать это с помощью:
var target = event.target || event.srcElement;
- Avoid to use a ternary operator.
Это работает потому что:
- Test if
event.target
is a truthy which if does not exist in that browser will evaluate to false. - If evaluates to false then it will move to the next operator which in this case is
event.srcElement
.
И с этим вы получите первое значение, которое присутствует в текущем браузере, где выполняется код.
Проблема заключалась не в том, что вы не использовалиaddEventListener()
(потому что старая школа.onclick
-присвоение тоже работает). Проблема заключалась в том, чтоdivClick
получилthis
(что равноeventobj.target
), но вы хотите, чтобы весьeventobj
.
В следующих двух случаях вы получите толькоeventobj.target
под именемthis
и у вас нет доступа к аргументам, передаваемым обработчику onclick.
<div id=xyz onclick="divClick(this);">
document.getElementById("xyz").onclick = function () { divClick(this); };
Вы получаете весьeventobj
как обычный параметр со следующей строкой:
document.getElementById("xyz").onclick = divClick;
Вот как событие запускается в элементе xyz в IE9 + и других браузерах:
document.getElementById("xyz").onclick(eventobj)
Если вы хотите использоватьevent.target
в IE9 вам нужно будет использоватьaddEventListener()
-метод, чтобы назначить обработчик событий для элемента.
<div id="day" class="day"></div>
document.getElementById('day').addEventListener('click',divClick,false);
function divClick(e){
alert(e.target);
divCell=this;
:
}
ВdivClick()
вы можете сослатьсяday
просто используя ключевое словоthis
, аргументацияe
содержит ссылку на сам объект события.
Кстати, в MSDN вы можете найти более подходящую IE-документацию длявеб-разработка вместо разработки Windows.
onclick
Error: User Rate Limit Exceeded
event.target
is IE9, you'll need to use addEventListener()
"Error: User Rate Limit Exceededevent.target
Error: User Rate Limit Exceededonclick
Error: User Rate Limit Exceeded
Event
Error: User Rate Limit Exceeded.target
Error: User Rate Limit Exceeded
Здесь идет мое исследование (проверено в IE9, IE10 и режимах браузера Edge на IE11, IE8, к сожалению, ломает jsFiddle). В режиме IE9 (IE11) event.target был доступен в качестве локальной переменной для функции, не знаю, отличается ли он от реального IE9.
Вы не можете получить доступevent
в любом браузере со встроенной функцией. Проблема в том, что когда вы делаете
<element onclick="someFunc(this)">
и вы проходитеthis
в качестве параметра,this === event.target
(или srcElement), а именно[HTML Object]
не[Event Object]
.
Таким образом, на практике это означает, что это:
<div id="foo" onclick="alert(this)"></div>
такой же как:
// note that onclick perfectly works, you don't necessarily need addEventListener
document.getElementById('foo').onclick = function(e) { alert(e.target) } //or
document.getElementById('foo').addEventListener('click', function(e) { alert(e.target) }, false);
Таким образом, вы получаете доступ к цели события либо непосредственно в качестве параметра, либо через javascript в качестве параметра объекта.target || srcElement
имущество.
Вы можете проверить результаты для себя здесь:http://jsfiddle.net/kevinvanlierde/tg6FP/2/
Note: В случае, если вы присоединяете inline, положение ваших сценариев имеет решающее значение (непосредственно перед закрытием тега body)
Note: В случае, если вы приложите в строке, учитывая, чтоevent.target
является "корнем"; переданного объекта, вы не можете получить доступ к другим свойствам события, напримерevent.type
.
Note: Будьте осторожны с режимом IE Developer. Я знаю, что он обманывает (например, неправильно отображает содержимое DOM в дереве элементов, пока вы не нажмете "Изменить как HTML")
event.target?
Вам нужно проверить это, назначить это переменной и использовать вместо этого ..
var target = event.target ? event.target : event.srcElement;
может не хватать смысла ...
event.target
Error: User Rate Limit Exceededevent.target
Error: User Rate Limit ExceededseeError: User Rate Limit Exceededevent.target
.