Для clone набора полей и добавить его к тому же родителю:
var fieldset = $("#question1"); // Get the fieldset
var clone = fieldset.clone(); // Clone it
clone.attr("id", "question2"); // Set its ID to "question2"
clone.appendTo(fieldset.parent()); // Add to the parent
Примечание мы changing идентификатор перед добавлением его к дереву, так как вы не можете иметь два элемента с одинаковым идентификатором ,
Чтобы сделать вещи с элементами внутри него, вы можете использовать .children()
или .find()
на вашей clone
переменной с селектором для выбора детей/потомков, которые вы хотите (как только вы добавили клон родителя). Например, для очистки id
с на входах:
clone.find('input').each(function() {
if (this.id) {
// It has an ID, which means the original had an ID, which
// means your DOM tree is temporarily invalid; fix the ID
this.id = /* ...derive a new, unique ID here... */;
}
});
Обратите внимание, что в each
обратного вызова, this
является не экземпляр JQuery, это исходный элемент. (Следовательно, моя настройка this.id
напрямую.) Если вы хотите получить экземпляр jQuery для элемента, вы должны сделать var $this = $(this);
, а затем вместо этого использовать $this.attr("id", ...)
. Но нет особой необходимости, если вы не делаете что-то другое, кроме изменения идентификатора.
Отвечая на Ваш вопрос о перенумерации идентификаторов, вы должны быть уверены, что вы обновить все, что это с помощью этих идентификаторов, а также фактических идентификаторов на входных элементах.
Но с точки зрения делать обновления на входных элементов, вы могли это сделать, прочитав номер и приращением, пока вы не получите тот, который не используется:
clone.find('input').each(function() {
var id;
if (this.id) {
id = this.id;
do {
id = id.replace(/[0-9]+$/g, function(num) {
return String(Number(num) + 1);
});
}
while ($("#" + id).length > 0);
this.id = id;
}
});
... который даст вам «input_radio2», если исходный идентификатор был «input_radio1», но я думаю, что, вероятно, я бы использовал другое соглашение об именах. Например, вы можете использовать префикс ваши различные входные идентификаторы с идентификатором вопроса:
<fieldset id='question1'>
...
<input id=-'question1:input_radio1' />
</fieldset>
... а затем просто заменить «Question1» с «» question2 в клонированных идентификаторов. (Colons [:
] отлично подходят в идентификаторах.)
Если вы можете избежать идентификаторов на всех ваших входах, тем не менее, это будет путь. Например, если ваша разметка не мешает ему по другой причине, вы можете связать input
с его label
через сдерживание, а не с помощью for
:
<label>First name: <input type='text' ... /></label>
Много вариантов. :-)
Это немного неясно, что вы пытаетесь сделать. Почему вы клонируете полевой набор - вы хотите вставить его где-нибудь еще? И что вам нужно изменить внутри клонированного набора? –
Что касается доступа к классу через id, у меня есть рабочие ответы, спасибо всем вам за быстрый ответ. Однако мне все еще нужна помощь в доступе к входам, найденным в наборе полей, нужно ли добавлять класс к каждому входу, а затем изменять его идентификатор с помощью метода attr? – Luci
Да, вам нужно изменить идентификаторы на входах, но нет, вам не нужно класть на них класс, чтобы сделать это. Я обновил свой ответ, чтобы показать, как это сделать. –