我正在使用 Approval Tests和 WatiN测试我的 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 的。
最佳答案
这是 uuid/jQuery.expando,jQuery 添加到它与之交互的每个 DOM 元素,以解决浏览器内存泄漏问题。
旧式代码等待 window.onunload 解除 Javascript 数据与 DOM 标签的绑定(bind)以防止内存泄漏。 JQuery 通过在属性中使用一个简单的数字(如您的代码示例中的数字),然后在 Javascript 中保留标签和数字(称为 uuid)的 HashMap 来避免这种情况。
奇怪的属性名称是 jQuery.expando 的值,您可以在代码中轻松搜索并看到它每次都设置为随机值。这样做是为了允许多个 jQuery 副本在页面上共存而不会相互干扰。
我不知道我曾经需要在同一页面上需要多个 jQuery 的用例,而且我怀疑您也不需要此功能 - 您可以通过消除此功能轻松解决此问题特征。修改代码以将 jQuery.expando 设置为一些硬编码值,例如“jquery”,而不是随机数,这样就可以了。
注意不要在同一个页面中两次使用 jQuery!尽管不小心这样做也会引入许多其他奇怪的副作用(比如重用 $),所以这一点可能没有实际意义。
我在这个问题中更详细地介绍了 jQuery.expando/uuid: Why Doesn't JQuery Expose its UUID Functionality?
您会在那篇文章中注意到该属性的值是随机的 - 它是一个基于到目前为止 jQuery 已与多少标签交互的计数器。如果您的代码要求属性值保持一致,您可能仍然会遇到麻烦。
更新
您需要修改您的 jquery 源代码。例如1.6.2: http://code.jquery.com/jquery-1.6.2.js
包括以下内容:
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 - 为什么我的 FORM 元素有一个随机的 JQuery 属性?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7150592/