当使用empty()或html()时,jQuery“'events'为null或不是对象”错误

时间:2010-12-03 21:04:12

标签: javascript jquery ajax event-handling dhtml

我在IE中收到以下错误:

  

'events'为null或不是对象 - jquery-latest.js?d = 1848173663,第113行,第467行

我正在使用jQuery 1.4.2,因为我们使用的是旧版本的jQuery UI,并且使用比1.4.2更新的版本,所以我无法升级。

当我在第二次

运行这段代码时出现以下错误
$.post("page/view.do?undoCache=" + Math.random(), {
   pageId: pId
}, function(xmlContent){
   console.log('1');//get this one
   $('#reloadCenterDiv').empty();
   console.log('2');//don't get this one unless line above is commented out, then will run til next line
   $('#reloadCenterDiv').html(xmlContent);
   console.log('3');//don't get this
});

我很确定我在调用之间没有对#reloadCenterDiv做任何其他事情。

搜索错误“'events'为null或不是对象”我发现了这个:

  

“听起来像是对事件的引用   处理程序仍在那里,当时   处理程序本身已经消失。“

这听起来合乎逻辑。关于为什么以及何时会发生此错误的任何其他想法?

我已经找到了发生这种情况的地方,但我的所有线索都在那里结束。

如何清理,以便再次调用#reloadCenterDiv上的empty()或html()?

以下是#reloadCenterDiv的HTML:

<div id="reloadCenterDiv" style="border:none; margin: 0; overflow:auto; overflow-y:scroll; height: auto;"></div>

2 个答案:

答案 0 :(得分:1)

不确定,但似乎jQuery.cache被覆盖了。

由于DOM元素(必要时)有一个映射到jQuery.cache的序列号,当您运行.empty()之类的函数时,jQuery会假定相关数据存在,查找该元素的数据,并删除它。

代替您的第一个日志,请执行以下操作:

console.log(jQuery.cache);

看看它给你的东西。我敢打赌,有些东西会覆盖它。也许你正在加载jQuery两次?

Here's an example故意删除jQuery.cache。它给出了类似的错误。


修改

以下评论摘要。在.empty()(或实际cleanData())期间,jQuery从所有后代元素中获取expando以删除关联数据。

问题在于,当jQuery这样做时,假定数据已成功定位。在这种情况下,数据以某种方式与元素解除关联,因此使用expando的值检索数据将返回undefined

因为jQuery没有(或者没有在1.4.2中)验证是否找到了数据,所以它尝试访问数据上的events属性会导致错误,因为dataundefined

jQuery的更新版本使用if ( data && data.events ) {修复它,该版本验证是否存在一些要求其events属性的对象。

答案 1 :(得分:0)

如果您无法更新jQuery,则可以改为设置HTML:

$("#divid").html("");

这基本上是做同样的事情。