我有这样的代码:
_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')时才会发生这种情况,而不是在实际点击元素时
答案 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>
我意识到它是一个黑客......但比错误更好。