0

У меня есть странная ошибка, это мой кодIE7 JQuery .clone и .serialize

var form = $("form").clone(); 
hiddenNodes.clone().appendTo(form); 
parameters = form.serialize(); 

У меня есть несколько флажков в этой форме и некоторые другие материалы, Если флажок не установлен, и проверить его, строка параметров будет содержать правильное значение для этого флажка. Однако, если я хочу снять флажок, строка параметров всегда будет истинна (значение, которое флажок первоначально был от ответа) ... Он работает в Firefox ...

Редактировать: Rhe ниже не имеет отношения к делу, но я сохраните его для истории

Я использую MVC3 и MVC3, который отображает два входа для флажков, один флажок и один скрытый, потому что, когда вы отправляете форму, она отправляет только отмеченные поля. В скрытом поле всегда есть значение false, поэтому при установке флажка вы получите два входа с одинаковым именем (первое со значением true, а другое со значением false), но только для связывания с MVC-моделью. Если флажок снят, он отправит скрытое поле со значением false, и связующее будет привязываться к нему.

Но это когда вы делаете полные представления, im делая сообщение ajax, чтобы получить данные формы, я делаю jquery сериализованную форму, в сериализации Firefox принимает первое вхождение каждого входа, и именно поэтому он работает в firefox. IE7 включает в себя оба, и поскольку значение для флажка истинно, модельбиндер будет привязываться к этому. Есть ли какое-нибудь чистое решение вокруг этого? я мог бы удалить все непроверенные галочки перед тем serializaing, что лучший способ

edit2: Читайте здесь

form.clone() в IE7 всегда будет возвращать HTML, как это выглядело, когда он пришел из сервер, поэтому, если флажок установлен с сервера, он будет проверяться, когда вы будете делать form.clone(). Мне нужно, чтобы клонировать его, потому что я использую Ajax и не могу уничтожить разметку ...

Edit3: Это становится безумнее edit2 только справедливо, когда флажок с сервера, в этом случае клон всегда будет проверено, не имеет значения, если вы сняли флажки ... Но если флажок снят с сервера, и вы его проверите, вы получите флажок в клонированной форме.

редактировать: Это устраняет проблему

После cloneNode мне нужно, чтобы эти линии, чтобы добавить старый innerHtml к узлу
если (jQuery.browser.msie & & (jQuery.browser.version < = 7)) clone.innerHTML = elem.innerHTML;

Проблема в том, что изменение в API ядра jQuery никогда не является хорошим решением, это известное исправление, поэтому по какой-то причине команда jQuery не хочет исправлять ее. Я попытался переопределить метод cloneNode в элементе и добавить туда код, работал в FF, но не в IE, я также попытался переопределить метод clone в jQuery, в котором эта часть работала, но основной код клонирования использует методы, которые я не могу найти способ доступа вне JQuery ....

Если кто-нибудь есть хороший способ добавления выше строк кода JQuery без изменения в фактической апи, пожалуйста, дайте мне знать

+0

Вы можете разместить html-код, я думаю, вы, возможно, допустили ошибку. – Val

+0

Вы проверили в IE dev инструменты, что происходит? Я обнаружил, что более старые версии IE очень сильно придираются при вставке созданных jQuery элементов в DOM, поскольку они считают, что они «недействительны». – m90

+0

См. Edit – Anders

ответ

1

http://bugs.jquery.com/ticket/6486 показывает некоторую информацию о на отчет об ошибке тема.

Вы также можете попробовать добавить следующий код и убедитесь, что он работает, прежде чем применить .clone: ​​

document.getElementById('id').onclick = function() { 
    var broken = document.getElementById('id'); 
    if (broken.checked) broken.setAttribute('checked','checked'); 
    else broken.removeAttribute('checked'); 
}; 

Это может работать, так как IE имеет некоторые знают проблемы с внутри-/outerHTML.

+0

Да, я обнаружил, что вчера, но id не помог, мне пришлось изменить ядро ​​jQuery, чтобы заставить его работать, но это не ответственное решение, поэтому мне нужно найти что-то еще, я попытался перезаписать метод cloneNode на уровне элемента, не работал. См. мое редактирование для кода – Anders