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

时间:2010-10-18 20:54:03

标签: asp.net jquery event-handling

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

这是一个.NET 3.5 Web窗体应用程序。其中一个页面有3个服务器端输入,类型为“提交”。这些输入中的每一个都使用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);
  });
在页面上的

,我得到以下按钮标记:

<INPUT class=button id=ctl00_CloseButton onclick=window.close(); type=submit
       value=Close name=ctl00$CloseButton jQuery1287434381268="2">

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

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

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

1 个答案:

答案 0 :(得分:3)

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

在您的示例中,当您添加事件处理程序或数据且该对象时,该页面jQuery.cache["2"]将为您提供与$("#ctl00_CloseButton").data()相同的内容一,它获得一个新的expando(jQuery.expando)属性,序列中的下一个数字作为值。

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