将 HTML 字符串附加到 DOM
如何
var str = '<p>Just some <span>text</span> here</p>';
使用 id test
附加 HTML 字符串(例如
)? (顺便说一句 div.innerHTML += str;
是不可接受的。)
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(11)
使用
insertAdjacentHTML
,其中 <所有当前版本都支持 href="https://developer.mozilla.org/en-US/docs/Web/API/Element/insertAdjacentHTML#browser_compatibility" rel="noreferrer"> browsers:位置参数
beforeend
将添加到元素内部,位于其最后一个子元素之后。现场演示: http://jsfiddle.net/euQ5n/
Use
insertAdjacentHTML
which is supported in all current browsers:The position parameter
beforeend
will add inside the element, after its last child.Live demo: http://jsfiddle.net/euQ5n/
性能
AppendChild
(E) 比 Chrome 和 safari 上的其他解决方案快 2 倍以上,insertAdjacentHTML
(F) 在 Firefox 上速度最快。innerHTML=
(B)(不要与+=
(A) 混淆)是所有浏览器上第二快的解决方案,它比 E 和 F 方便得多。详细信息
设置环境 (2019.07.10) Chrome 75.0.3770(64 位)、Safari 11.1.0 上的 MacOs High Sierra 10.13.4 (13604.5.6)、Firefox 67.0.0(64 位)
您可以在以下位置重放测试您的机器此处
Performance
AppendChild
(E) is more than 2x faster than other solutions on chrome and safari,insertAdjacentHTML
(F) is fastest on firefox. TheinnerHTML=
(B) (do not confuse with+=
(A)) is second fast solution on all browsers and it is much more handy than E and F.Details
Set up environment (2019.07.10) MacOs High Sierra 10.13.4 on Chrome 75.0.3770 (64-bit), Safari 11.1.0 (13604.5.6), Firefox 67.0.0 (64-bit)
You can replay test in your machine here
这是可以接受的吗?
jsFiddle。
但是,尼尔的答案是一个更好的解决方案。
Is this acceptable?
jsFiddle.
But, Neil's answer is a better solution.
这个想法是在中间元素上使用
innerHTML
,然后通过appendChild
将其所有子节点移动到您真正想要的位置。这可以避免清除
div#test
上的任何事件处理程序,但仍然允许您附加 HTML 字符串。The idea is to use
innerHTML
on an intermediary element and then move all of its child nodes to where you really want them viaappendChild
.This avoids wiping out any event handlers on
div#test
but still allows you to append a string of HTML.正确的方法是使用
insertAdjacentHTML
。在 Firefox 8 之前的版本中,如果您的str
不包含script
标签,您可以回退到使用Range.createContextualFragment
。如果您的
str
包含script
标签,则需要先从createContextualFragment
返回的片段中删除script
元素,然后再插入分段。否则,脚本将运行。 (insertAdjacentHTML
将脚本标记为不可执行。)The right way is using
insertAdjacentHTML
. In Firefox earlier than 8, you can fall back to usingRange.createContextualFragment
if yourstr
contains noscript
tags.If your
str
containsscript
tags, you need to removescript
elements from the fragment returned bycreateContextualFragment
before inserting the fragment. Otherwise, the scripts will run. (insertAdjacentHTML
marks scripts unexecutable.)快速破解:
用例:
1:另存为.html文件并在chrome或firefox或edge中运行。 (IE 无法工作)
2:在 http://js.do 中使用
实际操作:
http://js.do/HeavyMetalCookies/quick_hack
细分评论:
我发布的原因:
JS.do 有两个必须具备的功能:
但不显示 console.log 消息。
来到这里寻找快速解决方案。
我只想看看结果
几行暂存器代码,
其他解决方案的工作量太大。
Quick Hack:
Use Cases:
1: Save as .html file and run in chrome or firefox or edge. (IE wont work)
2: Use in http://js.do
In Action:
http://js.do/HeavyMetalCookies/quick_hack
Broken down with comments:
Reason Why I posted:
JS.do has two must haves:
But doesn't show console.log messages.
Came here looking for a quick solution.
I just want to see the results of
a few lines of scratchpad code, the
other solutions are too much work.
这可以解决
This can solve
InnerHTML 清除所有数据,例如现有节点的事件,
将子项附加到firstChild 仅将第一个子项添加到innerHTML。例如,如果我们必须附加:
仅显示 text1
怎么样:
通过附加子项将特殊标记添加到innerHTML,然后通过删除我们创建的标记来编辑outerHTML。不知道它有多聪明,但它对我有用
或者您可以将outerHTML更改为innerHTML,这样就不必使用函数替换
InnerHTML clear all data like event for existing nodes
append child with firstChild adds only first child to innerHTML. For example if we have to append:
only text1 will show up
What about this:
adds special tag to innerHTML by append child and then edit outerHTML by deleting tag we've created. Don't know how smart it is but it works for me
or you might change outerHTML to innerHTML so it doesn't have to use function replace
为什么这是不可接受的?
document.getElementById('test').innerHTML += str
将是教科书上执行此操作的方法。
Why is that not acceptable?
document.getElementById('test').innerHTML += str
would be the textbook way of doing it.
最短 - 18 个字符(不要将
+=
(OP 提及)与=
更多详细信息此处)Shortest - 18 chars (not confuse
+=
(mention by OP) with=
more details here)我的问题的答案就是这样;一个带有空值的简单 Map;我所能得到的只是一个非常沉重且不精确的答案。我想知道谁结束了我的问题...甚至懒得阅读
The answer to my Question was just this; a simple Map with an empty value; and all I can get is a very heavy answer and not precise. I wonder who closed my question... didn't even bother to read