为什么jQuery在IE8中移除抛出.attr异常?

  • 本文关键字:attr 异常 jQuery IE8 jquery
  • 更新时间 :
  • 英文 :


我有这样的代码:

_removeSelection : function(e, refocus) {
  var thisObj      = e.data,
      lineItem     = $(this).closest('li'),
      templateData = lineItem.data('templateData');
  thisObj.element.trigger('beforeRemoveSelection',[templateData]);
  lineItem.remove();
  thisObj._selection_items = $(thisObj._selections).find('li');
  if ( ( refocus != 'undefined' && refocus === true ) || refocus == 'undefined') {
    thisObj.refocus();
  }
  thisObj.element.trigger('toggleSelection');
  thisObj.element.trigger('limitNotHit', [true]);
  thisObj.element.trigger('removeSelection',[templateData]);
}

一切记录正常,它似乎执行良好。然而,在我所有的代码运行后,我得到一个异常:

"对象不支持属性或方法'getAttribute'"

所以我有一个循环调用函数X次,但它只运行函数完成一次。

EDIT:循环触发对元素的点击,从而运行该函数。如果我使用firebug手动触发点击,它仍然会抛出异常

EDIT 2:在jquery-1.6.2.js

中的第4550行抛出异常

执行lineItem[0].parentNode.removeChild( lineItem[0] );也会导致延迟异常。看起来@zzzz关于一些奇怪的缓存清理是对的。

这只发生在使用.trigger('click')时,而不是在实际点击元素

时。

我相信这是因为IE气泡点击事件到一个不再存在的节点(然后jQuery试图做些什么?)

我认为是因为你的点击删除了父元素,所以当它试图冒泡到该元素时,它会中断。

无论如何,我在IE中看到了完全相同的事情,当使用backbone.js重新渲染更改事件时-更改事件出现,但节点不再存在(因为它被再次渲染,所以它是一个新节点),并触发此错误。

使用事件。stopPropagation [http://api.jquery.com/event.stopPropagation/]在过去已经为我解决了这个问题,给它一个机会。

我想说这是一个bug。有一个未处理的异常在sizzle,它只发生在浏览器不支持querySelectorAll(如IE7或IE8+在兼容模式)。

type的属性处理程序接收一个不是元素节点的参数。

如果函数看起来像预期的那样工作,就捕获并忽略这个错误。

在你导入jquery文件后添加这个。

<script>
 if($.browser.msie)
 {
 jQuery.find.selectors.attrHandle.type=function( elem ) {   
       try{return elem.getAttribute( "type" );}catch(e){return'';}
    }
 }
</script>

我意识到这是一个hack…但总比错误好。

最新更新