Используйте jQuery для изменения тега HTML?
это возможно?
пример:
$('a.change').click(function(){
//code to change p tag to h5 tag
});
<p>Hello!</p>
<a id="change">change</a>
Итак, нажав на якорь изменение должно привести к <p>Hello!</p> Раздел для изменения (в качестве примера) тега h5, чтобы вы в конечном итоге получили <h5>Hello!</h5> после клика. Я понимаю, что вы можете удалить тег p и заменить его на h5, но есть ли вообще возможность изменить тег HTML?
7 ответов:
Как только элемент dom создается, тег является неизменным, я считаю. Вы должны были бы сделать что-то вроде этого:
$(this).replaceWith($('<h5>' + this.innerHTML + '</h5>'));
вот расширение, которое будет делать все это, на столько элементов, как много способов...
пример использования:
сохранить существующий класс и атрибуты:
$('div#change').replaceTag('<span>', true);или
удалить существующие классы и атрибуты:
$('div#change').replaceTag('<span class=newclass>', false);или даже
заменить все дивы с пролетами, копировать классы и атрибуты, добавить дополнительное имя класса
$('div').replaceTag($('<span>').addClass('wasDiv'), true);Плагин Источник:
$.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); }); } });
а не изменить тип тега, вы должны изменить стиль тега (или, скорее, тег с определенным идентификатором.) Его не хорошая практика, чтобы изменить элементы вашего документа, чтобы применить изменения. Попробуйте это:
$('a.change').click(function() { $('p#changed').css("font-weight", "bold"); }); <p id="changed">Hello!</p> <a id="change">change</a>
Я заметил, что первый ответ был не совсем то, что мне нужно, поэтому я сделал пару изменений и я решил запостить сюда.
улучшение
replaceTag(<tagName>)
replaceTag(<tagName>, [withDataAndEvents], [withDataAndEvents])Аргументы:
- tagName:строка
- имя тега, например "div", "span" и т. д.
- withDataAndEvents: Boolean
- "логическое значение, указывающее, следует ли копировать обработчики событий вместе с элементами. Начиная с jQuery 1.4, данные элемента также будут скопированы." info
- deepWithDataAndEvents: Boolean,
- логическое значение, указывающее, следует ли копировать обработчики событий и данные для всех дочерних элементов клонированного элемента. По умолчанию его значение совпадает со значением первого аргумента (который по умолчанию имеет значение false)." info
возвращает:
вновь созданный элемент jQuery
хорошо, я знаю, что есть несколько ответов здесь сейчас, но я взял на себя, чтобы написать это снова.
здесь мы можем заменить тег таким же образом, как мы используем клонирование. Мы следуем тому же синтаксису, что и .clone () С
withDataAndEventsиdeepWithDataAndEventsчто скопируйте ребенок данные и события узлов, если они используются.пример:
$tableRow.find("td").each(function() { $(this).clone().replaceTag("li").appendTo("ul#table-row-as-list"); });источник:
$.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); }) } })обратите внимание, что это не заменить выбранный элемент, он возвращает вновь созданный.
Я придумал подход, в котором вы используете строковое представление вашего объекта jQuery и заменяете имя тега с помощью регулярных выражений и базового JavaScript. Вы не потеряете никакого контента и не должны перебирать каждый атрибут/свойство.
/* * 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); }наконец, вы можете заменить существующий объект/узел следующим образом:
var $newElement = replaceTag($rankingSubmit, 'a'); $('#not-an-a-element').replaceWith($newElement);
Это мое решение. Это позволяет переключаться между тегами.
<!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>
есть ли конкретная причина, по которой вам нужно изменить тег? Если вы просто хотите сделать текст больше, изменение класса CSS тега p было бы лучшим способом сделать это.
что-то вроде этого:
$('#change').click(function(){ $('p').addClass('emphasis'); });
Comments