clone() не работает (для меня)

#jquery

#jquery

Вопрос:

Пользователь вводит пары значений. Мне нужно скопировать последний набор и перенумеровать их идентификаторы. Приведенная ниже функция выполняется, но новый div не отображается. Я где-то в сорняках … спасибо за помощь!

     $('#addparm').click(function (event) {
        event.preventDefault();
        var maxSeq = $('#maxseq').attr("seq");
        var lastDiv = $('#pct['   maxSeq   ']').parent();
        $('#maxseq').attr("seq",   maxSeq);
        var newDiv = $(lastDiv).clone(true);
        $(lastDiv).after(newDiv);
        $(newDiv).fadeIn('slow');
    });
 

вот HTML:

     ... 
    <div id="bkp[8]">
        <input seq="8" id="pct[8]" name="pct" type="text" value="0.28" />
        <input seq="8" id="amt[8]" name="amt" type="text" value="43.2" />
        <input seq="8" id="use[8]" name="use" type="hidden" value="yes" />
    </div> 

    <div id="bkp[9]">
        <input seq="9" id="pct[9]" name="pct" type="text" value="0.31" />
        <input seq="9" id="amt[9]" name="amt" type="text" value="41.4" />
        <input seq="9" id="use[9]" name="use" type="hidden" value="yes" />
    </div> 
<input type="hidden" id="maxseq" seq="9" />
<a id="addparm" href="javascript:void(0)">Add</a>
 

Ответ №1:

Clone работает нормально, но ваш селектор не находит ничего, с чем можно работать.

Согласно спецификациям HTML, вы не можете использовать квадратные скобки в идентификаторе элемента. Кроме того, ваши селекторы, которые ищут элементы с идентификаторами, содержащими квадратные скобки, не соответствуют тому, что вы думаете.

Селектор:

 #foo[5]
 

Не сопоставляет элемент с идентификатором foo[5] , скорее он ищет элемент с идентификатором foo и именем атрибута 5 .

Это означает, что lastDiv содержит пустую коллекцию jQuery, поэтому ничего не клонируется и ничего не добавляется.

Решение состоит в том, чтобы либо избежать квадратных скобок в ваших селекторах, сохраняя при этом неправильные значения идентификатора attr (не рекомендуется), либо изменить ваши значения идентификаторов в соответствии со спецификациями и адаптировать ваш код к новому формату идентификатора.

Комментарии:

1. Это правда. Доказательство: jsfiddle.net/C2R8D Я изменил идентификатор рассматриваемого элемента, чтобы убрать квадратные скобки, и сделал то же самое изменение в селекторе jQuery.

2. Вот доказательство того, что вы можете сохранить свои идентификаторы как есть. Просто экранируйте квадратные скобки двумя обратными косыми чертами в вашем jQuery selector.jsfiddle.net/8REPj Однако @JAAulde прав в том, что в спецификации HTML4 указано, что это не юридический идентификатор, поэтому, вероятно, целесообразно изменить формат идентификатора.

3. Да, с экранированными селекторами вы можете использовать некоторые элементы в ваших селекторах, которые лучше не использовать. Было бы лучше настроить синтаксис и методологии, IMO.

4. Спасибо, ребята, вы молодцы. Я думал, что у меня должны быть скобки в идентификаторе, чтобы заставить asp mvc распознавать коллекцию значений как массив. Он делает это, но, возможно, по другим причинам, чем я думал.

5. @EricNelson обычно это name attr, который будет иметь квадратные скобки, чтобы сделать набор элементов коллекцией — хотя я ничего не знаю об ASP. Однако это странная вещь, потому name что attrs также считаются лексемами имен и, следовательно, не должны содержать квадратных скобок. Рад, что эта информация помогла.