的“这个” IE的理解(IEs understanding of 'this')

2019-08-16 17:11发布

在这段代码中,火狐看到“本”为被点击,并通过正确的方式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);
    });
}

Answer 1:

我在这里将我的两分钱,我想你可以使用它。

有一个比赛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处理程序中引用的作品就好了。



Answer 2:

您可以使用事件目标 ,如下所示:

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


Answer 3:

问题从几乎肯定茎ObserveEvent使用IE的功能attachEvent方法,该方法(不像addEventListener在其他浏览器)不设置this在事件处理程序被观察的对象。



Answer 4:

另一种选择:创建一个闭包范围的处理程序的每个元素的元素:

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
}


文章来源: IEs understanding of 'this'