Почему мой элемент FORM имеет случайный атрибут JQuery? - PullRequest
3 голосов
/ 22 августа 2011

Я использую Сертификационные тесты и WatiN для проверки интеграции моих страниц ASP.NET MVC2.WatiN запускает IE, чтобы попасть по указанному URL, а затем дает мне ответ html браузера в переменной.Затем, тесты одобрения позволяют мне сравнить html-ответ с «одобренной» версией html-ответа.Эта система прекрасно работает, за исключением того, что что-то (IE или JQuery) добавляет неожиданный атрибут к моему элементу.

Вот копия тега формы из html-ответа IE:

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

Обратите внимание на атрибут jQuery1314... в элементе формы.Он всегда имеет значение "2", но имя атрибута всегда отличается (jQuery ###########).Так как каждый раз по-разному, мои одобрительные тесты не проходятМне нужно либо запустить регулярное выражение в выводе html и удалить параметр с помощью грубой силы, найти способ сделать имя атрибута одинаковым каждый раз, либо удалить вообще.Любые идеи?

Я намеренно не отмечаю это с помощью ASP.NET, потому что я действительно думаю, что это специфично для IE или JQuery.

Ответы [ 2 ]

5 голосов
/ 22 августа 2011

Это uuid / jQuery.expando, который jQuery добавляет к каждому элементу DOM, с которым взаимодействует, для устранения утечек памяти в браузере.

Код более старого стиля ждал, пока window.onunload отсоединит данные Javascript от тегов DOM, чтобы предотвратить утечки памяти. JQuery избегает этого, используя простое число (как в примере кода) в атрибуте, а затем сохраняя хеш-карту в Javascript тегов и чисел (которые он вызывает uuid).

Странное имя атрибута - это значение jQuery.expando, которое вы можете легко найти в коде и увидеть, что оно каждый раз устанавливается на случайное значение. Это сделано для того, чтобы несколько копий jQuery могли сосуществовать на странице, не мешая друг другу.

Мне неизвестен случай использования, который мне когда-либо был нужен, когда мне нужно более одного jQuery на одной странице, и я подозреваю, что вам не нужна эта функциональность - вы можете легко решить эту проблему, просто устранив особенность. Измените код, чтобы установить для jQuery.expando какое-то жестко запрограммированное значение, например «jquery», вместо случайного числа, и все готово.

Будьте осторожны, чтобы никогда не использовать jQuery дважды на одной странице! Несмотря на то, что при этом случайно появляются много других странных побочных эффектов (например, повторное использование $), так что этот вопрос может быть спорным.

Я подробнее расскажу о jQuery.expando / uuid в этом вопросе: Почему JQuery не предоставляет свою функциональность UUID?

В этой записи вы заметите, что значением атрибута является random-ish - это счетчик, основанный на том, сколько тегов уже взаимодействовало с 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",
0 голосов
/ 22 августа 2011

Я полагаю, что именно это делает jQuery для отслеживания всех элементов в DOM, для которых у вас есть события jQuery. Возможно, вы не сможете удалить их, не отцепив события.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...