2011-08-22 44 views
3

我使用Approval TestsWatiN来测试我的ASP.NET MVC2页面的集成。 WatiN启动IE打击给定的URL,然后给我一个变量的浏览器的HTML响应。然后,批准测试允许我将html响应与“批准”版本的html响应进行比较。这个系统工作得很好,除了某些东西(无论是IE还是JQuery)将一个意外的属性添加到我的元素中。为什么我的FORM元素有一个随机的JQuery属性?

这里的形式标签的副本从IE的HTML响应:

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

通知的jQuery1314...属性的形式的元素。它始终设置为“2”,但属性的名称始终不同(jQuery ###########)。由于每次都有所不同,我的批准测试失败。我需要在html输出上运行一个正则表达式,并用蛮力去除param,找到一种方法来使每个属性的名称相同,或者完全删除。有任何想法吗?

我故意不使用ASP.NET标记,因为我真的认为这是特定于IE或JQuery的。

回答

5

这就是jQuery为每个与它交互的DOM元素添加的uuid/jQuery.expando,以解决浏览器内存泄漏问题。

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

奇怪的属性名称是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

包括以下内容:

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

能否请你给我一个如何jQuery.expando设置的东西为例:

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线像'jquery'? –

+0

添加到我的答案。 –

+0

这是一个很好的答案,但我宁愿不修改我的jQuery源代码。相反,我选择了在我的html响应中运行正则表达式,并手动删除以'jquery'开头的属性。这个问题帮助我实现了这个目标:http://stackoverflow.com/questions/7151269/how-to-strip-out-one-common-attribute-from-every-form-element-on-the-page/7151545#7151545 –

0

我相信这是jQuery在内部用来跟踪DOM中的所有元素,你有jQuery事件连接。如果不解除事件,您可能无法删除它们。

相关问题