Я пытаюсь клонировать отделение и изменить имена полей ввода в этом отделении. Это работает отлично для большинства браузеров, но IE 7 не изменяет атрибут имени полей ввода.
Демонстрация: http://jsbin.com/iduro/7
HTML
JS
var lastRow = $("body div:last"),
newRow = lastRow.clone(true)
.show()
.insertAfter(lastRow);
newRow.find('input').attr("name","test2");
$("pre").text( newRow[0].innerHTML );
Результаты:
Firefox: (работы)
IE8 (работы)
IE7 (ошибка):
Поскольку Вы видите, что название IE7 не изменяется на test2.
Есть ли какая-либо очевидная причина или работа вокруг?
Пока что я могу это исправить. Пока поле ввода не привязано к домену, вы можете изменить имя, и радиокнопки снова будут работать правильно.
// Old Code
$("div:last").clone(true).children("input").attr("name","newName");
// New Code
$("div:last").clone(true).children("input").fixCloneBug ("newName");
Для уменьшения времени выполнения копируются только jQuery Events, className и атрибут type.
Метод fixCloneBug:
(function( $ )
{
if ( ! $.browser.msie || parseInt( $.browser.version ) > 7 )
// NO FIX FOR IE 7+ FF WEBKIT
$.fn.fixCloneBug = function( newName ){ return this.attr( "name", newName ) };
else
// FIX IE 5-7
$.fn.fixCloneBug = function( newName )
{
var $cloned = $();
this.each(function( )
{
/* -._.-._.-._.-._.-._.-._.-._.-._.-._.-._.-._.-._.-._.-._.-._.-._.-._.-._.-._.-._.-._
Create a new element with className and jQuery events of the buggy element
*/
var $elem = $(this),
$newElem = $(document.createElement( $elem.attr('tagName') ));
// USE SAME TYPE
$newElem.attr('type', $elem.attr('type') );
// SET NAME
$newElem.attr('name', this.name );
$newElem.attr('name', newName );
// ADD TO DOM
$newElem.insertBefore( $elem );
// CLONE EVENTS
$newElem.data( "events", $elem.data("events") );
// CLASS NAME
$newElem.attr('className', this.className );
/* -._.-._.-._.-._.-._.-._.-._.-._.-._.-._.-._.-._.-._.-._.-._.-._.-._.-._.-._.-._.-._
Delete buggy element
*/
$elem.remove();
// Add to result
$cloned.push($newElem);
})
return $cloned;
}
}(jQuery));
Возможно, вы думаете, что $newElem.attr('name', this.name );
бесполезен, однако он позволяет мне использовать функцию jQuery 1.4:
.fixCloneBug (function(i,oldname){ return oldname+"_new" })
Если вы наложите на них доступ как к набору при размещении формы, то нет необходимости изменять имя - просто не ставьте значение в скобках, и оно будет увеличивается для вас, когда вы захватываете массив на стороне сервера:
Если вам нужно иметь доступ к каждому из них по индексу из js, вы можете просто использовать get
для соответствующей возвращенной коллекции селектором. Или вы можете назначить атрибуты ID, такие как test_1
.