jQuery:如何更改标签名称?
jQuery:如何更改标签名称?
例如:
<tr>
$1
</tr>
我需要
<div>
$1
</div>
是的,我可以
- 创建 DOM 元素;
- 将tr内容复制到div中
- 从dom中删除tr
但是我可以直接制作吗?
PS:
$(tr).get(0).tagName = "div";
导致 DOMException
。
jQuery: how to change tag name?
For example:
<tr>
$1
</tr>
I need
<div>
$1
</div>
Yes, I can
- Create DOM element <div>
- Copy tr content to div
- Remove tr from dom
But can I make it directly?
PS:
$(tr).get(0).tagName = "div";
results in DOMException
.
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(19)
您可以使用 jQuery 的
.replaceWith()
方法替换任何 HTML 标记。示例: http://jsfiddle.net/JHmaV/
参考: .replaceWith
如果您想保留现有标记,您可以使用如下代码:
You can replace any HTML markup by using jQuery's
.replaceWith()
method.example: http://jsfiddle.net/JHmaV/
Ref.: .replaceWith
If you want to keep the existing markup, you could use code like this:
不,根据 W3C 规范,这是不可能的:“tagName of type DOMString, readonly”
http://www.w3.org/TR/DOM-Level-2-Core/core.html
No, it is not possible according to W3C specification: "tagName of type DOMString, readonly"
http://www.w3.org/TR/DOM-Level-2-Core/core.html
上述解决方案会清除现有元素并从头开始重新创建它,从而破坏进程中子元素上的任何事件绑定。
简短答案:(丢失
的属性)
较长答案:(复制
的属性)
摆弄嵌套绑定
同时复制任何绑定会很酷,但是 获取当前绑定对我来说不起作用。
The above solutions wipe out the existing element and re-create it from scratch, destroying any event bindings on children in the process.
short answer: (loses <p/>'s attributes)
longer answer: (copies <p/>'s attributes)
fiddle with nested bindings
It would be cool to copy any bindings from the at the same time, but getting current bindings didn't work for me.
DOM renameNode() 方法在哪里?
今天(2014 年)没有浏览器理解新的 DOM3 renameNode 方法(请参阅还有 W3C)
检查是否在您的 Bowser 上运行: http://jsfiddle.net/k2jSm/1/
所以, DOM 解决方案很丑陋,我不明白为什么 (??) jQuery 没有实现解决方法?
纯 DOM 算法
createElement(new_name)
replaceChild()
将旧的替换为新的是这样的,
...等待审查和 jsfiddle ...
jQuery 算法
@ilpoldo 算法是一个很好的起点,
正如其他人评论的那样,它需要一个属性复制...等待通用...
特定于
class
,保留属性,请参阅http://jsfiddle.net/cDgpS/另请参阅https://stackoverflow.com/a/ 9468280/287948
Where the DOM renameNode() Method?
Today (2014) no browser understand the new DOM3 renameNode method (see also W3C)
check if run at your bowser: http://jsfiddle.net/k2jSm/1/
So, a DOM solution is ugly and I not understand why (??) jQuery not implemented a workaround?
pure DOM algorithm
createElement(new_name)
replaceChild()
is something like this,
... wait review and jsfiddle ...
jQuery algorithm
The @ilpoldo algorithm is a good start point,
As others commented, it need a attribute copy ... wait generic ...
specific for
class
, preserving the attribute, see http://jsfiddle.net/cDgpS/See also https://stackoverflow.com/a/9468280/287948
要保留标签的内部内容,您可以将访问器
.html()
与.replaceWith()
分叉示例结合使用:http://jsfiddle.net/WVb2Q/1/
To preserve the internal content of the tag you can use the accessor
.html()
in conjunction with.replaceWith()
forked example: http://jsfiddle.net/WVb2Q/1/
受到 ericP 答案的启发,格式化并转换为 jQuery 插件:
用法:
Inspired by ericP answer, formatted and converted to jQuery plugin:
Usage:
工作纯 DOM 算法
Working pure DOM algorithm
你可以先学一点基础知识。对我有用。
You could go a little basic. Works for me.
要替换多个标签的内部内容,每个标签都有自己的原始内容,您必须使用
.replaceWith()
和.html()
不同的是:http://jsfiddle.net/kcrca/VYxxG/
To replace the internal contents of multiple tags, each with their own original content, you have to use
.replaceWith()
and.html()
differently:http://jsfiddle.net/kcrca/VYxxG/
JS更改标签名称
相关小提琴在此 链接
JS to change the tag name
Related fiddle is in this link
你可以使用这个函数
示例代码
); var new_html = obj.outerHTML.replace(tag_start, "<" + new_tag).replace(tag_end, '</' + new_tag + '>'); $obj.replaceWith(new_html); };ES6
示例代码
You can use this function
Sample code
); var new_html = obj.outerHTML.replace(tag_start, "<" + new_tag).replace(tag_end, '</' + new_tag + '>'); $obj.replaceWith(new_html); };ES6
Sample code
由于
replaceWith()
在元素基础上对我不起作用(可能是因为我在map()
中使用了它),所以我通过创建一个新元素并复制来做到这一点根据需要添加属性。Since
replaceWith()
didn't work for me on an element basis (maybe because I used it insidemap()
), I did it by creating a new element and copying the attributes as needed.就拿他来说吧,
就拿问题来说,“如何更改标签名称?”我建议这个解决方案:
是否合理,需要具体情况具体分析。
我的示例将“重命名”所有带有超链接的 a-标签,用于带有跨度标签的短信。维护所有属性和内容:
由于带有 href 属性的 span 标记没有任何意义,我也将其删除。
这样做是万无一失的,并且与 jquery 支持的所有浏览器兼容。
人们还有其他方法尝试将所有属性复制到新元素,但这些方法并不与所有浏览器兼容。
虽然我认为这样做的成本相当高。
Take him by the word
Taken the Question by Word "how to change tag name?" I would suggest this solution:
If it makes sense or not has to be decided case by case.
My example will "rename" all a-Tags with hyperlinks for SMS with span tags. Maintaining all attributes and content:
As it does not make any sense to have a span tag with an href attribute I remove that too.
Doing it this way is bulletproof and compatible with all browsers that are supported by jquery.
There are other ways people try to copy all the Attributes to the new Element, but those are not compatible with all browsers.
Although I think it is quite expensive to do it this way.
Jquery 插件使“tagName”可编辑:
请参阅:http://jsfiddle.net/03gcnx9v/3/
Jquery plugin to make "tagName" editable :
See : http://jsfiddle.net/03gcnx9v/3/
另一个更改节点名称的脚本
http://jsfiddle.net/rc296owo/5/
它将将属性和内部 html 复制到新元素中,然后替换旧元素。
Yet another script to change the node name
http://jsfiddle.net/rc296owo/5/
It will copy over the attributes and inner html into a new element and then replace the old one.
也试试这个。在这个例子中,我们还可以在新标签中拥有旧标签的属性
Try this one also. in this example we can also have attributes of the old tag in new tag
假设您启用了 jQuery
这里是示例代码,
它很丑,但是工作,哈哈。
Assume you enabled jQuery
here comes the sample code,
it is ugly, but work, lol.
由于接受的答案有一些限制(例如属性不会迁移到新元素),我找到了一种新方法来替换标签名称而不丢失这些属性。但它也有一些限制,例如:为主元素设置的事件不会迁移到新元素。无论如何,我提供了该功能。如果您有更好的想法,请告诉我。
使用纯 Javascript:
使用 Jquery:
说明:
该函数用新标签替换元素的outerHTML 的开始和结束标签,忽略具有相同标签名称的子元素。有时,元素没有结束标记名称,例如:(
),在这种情况下,它只是替换开始标记。就这样。
As the accepted answer have some limitations (like the attributes aren't migrated to the new element), I found a new way to replace tag name without loosing those. But it also have some limitations for example: The events set to the main element will not migrated to the new element. Anyways, I'm providing the function. Let me know if you have any better Idea.
With Pure Javascript:
With Jquery:
Explanation:
The function replaces the start and end tag of the element's outerHTML with the new tag ignoring the child elements with the same tag name. Sometimes the element doesn't have end tag name like: (
<div />
), in that case it just replace the start tag. That's All.