我正在使用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的。
答案 0 :(得分:5)
这是jQuery添加到它与之交互的每个DOM元素的uuid / jQuery.expando,以解决浏览器内存泄漏问题。
旧样式代码等待window.onunload解除DOM标记中的Javascript数据以防止内存泄漏。 JQuery通过在属性中使用一个简单的数字(比如代码示例中的那个)来避免这种情况,然后在标签和数字的Javascript中保留一个hashmap(它称之为uuid)。
奇怪的属性名称是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",
答案 1 :(得分:0)
我相信jQuery在内部跟踪jQuery事件所连接的DOM中的所有元素。您可能无法在不取消事件的情况下删除它们。