【问题标题】:jQuery "'events' is null or not an object" error, when using empty() or html()使用 empty() 或 html() 时出现 jQuery“'events' 为 null 或不是对象”错误
【发布时间】:2011-05-19 23:44:59
【问题描述】:

我在 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' is null or not an object”我发现了这个:

“听起来像是对事件的引用 处理程序仍然存在,当 处理程序本身已经消失了。”

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

我找到了发生这种情况的地方,但我的所有线索都到此为止了。

如何清理这些东西以便我可以再次在#reloadCenterDiv 上调用empty() 或html()?

这是#reloadCenterDiv 的 HTML:

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

【问题讨论】:

    标签: javascript jquery ajax event-handling dhtml


    【解决方案1】:

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

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

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

    console.log(jQuery.cache);
    

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

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


    编辑:

    以下 cmets 的摘要。在.empty()(或者实际上是cleanData())期间,jQuery 会从所有后代元素中抓取展开,以删除相关数据。

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

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

    jQuery 的更新版本用if ( data &amp;&amp; data.events ) { 修复了它,这会验证是否有一些对象可以请求它的events 属性。

    【讨论】:

    • 第一次和第二次调用在 IE 开发者工具中都返回 [object Object]。如何查看对象是什么?在 Firebug 中检查这个有什么好处吗?我在 FireFox 中没有收到错误消息。
    • @Dale - 是的,Firebug 或 Google Chrome 的工具应该可以让您举例说明对象的内容。听起来你那里有一个对象。尝试做console.log(jQuery.cache[1])。是否有可能在某处加载另一个版本的 jQuery?也许通过 AJAX 调用?我相信这可能会用新版本覆盖缓存。
    • @patrick dw - 不,只加载了一个 jQuery 实例。现在刚刚检查以确保更加确定。
    • @patrick dw - console.log(jQuery.cache[1]);仍然只是返回 [object Object]
    • @Dale - 好的,让我知道。另外,我知道您无法升级,但出于好奇,可能值得尝试使用 1.4.4,看看它是否是已修复的错误。我知道过去在覆盖数据方面存在错误。如果修复了,那么我们也许可以在 jQuery 的 bugtracker 中追踪问题,看看是否有解决方法。
    【解决方案2】:

    如果你不能更新你的 jQuery,你可以设置 HTML:

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

    这本质上是在做同样的事情。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-05-07
      • 2011-02-24
      • 2018-08-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多