为什么IE使用鼠标hover处理程序为服务器端元素添加jQuery属性?

这对我来说不是一个至关重要的知识,但我仍然想知道这里到底发生了什么。

这是一个.NET 3.5 Web窗体应用程序。 其中一个页面有3个服务器端输入,类型为“submit”。 这些输入中的每一个都使用jQuery为它们分配了以下JavaScript处理程序:

$('.button').mouseover(function() { $(this).addClass('hoverEffect'); }); $('.button').mouseout(function() { $(this).removeClass('hoverEffect'); }); 

当我运行以下脚本时(是的,这是IE特定的)

  $(document).ready(function() { d = window.open(); d.document.open('text/plain').write(document.documentElement.outerHTML); }); 

在页面上,我得到以下按钮标记:

  

问题是,这个jQuery1287434381268究竟是什么=“2”

这些值从2到4.因此,第一个按钮是2,第二个是3,第三个是4.每次重新加载页面时,1287434381268编号都不同。 我知道它与2个JavaScript处理程序有关,因为如果我删除它们,属性就不再存在了。 这是IE处理jQuery分配处理程序的方式吗? 如果我在IE中执行简单的View-> Source,那么这个东西就不会出现,因为它不会出现在FF Page Source或FireBug中。

编辑:我刚刚在另一个页面上运行了这个启动脚本,其中有大量的JavaScript处理程序都使用jQuery进行了分配。 此属性存在于具有处理程序的每个元素上。

它是jQuery expando属性,它是jQuery.cache对象中表示该元素的数据和事件集合的关键。

在你的例子中,在那个页面中jQuery.cache["2"]会给你和$("#ctl00_CloseButton").data() ,当你添加一个事件处理程序或数据并且该对象还没有,它获得一个新的expando( jQuery.expando )属性,序列中的下一个数字作为值。

这样做的原因主要是IE,直接将处理程序或数据对象分配给元素使得垃圾收集器的行为非常差,用这个键附加它们,但没有直接的引用链接,没有循环,垃圾收集器的行为要好得多。