2011-08-22 41 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事件連接。如果不解除事件,您可能無法刪除它們。

相關問題