有没有办法用IE 7或8获取事件的当前目标?
我们可以使用其他浏览器(firefox,opera,chrome等)
event.currentTarget
或我们也可以使用this
关键字
参考处理事件的对象。
但是在 Internet Explorer 中,我们没有currentTarget
属性,而this
指的是窗口对象!
那我怎么能这样做呢?
答案 0 :(得分:30)
您可以执行类似
的操作target = (event.currentTarget) ? event.currentTarget : event.srcElement;
虽然@Marc提到你可以使用一个JQuery框架来为你规范化事件。
答案 1 :(得分:25)
我有类似的问题。我使用an article on brainjar.com
中所述的关键字this
解决了这个问题
要获取IE中currentTarget属性的等效项,请使用 在标记中设置事件处理程序时,此关键字作为参数。
...
function myHandler(event,link){...}
在同一页面上,您可以找到下表:
答案 2 :(得分:12)
简短的回答是:使用jQuery。
虽然在IE上无法访问event.currentTarget
,但jQuery会为您规范化事件,因此您的代码也适用于IE(如here所述)
请注意,使用event.srcElement
,如其他答案中所建议的那样不等效,因为srcElement
对应target
,而不是currentTarget
,正如this page末尾所解释的那样。
答案 3 :(得分:2)
使用此函数,您可以在添加时传递对象并在侦听器中获取它。 这个问题是你有一个匿名函数作为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。
答案 4 :(得分:1)
我假设您想要使用'this'上下文,因为相同的处理程序将处理多个可能的对象。在这种情况下,请参阅quirksmode重新编码竞赛中出色的AddEvent脚本。 (http://www.quirksmode.org/blog/archives/2005/09/addevent_recodi.html)。这段代码让我可以从html中获取最后一个javascript。更重要的是,它似乎适用于我测试过的所有浏览器。简单紧凑。
答案 5 :(得分:1)
附加说明:有时IE(如ie 7)将为event.target返回undefined,因此它甚至不会将其评估为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的全局事件。
答案 6 :(得分:1)
如果它是IE,此函数会创建currentTarget
,因此您不再需要修改代码!
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(不适用于9以下的IE):
function myfunction(e) {
alert(e.currentTarget.id);
}
e = document.getElementById('id');
e.AddEventListener(e,'mouseover',myfunction);
使用此功能(适用于低于9的IE):
function myfunction(e) {
alert(e.currentTarget.id);
}
e = document.getElementById('id');
eventListener(e,'mouseover',myfunction);
答案 7 :(得分:1)
使用Prototype JS,您可以使用:
var target = Event.element(event);
答案 8 :(得分:1)
Internet Explorer 6 - 8 不实现event.currentTarget。
在Internet Explorer 6到8中,事件模型不同。事件侦听器附加了非标准的element.attachEvent方法。在这个模型中,没有与event.currentTarget等效的东西,这是全局对象。 模拟event.currentTarget功能的一个解决方案是将处理程序包装在使用Function.prototype.call调用处理程序的函数中,并将元素作为第一个参数。这样,这将是预期值。
如果你仍然使用 jQuery ,那么jQuery负责规范事件对象及其属性(如其他答案中多次所述)。引自jQuery API docs:
jQuery的事件系统根据W3C标准规范化事件对象。
答案 9 :(得分:0)
答案 10 :(得分:0)
我想给出一个更简单的答案,其中的肉与anas'中的肉和用户1515360的答案相同:
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的浏览器上可用。
答案 11 :(得分:0)
我不确定,但这可能是一个解决方案: 因为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
这似乎工作正常,直到现在和我一起纠正我,如果你发现问题cz我需要一个解决方案 我不想使用jquery ..
答案 12 :(得分:0)
您始终可以使用闭包并传入已附加事件处理程序的元素。这些方面的东西......
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);