Я динамически генерирую элементы через jquery и создавая динамический идентификатор для каждого элемента. Теперь я также предоставил возможность удаления определенного элемента с помощью кнопки удаления. В этом случае мой идентификатор для данного элемента также удаляется. Теперь мне нужно переназначить все идентификаторы, чтобы все идентификаторы были в последовательности.
Например. предположим, что я генерирую 4 divs динамически через jquery
<div id="box1"></div>
<div id="box2"></div>
<div id="box3"></div>
<div id="box4"></div>
Теперь я удаляю второй
<div id="box1"></div>
<div id="box3"></div>
<div id="box4"></div>
мой идентификатор теперь в коробке 1, в коробке 3, в ящике 4
но я хочу, чтобы они были box1, box2 и поле 3
Попробуйте это каждый раз, когда вы удаляете ящик
var $boxes = $('[id^="box"]');
for (var i = 0; i < $boxes.length; i++) {
$boxes.eq(i).prop('id', 'box' + (i + 1));
}
или оберните ваши ящики с помощью div и сделайте это
$('[id^="box"]').attr('id', function () {
return "box" + ($(this).index() + 1);
});
Сделайте что-нибудь подобное, получите общий класс для всех divs
<div class="box"></div>
<div class="box"></div>
<div class="box"></div>
<div class="box"></div>
каждый раз, когда вы удаляете div, и вначале запускаете эту функцию;
var reassignIds = function(){
$('.box').each(function(index){
$(this).attr('id', 'box'+(index+1));
});
}
вот jsfiddle http://jsfiddle.net/ravikumaranantha/bjBSs/1/
$(this).attr('id', 'string')
- это анти-паттерн jQuery
захватить идентификатор удаленного объекта
например, если вы #btn
элемент на некотором нажатии кнопки с идентификатором say #btn
тогда:
$('#btn').click(function(e)
{
var elemid=($('#box2').attr('id')).split(""); //elemid will be ["b","o","x","2"]
var id=new Array(); //var id type is array because in case removed item id contains more than one digit number like box22, box31, box49..
for(var i=0; i<elemid.length;i++)
{
if(!isNaN(parseInt(elemid[i])))
{
id.push(elemid[i]); //extract all numbers and push them into id array
}
}
id=parseInt(id.join("")); //join id array contents and change them from string to number
var parent=$('#box2').parent();
var pos=$(#box2).index(); //position from where to start changing id(s)
$('#box2').remove();
var k=0;
parent.children('div').each(function(){
if(k>=pos){
$(this).attr('id','box'+id)
id++;
}
k++;
})
})
Если необходимо использовать последовательные идентификаторы, наиболее лаконичная реализация этого (предполагая, что каждый ящик имеет общий класс box
):
$('.box').each(function(i) {
this.id = 'box' + (i + 1);
});
альтернативная реализация будет заключаться в следующем:
$('.box').attr('id', function(i) {
return 'box' + (i + 1);
});
но это не так эффективно, как в конечном итоге создает дополнительные объекты jQuery в цикле, которые .attr
.
Однако было бы лучше не использовать последовательные идентификаторы вообще - обычно вы можете использовать .index()
чтобы найти положение дочернего элемента в своем родителе всякий раз, когда вам нужно.
getElementById('box').children[your_number_here]
их в контейнер с именемbox
а затем просто получитьgetElementById('box').children[your_number_here]
?id
илиclass
приводят к кошмару обслуживания, особенно когда они должны быть в порядке.