Измените тег, но сохраните атрибуты и содержимое-jQuery / Javascript
Текст
Изменено на
<p href="page.html" class="class1 class2" id="thisid">Text</p>
Я знаком с jQuery replaceWith
, но это не сохраняет атрибуты/содержимое, насколько я знаю.
href
? Потому что мне нужно изменить p
обратно на a
на другом событии.6 ответов:
Попробуйте это:
var $a = $('a#thisid'); var ahref = $a.attr('href'); var aclass = $a.attr('class'); var aid = $a.attr('id'); var atext = $a.text(); $a.replaceWith('<p href="'+ ahref +'" class="'+ aclass +'" id="'+ aid+'">'+ atext +'</p>');
Вот более общий метод:
// New type of the tag var replacementTag = 'p'; // Replace all a tags with the type of replacementTag $('a').each(function() { var outer = this.outerHTML; // Replace opening tag var regex = new RegExp('<' + this.tagName, 'i'); var newTag = outer.replace(regex, '<' + replacementTag); // Replace closing tag regex = new RegExp('</' + this.tagName, 'i'); newTag = newTag.replace(regex, '</' + replacementTag); $(this).replaceWith(newTag); });
Вы можете попробовать код здесь: http://jsfiddle.net/tTAJM/
Вот метод, который я использую для замены HTML-тегов в jquery:
// Iterate over each element and replace the tag while maintaining attributes $('a').each(function() { // Create a new element and assign it attributes from the current element var NewElement = $("<p />"); $.each(this.attributes, function(i, attrib){ $(NewElement).attr(attrib.name, attrib.value); }); // Replace the current element with the new one and carry over the contents $(this).replaceWith(function () { return $(NewElement).append($(this).contents()); }); });
Я также обычно ограничиваю его определенным классом, таким как
$('a.class1').each(function()
Для примера выше.
Лучше создать плагин jQuery для дальнейшего повторного использования:
(function (a) { a.fn.replaceTagName = function (f) { var g = [], h = this.length; while (h--) { var k = document.createElement(f), b = this[h], d = b.attributes; for (var c = d.length - 1; c >= 0; c--) { var j = d[c]; k.setAttribute(j.name, j.value) } k.innerHTML = b.innerHTML; a(b).after(k).remove(); g[h - 1] = k } return a(g) } })(window.jQuery);
Использование:
// Replace given object tag's name $('a').replaceTagName("p");
Пример: JSFiddle
Хаки, которые делают трюк
var p = $('a').wrapAll('<div class="replace"></div>'); var a = $('div').map(function(){ return this.innerHTML; }).get().join(' '); $('div.replace').html(a.replace(/<a/g,'<p').replace(/a>/g,'p>'));
Демо
Я превратил его в одну простую функцию javascript:
function ReplaceTags(Original, Replace){ var oarr = document.getElementsByTagName(Original); for(i=0; oarr.length < i; i++){ var html = oarr[i].outerHTML; oarr[i].outerHTML = (html.replace(Original, Replace)); } }
Если вы хотите заменить только определенный тег, просто удалите цикл for:
function ReplaceTag(Original, Replace, customi){ // If customi = 0 the first appearance will get replaced var i = customi; if(i == undefined) i=0; var oarr = document.getElementsByTagName(Original); var html = oarr[i].outerHTML; oarr[i].outerHTML = (html.replace(Original, Replace)); }