#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 указано, что это не юридический идентификатор, поэтому, вероятно, целесообразно изменить формат идентификатора.
4. Спасибо, ребята, вы молодцы. Я думал, что у меня должны быть скобки в идентификаторе, чтобы заставить asp mvc распознавать коллекцию значений как массив. Он делает это, но, возможно, по другим причинам, чем я думал.
5. @EricNelson обычно это
name
attr, который будет иметь квадратные скобки, чтобы сделать набор элементов коллекцией — хотя я ничего не знаю об ASP. Однако это странная вещь, потомуname
что attrs также считаются лексемами имен и, следовательно, не должны содержать квадратных скобок. Рад, что эта информация помогла.