为什么我的表单元素有一个随机JQuery属性?

为什么我的表单元素有一个随机JQuery属性?,jquery,html,internet-explorer,Jquery,Html,Internet Explorer,我正在使用和测试ASP.NET MVC2页面的集成。WatiN启动IE以点击给定的URL,然后在变量中给出浏览器的html响应。然后,批准测试允许我将html响应与html响应的“批准”版本进行比较。这个系统工作得很好,只是有些东西(IE或JQuery)正在向我的元素添加一个意外的属性 以下是IE的html响应中的表单标记副本: <FORM method=post action=/Account/LogOn jQuery1314030136323="2"> 注意表单元素中的jQ

我正在使用和测试ASP.NET MVC2页面的集成。WatiN启动IE以点击给定的URL,然后在变量中给出浏览器的html响应。然后,批准测试允许我将html响应与html响应的“批准”版本进行比较。这个系统工作得很好,只是有些东西(IE或JQuery)正在向我的元素添加一个意外的属性

以下是IE的html响应中的表单标记副本:

<FORM method=post action=/Account/LogOn jQuery1314030136323="2">

注意表单元素中的
jQuery1314…
属性。它总是设置为“2”,但属性的名称总是不同的(jQuery)。因为每次都不一样,我的批准测试失败了。我需要在html输出上运行一个正则表达式并使用蛮力删除参数,找到一种方法使属性名称每次都相同,或者完全删除。有什么想法吗


我故意(而不是)用ASP.NET来标记它,因为我真的认为这是IE或JQuery特有的。

我相信JQuery在内部是用来跟踪DOM中JQuery事件关联的所有元素的。如果不取消事件挂钩,您可能无法删除它们。

这是jQuery添加到与之交互的每个DOM元素中的uuid/jQuery.expando,用于解决浏览器内存泄漏问题

旧式代码等待window.onunload从DOM标记中解除Javascript数据绑定,以防止内存泄漏。JQuery通过在属性中使用一个简单的数字(如代码示例中的数字)来避免这种情况,然后在Javascript中保留标记和数字的哈希映射(它称之为uuid)

奇怪的属性名是jQuery.expando的值,您可以在代码中轻松搜索它,每次都可以看到它被设置为随机值。这样做是为了允许jQuery的多个副本在页面上共存,而不会相互干扰

我不知道在同一个页面上需要多个jQuery的情况下,我曾经需要过一个用例,我怀疑您也不需要这个功能-您可以通过取消这个功能轻松解决这个问题。修改代码,将jQuery.expando设置为一些硬编码的值,比如“jQuery”,而不是一个随机数,这样就可以了

不过,请注意不要在同一页面中两次使用jQuery!虽然这样做是偶然的,但也会带来很多其他奇怪的副作用(比如美元的重用),所以这一点可能没有意义

在这个问题中,我将更详细地介绍jQuery.expando/uuid:

在那篇文章中,您会注意到该属性的值是随机的——它是一个计数器,基于jQuery迄今为止与多少标记交互。如果代码要求属性值保持一致,则仍可能遇到问题

更新

您需要修改jquery源代码。例如,1.6.2:

包括以下内容:

jQuery.extend({
    cache: {},

    // Please use with caution
    uuid: 0,

    // Unique for each copy of jQuery on the page
    // Non-digits removed to match rinlinejQuery
    expando: "jQuery" + ( jQuery.fn.jquery + Math.random() ).replace( /\D/g, "" ),
您可以按如下方式更改expando行:

    // Does not support multiple copies of jQuery on the same page!
    // 0 included to match rinlinejQuery (/jQuery\d+/)
    expando: "jQuery0",

您能给我一个如何将jQuery.expando设置为类似“jQuery”的示例吗?这是一个很好的答案,但我不想修改我的jQuery源代码。相反,我选择在html响应上运行一个正则表达式,并手动删除以“jquery”开头的属性。这个问题帮助我做到了:你的HTML来自哪里?JQuery在加载页面后,在运行时客户端将这些属性添加到DOM中。如果您查看源代码,您将看到它们不存在。因此,如果您只是使用服务器生成的内容,那么首先就不需要正则表达式。另一方面,如果您正在使用客户端DOM,并且您正在修改页面本身上的HTML,那么您将破坏jQuery。我正在使用WatiN在页面加载后将HTML从客户端浏览器(即在本例中)中拉出。@ByronCommardahl这将在您使用jQuery插入任何DOM元素时立即破坏。通过将jQuery.expando设置在源代码之外,您可以在不修改源代码的情况下对其进行忍者攻击,尽管这样做的时机可能非常棘手。没有探索过。