проблема клона jQuery

Я пытаюсь клонировать отделение и изменить имена полей ввода в этом отделении. Это работает отлично для большинства браузеров, но 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.

Есть ли какая-либо очевидная причина или работа вокруг?

6
задан jantimon 5 May 2010 в 13:11
поделиться

2 ответа

Пока что я могу это исправить. Пока поле ввода не привязано к домену, вы можете изменить имя, и радиокнопки снова будут работать правильно.

// 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" })

2
ответ дан 17 December 2019 в 18:11
поделиться

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

Если вам нужно иметь доступ к каждому из них по индексу из js, вы можете просто использовать get для соответствующей возвращенной коллекции селектором. Или вы можете назначить атрибуты ID, такие как test_1.

0
ответ дан 17 December 2019 в 18:11
поделиться
Другие вопросы по тегам:

Похожие вопросы: