JQuery: поиск дубликата идентификатора и удаление всех, кроме первого
$('[id]').each(function () {
var ids = $('[id="' + this.id + '"]');
// remove duplicate IDs
if (ids.length > 1 && ids[0] == this) $('#' + this.id).remove();
});
Вышеупомянутый будет удалять первый дубликат ID, однако я хочу удалить последнее. Я пробовал $('#'+ this.id + ':last')
, но безрезультатно.
Fiddle
В скрипте вход со значением "sample" должен сохраняться при выполнении действия append.
Ответы
Ответ 1
Использовать фильтр jQuery :gt(0)
для исключения первого элемента.
$('[id]').each(function () {
$('[id="' + this.id + '"]:gt(0)').remove();
});
Или выберите все доступные элементы, затем исключите первый элемент с помощью .slice(1)
.
$('[id]').each(function (i) {
$('[id="' + this.id + '"]').slice(1).remove();
});
Ответ 2
Попробуйте:
$('[id="' + this.id + '"]:not(#" + this.id + ":first)').remove();
Ответ 3
вы можете попробовать
$("#ID").nextAll().remove();
Ответ 4
попробуйте это
var duplicated = {};
$('[id]').each(function () {
var ids = $('[id="' + this.id + '"]');
if ( ids.length <= 1 ) return ;
if ( !duplicated[ this.id ] ){
duplicated[ this.id ] = [];
}
duplicated[ this.id ].push( this );
});
// remove duplicate last ID, for elems > 1
for ( var i in duplicated){
if ( duplicated.hasOwnProperty(i) ){
$( duplicated[i].pop() ).remove();
}
}
и jsfiddle http://jsfiddle.net/z4VYw/5/
Ответ 5
Этот код длиннее, чем некоторые другие, но двойной вложенный цикл должен сделать его работу очевидной.
Преимущество этого подхода состоит в том, что ему нужно только сканировать DOM, чтобы генерировать список элементов с атрибутом id
один раз, а затем использовать тот же список для поиска (и удаления) дубликатов.
Элементы, которые были уже удалены, будут иметь parentNode === null
, поэтому их можно пропустить во время итерации по массиву.
var $elems = $('[id]');
var n = $elems.length;
for (var i = 0; i < n; ++i) {
var el = $elems[i];
if (el.parentNode) { // ignore elements that aren't in the DOM any more
var id = el.id;
for (var j = i + 1; j < n; ++j) {
var cmp = $elems[j];
if (cmp.parentNode && (cmp.id === id)) {
$(cmp).remove(); // use jQuery to ensure data/events are unbound
}
}
}
}
Ответ 6
$('[id]').each(function() {
var $ids = $('[id=' + this.id + ']');
if ($ids.length > 1) {
if(this.id === your_id)//which is duplicating
$ids.not(':first').remove();
}
});
Ответ 7
Я бы использовал not()
, чтобы удалить текущий элемент из ids
и удалить остальные:
(Fiddle)
$('body').on("click", ".placeholder", function() {
data = '<section id="e1"><input name="e1name" /></section><section id="two"><input name="two" value="two section" /></section>';
$('form').append(data);
// ideally I'd like to run this function after append but after googling I find that not possible.
// for each ID ...
$('[id]').each(function () {
var ids = $('[id="' + this.id + '"]');
if (ids.length>1) {
ids.not(this).remove();
}
return;
});
});
Ответ 8
Попробуйте использовать нижеприведенную функцию. Прекрасно работает для меня:
$('#favourities-ajax ul li').each(function(i) {
$('[id="' + this.id + '"]').slice(1).remove();
});