在这段代码中,火狐看到“本”为被点击,并通过正确的方式href属性的元素。
IE浏览器似乎认为“这”为[对象窗口]代替。 我将如何得到这个工作在两种浏览器相同的方式吗?
注:jQuery的将是可爱的,但不是这个项目的选择
var printElem = getElementsByClassName('print', 'a');
for(i in printElem){
ObserveEvent(printElem[i], 'click', function(e){
window.open(this.href, '', 'location=0,menubar=1,resizable=1,scrollbars=1,width='+810+',height='+700);
cancelEvent(e);
});
}
我在这里将我的两分钱,我想你可以使用它。
有一个比赛3年前 ,看看谁能够写出最好addEvent
实施。 它的一个尝试解决的主要问题是保留this
事件处理程序中。
这里是一个参赛的jQuery的创建者写道:
function addEvent( obj, type, fn ) {
if ( obj.attachEvent ) {
obj['e'+type+fn] = fn;
obj[type+fn] = function(){obj['e'+type+fn]( window.event );}
obj.attachEvent( 'on'+type, obj[type+fn] );
} else
obj.addEventListener( type, fn, false );
}
(当然是对称的):
function removeEvent( obj, type, fn ) {
if ( obj.detachEvent ) {
obj.detachEvent( 'on'+type, obj[type+fn] );
obj[type+fn] = null;
} else
obj.removeEventListener( type, fn, false );
}
其重命名为“ObserveEvent”如果你想。
有你有它,一个8行实现你可以拖放到你的代码 - 没有图书馆,没有框架。 而且你this
处理程序中引用的作品就好了。
您可以使用事件目标 ,如下所示:
ObserveEvent(printElem[i], 'click', function(e){
var target = e.target || e.srcElement;
window.open(target.href, '', 'location=0,menubar=1,resizable=1,scrollbars=1,width='+810+',height='+700);
cancelEvent(e);
});
问题从几乎肯定茎ObserveEvent
使用IE的功能attachEvent
方法,该方法(不像addEventListener
在其他浏览器)不设置this
在事件处理程序被观察的对象。
另一种选择:创建一个闭包范围的处理程序的每个元素的元素:
var printElem = getElementsByClassName('print', 'a');
for(var i in printElem){
(function(elem) { // elem === printElem[i] at time of execution later
ObserveEvent(elem, 'click', function(e){
window.open(elem.href, '', 'location=0,menubar=1,resizable=1,scrollbars=1,width='+810+',height='+700);
cancelEvent(e);
});
})(printElem[i]); // immediately call the temp function with our element
}