【问题标题】:Why does my FORM element have a random JQuery attribute?为什么我的 FORM 元素有一个随机的 JQuery 属性?
【发布时间】:2011-11-01 07:27:07
【问题描述】:

我正在使用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 输出上运行正则表达式并用蛮力删除参数,找到一种方法使属性名称每次都相同,或者完全删除。有什么想法吗?

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

【问题讨论】:

    标签: jquery html internet-explorer


    【解决方案1】:

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

    旧样式代码等待 window.onunload 将 Javascript 数据与 DOM 标签解除绑定,以防止内存泄漏。 JQuery 通过在属性中使用一个简单的数字(如代码示例中的数字)来避免这种情况,然后在 Javascript 中保留标签和数字的哈希图(它称为 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, "" ),
    

    您可以按如下方式更改扩展行:

        // 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”开头的属性。这个问题帮助我实现了这一点:stackoverflow.com/questions/7151269/…
    • 你的 HTML 来自哪里?在页面加载后,JQuery 在运行时、客户端将这些属性添加到 DOM。如果您查看源代码,您会发现它们不存在。因此,如果您只是使用服务器生成的内容,则首先不需要正则表达式。另一方面,如果您使用的是客户端 DOM,并且您正在修改页面本身的 HTML,那么您将破坏 jQuery。
    • 页面加载后,我正在使用 WatiN 将 html 从客户端浏览器(本例中为 IE)中拉出。
    • @ByronSommardahl 一旦你使用 jQuery 插入任何 DOM 元素,它就会崩溃。您可以在不修改源代码的情况下通过在其外部设置 jQuery.expando 来忍住它,尽管这样做的时机可能非常棘手。没有探索过。
    【解决方案2】:

    我相信这是 jQuery 在内部所做的,它可以跟踪 DOM 中的所有元素,这些元素都连接了 jQuery 事件。如果不取消事件挂钩,您可能无法删除它们。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-05-28
      • 2020-12-07
      • 1970-01-01
      • 2014-09-14
      • 1970-01-01
      • 2016-12-18
      • 1970-01-01
      相关资源
      最近更新 更多