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

我正在使用 Approval TestsWatiN来测试我的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输出上运行一个正则表达式并用暴力删除param,找到一种方法使每次属性名称相同,或者完全删除.有任何想法吗?

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

解决方法

这就是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",

相关文章

jQuery插件的种类 1、封装对象方法 这种插件是将对象方法封装起来,用于对通过选择器获取的jQuery对象进...
扩展jQuery插件和方法的作用是非常强大的,它可以节省大量开发时间。 入门 编写一个jQuery插件开始于给...
最近项目中需要实现3D图片层叠旋转木马切换的效果,于是用到了jquery.roundabout.js。 兼容性如图: ht...
一、什么是deferred对象? 开发网站的过程中,我们经常遇到某些耗时很长的javascript操作。其中,既有异...
AMD 模块 AMD(异步模块定义,Asynchronous Module Definition)格式总体的目标是为现在的开发者提供一...