czy to możliwe?
przykład:
$('a.change').click(function(){
//code to change p tag to h5 tag
});
<p>Hello!</p>
<a id="change">change</a>
Zatem kliknięcie zakotwiczenia zmiany powinno spowodować zmianę <p>Hello!</p>
sekcji (na przykład) na tag h5, tak abyś znalazł się <h5>Hello!</h5>
po kliknięciu. Zdaję sobie sprawę, że możesz usunąć znacznik p i zamienić go na h5, ale czy w ogóle istnieje możliwość zmodyfikowania znacznika HTML?
"<" + el.outerHTML.replace(/(^<\w+|\w+>$)/g, "H5") + ">";
Lub podłączana funkcja jQuery: linkOto rozszerzenie, które zrobi to wszystko, na jak największej liczbie elementów na wiele sposobów ...
Przykładowe użycie:
lub
lub nawet
Źródło wtyczki:
$.extend({ replaceTag: function (currentElem, newTagObj, keepProps) { var $currentElem = $(currentElem); var i, $newTag = $(newTagObj).clone(); if (keepProps) {//{{{ newTag = $newTag[0]; newTag.className = currentElem.className; $.extend(newTag.classList, currentElem.classList); $.extend(newTag.attributes, currentElem.attributes); }//}}} $currentElem.wrapAll($newTag); $currentElem.contents().unwrap(); // return node; (Error spotted by Frank van Luijn) return this; // Suggested by ColeLawrence } }); $.fn.extend({ replaceTag: function (newTagObj, keepProps) { // "return" suggested by ColeLawrence return this.each(function() { jQuery.replaceTag(this, newTagObj, keepProps); }); } });
źródło
return node;
powinno faktycznie wyglądaćreturn this;
tak, jak pokazano w „starej wersji” wtyczki. Jest to niezbędne do łączenia wydarzeń w łańcuch, takich jak$("tr:first").find("td").clone().replaceTag("li").appendTo("ul#list")
Zamiast zmieniać typ tagu, powinieneś zmienić styl tagu (a raczej taga z określonym identyfikatorem). Nie jest dobrą praktyką zmienianie elementów dokumentu w celu wprowadzenia zmian stylistycznych. Spróbuj tego:
$('a.change').click(function() { $('p#changed').css("font-weight", "bold"); }); <p id="changed">Hello!</p> <a id="change">change</a>
źródło
Zauważyłem, że pierwsza odpowiedź nie była tym, czego potrzebowałem, więc wprowadziłem kilka modyfikacji i pomyślałem, że wrzucę ją tutaj.
Ulepszony
replaceTag(<tagName>)
Argumenty:
Zwroty:
W porządku, wiem, że jest tu teraz kilka odpowiedzi, ale postanowiłem napisać to ponownie.
Tutaj możemy zastąpić tag w ten sam sposób, w jaki używamy klonowania. Jesteśmy po tej samej składni jak .clone () z
withDataAndEvents
ideepWithDataAndEvents
który skopiuj dzieci- dane i wydarzenia węzłami, jeżeli są stosowane.Przykład:
$tableRow.find("td").each(function() { $(this).clone().replaceTag("li").appendTo("ul#table-row-as-list"); });
Źródło:
$.extend({ replaceTag: function (element, tagName, withDataAndEvents, deepWithDataAndEvents) { var newTag = $("<" + tagName + ">")[0]; // From [Stackoverflow: Copy all Attributes](http://stackoverflow.com/a/6753486/2096729) $.each(element.attributes, function() { newTag.setAttribute(this.name, this.value); }); $(element).children().clone(withDataAndEvents, deepWithDataAndEvents).appendTo(newTag); return newTag; } }) $.fn.extend({ replaceTag: function (tagName, withDataAndEvents, deepWithDataAndEvents) { // Use map to reconstruct the selector with newly created elements return this.map(function() { return jQuery.replaceTag(this, tagName, withDataAndEvents, deepWithDataAndEvents); }) } })
źródło
.children()
nie będzie to zawierać żadnych węzłów czysto tekstowych. Możesz spróbować.contents()
IIRC.Pomysł polega na zawinięciu elementu i rozpakowaniu zawartości:
function renameElement($element,newElement){ $element.wrap("<"+newElement+">"); $newElement = $element.parent(); //Copying Attributes $.each($element.prop('attributes'), function() { $newElement.attr(this.name,this.value); }); $element.contents().unwrap(); return $newElement; }
Przykładowe użycie:
renameElement($('p'),'h5');
Próbny
źródło
Wymyśliłem podejście, w którym używasz reprezentacji łańcuchowej swojego obiektu jQuery i zastępujesz nazwę tagu za pomocą wyrażeń regularnych i podstawowego JavaScript. Nie stracisz żadnej zawartości i nie będziesz musiał zapętlać się nad każdym atrybutem / właściwością.
/* * replaceTag * @return {$object} a new object with replaced opening and closing tag */ function replaceTag($element, newTagName) { // Identify opening and closing tag var oldTagName = $element[0].nodeName, elementString = $element[0].outerHTML, openingRegex = new RegExp("^(<" + oldTagName + " )", "i"), openingTag = elementString.match(openingRegex), closingRegex = new RegExp("(<\/" + oldTagName + ">)$", "i"), closingTag = elementString.match(closingRegex); if (openingTag && closingTag && newTagName) { // Remove opening tag elementString = elementString.slice(openingTag[0].length); // Remove closing tag elementString = elementString.slice(0, -(closingTag[0].length)); // Add new tags elementString = "<" + newTagName + " " + elementString + "</" + newTagName + ">"; } return $(elementString); }
Na koniec możesz zastąpić istniejący obiekt / węzeł w następujący sposób:
var $newElement = replaceTag($rankingSubmit, 'a'); $('#not-an-a-element').replaceWith($newElement);
źródło
To jest moje rozwiązanie. Pozwala przełączać się między tagami.
<!DOCTYPE html> <html> <head> <title></title> <script src="https://code.jquery.com/jquery-1.11.3.js"></script> <script type="text/javascript"> function wrapClass(klass){ return 'to-' + klass; } function replaceTag(fromTag, toTag){ /** Create selector for all elements you want to change. * These should be in form: <fromTag class="to-toTag"></fromTag> */ var currentSelector = fromTag + '.' + wrapClass(toTag); /** Select all elements */ var $selected = $(currentSelector); /** If you found something then do the magic. */ if($selected.size() > 0){ /** Replace all selected elements */ $selected.each(function(){ /** jQuery current element. */ var $this = $(this); /** Remove class "to-toTag". It is no longer needed. */ $this.removeClass(wrapClass(toTag)); /** Create elements that will be places instead of current one. */ var $newElem = $('<' + toTag + '>'); /** Copy all attributes from old element to new one. */ var attributes = $this.prop("attributes"); $.each(attributes, function(){ $newElem.attr(this.name, this.value); }); /** Add class "to-fromTag" so you can remember it. */ $newElem.addClass(wrapClass(fromTag)); /** Place content of current element to new element. */ $newElem.html($this.html()); /** Replace old with new. */ $this.replaceWith($newElem); }); /** It is possible that current element has desired elements inside. * If so you need to look again for them. */ replaceTag(fromTag, toTag); } } </script> <style type="text/css"> section { background-color: yellow; } div { background-color: red; } .big { font-size: 40px; } </style> </head> <body> <button onclick="replaceTag('div', 'section');">Section -> Div</button> <button onclick="replaceTag('section', 'div');">Div -> Section</button> <div class="to-section"> <p>Matrix has you!</p> <div class="to-section big"> <p>Matrix has you inside!</p> </div> </div> <div class="to-section big"> <p>Matrix has me too!</p> </div> </body> </html>
źródło
To szybki sposób na zmianę tagów HTML wewnątrz DOM za pomocą jQuery. Uważam, że ta funkcja replaceWith () jest bardzo przydatna.
var text= $('p').text(); $('#change').on('click', function() { target.replaceWith( "<h5>"+text+"</h5>" ); });
źródło
Możesz to osiągnąć za pomocą
data-*
atrybutu,data-replace="replaceTarget,replaceBy"
tak jak to, za pomocą jQuery, aby uzyskaćreplaceTarget
&replaceBy
wartość według.split()
metody po uzyskaniu wartości, a następnie użyj.replaceWith()
metody.Ta
data-*
technika atrybutów do łatwego zarządzania wymianą tagów bez wprowadzania zmian poniżej (wspólny kod dla wszystkich zamian tagów).Mam nadzieję, że poniższy fragment bardzo ci pomoże.
$(document).on('click', '[data-replace]', function(){ var replaceTarget = $(this).attr('data-replace').split(',')[0]; var replaceBy = $(this).attr('data-replace').split(',')[1]; $(replaceTarget).replaceWith($(replaceBy).html($(replaceTarget).html())); });
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script> <p id="abc">Hello World #1</p> <a href="#" data-replace="#abc,<h1/>">P change with H1 tag</a> <hr> <h2 id="xyz">Hello World #2</h2> <a href="#" data-replace="#xyz,<p/>">H1 change with P tag</a> <hr> <b id="bold">Hello World #2</b><br> <a href="#" data-replace="#bold,<i/>">B change with I tag</a> <hr> <i id="italic">Hello World #2</i><br> <a href="#" data-replace="#italic,<b/>">I change with B tag</a>
źródło
Następująca funkcja załatwia sprawę i zachowuje wszystkie atrybuty. Używasz go na przykład w ten sposób:
changeTag("div", "p")
function changeTag(originTag, destTag) { while($(originTag).length) { $(originTag).replaceWith (function () { var attributes = $(this).prop("attributes"); var $newEl = $(`<${destTag}>`) $.each(attributes, function() { $newEl.attr(this.name, this.value); }); return $newEl.html($(this).html()) }) } }
Aby upewnić się, że działa, sprawdź poniższy przykład
function changeTag(originTag, destTag) { while($(originTag).length) { $(originTag).replaceWith (function () { var attributes = $(this).prop("attributes"); var $newEl = $(`<${destTag}>`) $.each(attributes, function() { $newEl.attr(this.name, this.value); }); return $newEl.html($(this).html()) }) } } changeTag("div", "p") console.log($("body").html())
<body> <script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script> <div class="A" style="font-size:1em"> <div class="B" style="font-size:1.1em">A</div> </div> <div class="C" style="font-size:1.2em"> B </div> </body>
źródło
Czy jest jakiś konkretny powód, dla którego musisz zmienić tag? Jeśli chcesz po prostu powiększyć tekst, lepszym sposobem będzie zmiana klasy CSS znacznika p.
Coś takiego:
$('#change').click(function(){ $('p').addClass('emphasis'); });
źródło