使用JavaScript插入HTML元素


104

使用以下语法时,不必繁琐地为每种类型的属性和事件搜索解决方法:

elem = document.createElement("div");
elem.id = 'myID';
elem.innerHTML = ' my Text '
document.body.insertBefore(elem,document.body.childNodes[0]);

有没有一种方法可以将整个HTML元素声明为字符串?喜欢:

elem = document.createElement("<div id='myID'> my Text </div>");
document.body.insertBefore(elem,document.body.childNodes[0]);

Answers:


124

innerHTML创建片段然后将其插入可能会更好,而不是直接弄乱它:

function create(htmlStr) {
    var frag = document.createDocumentFragment(),
        temp = document.createElement('div');
    temp.innerHTML = htmlStr;
    while (temp.firstChild) {
        frag.appendChild(temp.firstChild);
    }
    return frag;
}

var fragment = create('<div>Hello!</div><p>...</p>');
// You can use native DOM methods to insert the fragment:
document.body.insertBefore(fragment, document.body.childNodes[0]);

好处:

  1. 您可以使用本机DOM方法进行插入,例如insertBefore,appendChild等。
  2. 您可以在插入实际的DOM节点之前对其进行访问;您可以访问片段的childNodes对象。
  3. 使用文档片段非常快捷;比在DOM之外创建元素要快,并且在某些情况下要比innerHTML快。

即使innerHTML在函数中使用它,它们都发生在DOM之外,因此它的速度比您想象的要快得多。


3
我敢打赌,这个createDocumentFragment()不会像“传统” innerHTML那样好。
TheFlash

2
此方法适用于所有现代浏览器。对于IE 5.5及以下版本,您可以执行如下检查:if(document.createDocumentFragment){create('...'); } else {/ *也许使用innerHTML * /}
詹姆斯(James)2009年

32
新月,我在SO方面有所帮助,因为我喜欢帮助别人。很抱歉,如果不是在所有情况下都100%可行的解决方案。如果您如此担心,为什么不提供自己的解决方案,而不是不必要地批评已经提供的答案呢?有了任何抽象,总会有边缘情况!这是一个学习环境-我们不是在这里给大家提供解决方案-我们是在帮助彼此在做事上变得更好!抱歉,但是没有人提到“ AJAX”?
詹姆斯

1
很公平。我很抱歉。我只是觉得这里有太多抽象,提到了零警告。

1
这比需要的要复杂得多-sime vidas的答案要好得多
JonnyRaa 2015年

83

你要这个

document.body.insertAdjacentHTML( 'afterbegin', '<div id="myID">...</div>' );

13
不知道为什么这不是公认的答案。这是更简单,更明显的正确方法
JonnyRaa 2015年

@JonnyLeeds,这似乎在body元素上不起作用,但在任何其他元素上都可以正常工作。
2015年

1
@Phill当然适用<body>。实际上,运行它<body>是我通过控制台将样式表之类的内容注入网页的标准方法。你有什么问题
森那维达斯

@ŠimeVidas可能是因为在执行时未定义body元素...我将您的行与window.onload = function(){…}配对以防止该问题
GDY

@Grandy Phill写道,它可用于其他元素。如果<body>未定义,那么其他所有元素也都不确定,因此这可能不是Phill的问题。
席姆·维达斯

32

看看insertAdjacentHTML

var element = document.getElementById("one");
var newElement = '<div id="two">two</div>'
element.insertAdjacentHTML( 'afterend', newElement )
// new DOM structure: <div id="one">one</div><div id="two">two</div>

position是相对于您要插入的元素的位置,该位置与以下位置相邻:

'beforebegin' 元素本身之前

'afterbegin' 在元素内部,在其第一个孩子之前

'beforeend' 在元素的最后一个子元素之后

'afterend' 在元素本身之后


17

在老式JavaScript中,您可以执行以下操作:

document.body.innerHTML = '<p id="foo">Some HTML</p>' + document.body.innerHTML;

针对您的评论:

[...]我有兴趣声明新元素的属性和事件的来源,而不是innerHTML元素的来源。

