Установить новый идентификатор с помощью jQuery
"this" - текстовое поле, "new_id" - целое число.
Когда я применяю следующий фрагмент:
$(this).attr('id', this.id + '_' + new_id);
$(this).attr('name', this.name + '_' + new_id);
$(this).attr('value', 'test');
Идентификатор изменяется, имя изменяется тоже, но не значение. Если я изменю последнюю строку на это (и поэтому использую строковый литерал)
$('#mytextfield_3').attr('value', 'test');
он работает.
Любые идеи?
- EDIT -
Благодаря Steerpike для быстрого тестирования плагина - я считаю, что он должен работать, но я не могу найти ошибку.
Вот еще код:
Я создаю клон, используя
clone = $(this).find('.clone_fields_container:first').clone();
"clone" теперь содержит div, у которого есть встроенные поля ввода.
После создания нового id:
/** Iterate over input and select fields in container */
clone.children('input,select,textarea').each(function() {
$(this).attr('id', this.id + '_' + new_id);
$(this).attr('name', this.name + '_' + new_id);
$(this).val('test');
console.log(this);
});
Текстовые поля не имеют никаких значений.
Ответы
Ответ 1
Я просто написал быстрый плагин для запуска теста с использованием одного и того же фрагмента, и он отлично работает
$.fn.test = function() {
return this.each(function(){
var new_id = 5;
$(this).attr('id', this.id + '_' + new_id);
$(this).attr('name', this.name + '_' + new_id);
$(this).attr('value', 'test');
});
};
$(document).ready(function() {
$('#field_id').test()
});
<body>
<div id="container">
<input type="text" name="field_name" id="field_id" value="meh" />
</div>
</body>
Поэтому я могу только предположить, что в вашем коде происходит что-то еще. Можете ли вы предоставить более подробную информацию?
Ответ 2
Вы пробовали
$(this).val('test');
вместо
$(this).attr('value', 'test');
val()
обычно проще, так как атрибут, который вам нужно изменить, может отличаться для разных элементов DOM.
Ответ 3
EDIT: на основе вашего комментария и предполагая, что this
- это клонированный элемент.
$(this).clone()
.attr( 'id', this.id + '_' + new_id )
.attr( 'name', this.name + '_' + new_id )
.val( 'test' )
.appendTo('#someElement');
Полный пример
<script type="text/javascript">
var new_id = 0;
$(document).ready( function() {
$('#container > input[type=button]').click( function() {
var oldinp = $('input#inp')[0];
var newinp = $(oldinp).clone()
.attr('id',oldinp.id + new_id )
.attr('name',oldinp.name + new_id )
.val('test')
.appendTo($('#container'));
$('#container').append('<br>');
new_id++;
});
});
</script>
<div id="container">
<input type="button" value="Clone" /><br/>
<input id="inp" name="inp" type="text" value="hmmm" /><br/>
</div>
Ответ 4
Что происходит, когда вы устанавливаете все атрибуты в одной attr()
команде, например так
$(this).attr({
id : this.id + '_' + new_id,
name: this.name + '_' + new_id,
value: 'test'
});
Ответ 5
Используйте .val()
not attr('value')
.