为什么jQuery会在IE8中删除抛出.attr异常

时间:2011-08-18 21:27:32

标签: 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次,但它只运行一次完成函数。

编辑:循环触发点击运行该功能的元素。如果我使用firebug手动触发单击,它仍会抛出异常

编辑2 :在jquery-1.6.2.js中的第4550行抛出异常

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

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

2 个答案:

答案 0 :(得分:5)

我相信这是因为IE将click事件冒泡到一个不再存在的节点(然后jQuery尝试用它做一些事情?)。

我假设因为你的点击删除了父元素,所以当它试图冒泡到那个元素时就会中断。

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

使用event.stopPropagation [http://api.jquery.com/event.stopPropagation/]过去一直在为我解决这个问题,试一试。

答案 1 :(得分:0)

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

type的attribute-handler接收一个不是元素节点的参数。

如果函数似乎按预期工作,只需捕获并忽略此错误。

导入jquery文件后添加此内容。

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

我意识到它是一个黑客......但比错误更好。