2009-12-08 2 views
27

Можно ли сразу удалить все атрибуты с помощью jQuery?Удалить все атрибуты

<img src="example.jpg" width="100" height="100"> 

в

<img> 

Я попытался $('img').removeAttr('*'); не повезло. Кто угодно?

+0

Плохая идея, вы должны удалить только какие атрибуты вы знаете о, DOM элемент имеет гораздо больше атрибутов, чем то, что вы указываете в теге каждый со своим собственным умолчанию или расчетное значение. – row1

ответ

40

Обновление: Предыдущий метод работает в IE8, но не в режиме совместимости IE8 и предыдущих версиях IE. Так вот версия, что делает и использует JQuery, чтобы удалить атрибуты, как это делает лучшую работу по ним:

$("img").each(function() { 
    // first copy the attributes to remove 
    // if we don't do this it causes problems 
    // iterating over the array we're removing 
    // elements from 
    var attributes = $.map(this.attributes, function(item) { 
    return item.name; 
    }); 

    // now use jQuery to remove the attributes 
    var img = $(this); 
    $.each(attributes, function(i, item) { 
    img.removeAttr(item); 
    }); 
}); 

Конечно, вы могли бы make a plug-in из него:

jQuery.fn.removeAttributes = function() { 
    return this.each(function() { 
    var attributes = $.map(this.attributes, function(item) { 
     return item.name; 
    }); 
    var img = $(this); 
    $.each(attributes, function(i, item) { 
    img.removeAttr(item); 
    }); 
    }); 
} 

, а затем сделать:

+0

Не нужно плагин, это был цикл while, после которого я был. Благодаря! – David

+0

Err, no. Это не приближается к рабочему решению для IE. 'removeAttribute' не работает вообще, как вы ожидаете здесь (подсказка: цикл' while' закроет бедный браузер навсегда). –

+1

просто натолкнулся на это - я бы хотел, чтобы вы навсегда заблокировали IE на всех компьютерах и разрешили только одну вкладку, что указывает на страницу загрузки Chrome. Это было бы круто! (и нет, я не имею в виду разрешить IE 9 или 10 - IE 6 был/** все еще ** так мусор, что IE 9 и 10 заслуживают страдания!) – ClarkeyBoy

0

Я не знаю точно, для чего вы его используете, но вместо этого вы решили использовать классы css и переключить их? Это будет меньше кодирования на вашей стороне и меньше работы для браузера. Это, вероятно, не сработает [легко], если вы генерируете некоторые атрибуты на лету, как с помощью и с высотой.

1

Одна из серьезных причин сделать это для определенных тегов - очистить устаревшее содержимое, а также обеспечить соблюдение стандартов.

Предположим, например, вы хотели удалить устаревшие атрибуты или ограничить ущерб, вызванный атрибутами тега FONT, удалив их.

Я пробовал несколько методов для достижения этого, и ни один, включая пример выше, не работает по желанию.

Пример 1: Заменить все теги FONT на содержащееся текстовое содержимое. Это было бы идеальным решением, но с версии 6.1.2 перестало функционировать. :(

$('#content font').each(function(i) { 
    $(this).replaceWith($(this).text()); 
}); 

Пример 2:. Strip все атрибуты из имени тега - например FONT Опять же, это не может работать, но я уверен, что он имел обыкновение работать сразу после предыдущей версии JQuery

$("font").each(function() { 
// First copy the attributes to remove. 
var attributes = $.map(this.attributes, function(item) { 
    return item.name; 
});  
// Now remove the attributes 
var font = $(this); 
$.each(attributes, function(i, item) { 
    $("font").removeAttr(item); 
}); 
}); 
.

С нетерпением жду 1.7, который обещает включить метод удаления нескольких атрибутов по имени.

0

Это приведет к удалению всех атрибутов и будет работать для каждого типа элемента.

var x = document.createElement($("#some_id").prop("tagName")); 
    $(x).insertAfter($("#some_id")); 
    $("#some_id").remove(); 
+2

Это также удаляет привязки событий. –

+0

Тогда причина для голосования? –

36

простой метод, который не требует JQuery:

while(elem.attributes.length > 0) 
    elem.removeAttribute(elem.attributes[0].name); 
+1

Лучший код - самый простой. Нет jQuery, нет локальных переменных, просто цикл. Благодаря! – StanE

+1

Будьте осторожны, если вы выбрали объект JQuery. Перед использованием этого метода необходимо преобразовать его в htmlElement ([$ elem.get (0)] (https://api.jquery.com/get/)). –

3

Вместо создания нового jQuery.fn.removeAttributes (продемонстрировано в принятом ответе), вы можете расширить существующий .removeAttr() метод JQuery делает его принимать нулевые параметры в удалить все атрибуты из каждого элемента в наборе:

var removeAttr = jQuery.fn.removeAttr; 
jQuery.fn.removeAttr = function() { 

    if (!arguments.length) { 
    this.each(function() { 

     // Looping attributes array in reverse direction 
     // to avoid skipping items due to the changing length 
     // when removing them on every iteration. 
     for (var i = this.attributes.length -1; i >= 0 ; i--) { 
     jQuery(this).removeAttr(this.attributes[i].name); 
     } 
    }); 

    return this; 
    } 

    return removeAttr.apply(this, arguments); 
}; 

Теперь вы можете вызвать .removeAttr() без параметров, чтобы удалить все ATT ребра от элемента:

$('img').removeAttr(); 
0

Сегодня у меня такая же проблема. Я думаю, что это будет полезно для вас

var clone = $(node).html(); 
clone = $('<tr>'+ clone +'</tr>'); 
clone.addClass('tmcRow'); 
Смежные вопросы