不过,您需要将新的HTML注入DOM;这就是为什么innerHTML在老式JavaScript示例中使用的原因。在innerHTML该的BODY元素被换成了新的HTML。我们并没有真正接触到BODY

我将重写上述示例以澄清这一点:

var newElement = '<p id="foo">This is some dynamically added HTML. Yay!</p>';
var bodyElement = document.body;
bodyElement.innerHTML = newElement + bodyElement.innerHTML;
// note that += cannot be used here; this would result in 'NaN'

使用JavaScript框架将使此代码的详细程度降低,并提高可读性。例如,jQuery允许您执行以下操作:

$('body').prepend('<p id="foo">Some HTML</p>');

非常好。但是我有兴趣声明新元素的属性和事件的来源,而不是元素的innerHTML。
TheFlash

1
document.getElementsByTagName('body')[0]确实可以被替换document.body,好点。但是,如果您想将新的HTML附加或附加到另一个现有元素而不是BODY上,则必须使用document.getElementById()and / or document.getElementsByTagName();这就是为什么我在示例中使用它。
Mathias Bynens,2009年

1
另外,如果您直接添加/插入“ innerHTML”,您的代码很快就会变得非常混乱
James James

1
@JimmyP:什么垃圾!这个问题的真正目的是能够直接将HTML作为字符串插入,而不是通过逐个属性,逐个节点,逐个元素地玩弄构造HTML的功能。
TheFlash

1
这会分离所有事件处理程序,并可能导致大量的内存泄漏。
adardesign 2010年

1

据我所知,公平地讲,这是相当新的且有限的,此技术的唯一潜在问题是,您无法动态创建某些表元素。

我通过向隐藏的DIV中添加“模板”元素然后使用cloneNode(true)创建一个克隆并根据需要附加它来使用模板进行模板化。请注意,您确实需要确保根据需要重新分配ID,以防止重复。


-1

正如其他人所说,方便的jQuery 前置功能可以被模拟:

var html = '<div>Hello prepended</div>';
document.body.innerHTML = html + document.body.innerHTML;

尽管有些人说最好不要使用innerHTML,但在许多用例中,如果您知道这一点,它是可靠的:

如果<div><span>或者<noembed>节点具有包括字符(一个子文本节点&),( <),或(>),innerHTML的返回这些字符作为&amp&lt&gt分别。使用Node.textContent获得的这些文本节点的内容的正确副本。

https://developer.mozilla.org/zh-CN/docs/Web/API/Element/innerHTML

要么:

var html = '<div>Hello prepended</div>';
document.body.insertAdjacentHTML('afterbegin', html)

insertAdjacentHTML可能是一个很好的选择:https : //developer.mozilla.org/en-US/docs/Web/API/Element/insertAdjacentHTML


-2

如果要在现有页面的标签内插入HTML代码,请使用Jnerator。该工具是专门为此目的而创建的。

而不是编写下一个代码

    var htmlCode = '<ul class=\'menu-countries\'><li
        class=\'item\'><img src=\'au.png\'></img><span>Australia </span></li><li
        class=\'item\'><img src=\'br.png\'> </img><span>Brazil</span></li><li
        class=\'item\'> <img src=\'ca.png\'></img><span>Canada</span></li></ul>';
    var element = document.getElementById('myTag');
    element.innerHTML = htmlCode;

您可以编写更易理解的结构

    var jtag = $j.ul({
        class: 'menu-countries',
        child: [
            $j.li({ class: 'item', child: [
                $j.img({ src: 'au.png' }),
                $j.span({ child: 'Australia' })
            ]}),
            $j.li({ class: 'item', child: [
                $j.img({ src: 'br.png' }),
                $j.span({ child: 'Brazil' })
            ]}),
            $j.li({ class: 'item', child: [
                $j.img({ src: 'ca.png' }),
                $j.span({ child: 'Canada' })
            ]})
        ]
    });
    var htmlCode = jtag.html();
    var element = document.getElementById('myTag');
    element.innerHTML = htmlCode;
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.