使用 JavaScript 插入 HTML 元素

IT技术 javascript html
2021-01-27 23:22:25

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

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]);
6个回答

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 之外,所以它比你想象的要快得多......

我敢打赌这个 createDocumentFragment() 不会像“传统”innerHTML 那样好。
2021-03-17 23:22:25
很公平。我很抱歉。我只是觉得这里有很多抽象,提到了零警告。
2021-03-19 23:22:25
此方法适用于所有现代浏览器。对于 IE 5.5 及以下版本,您可以执行以下检查::: if (document.createDocumentFragment) { create('...'); } else { /* 可能使用innerHTML */ }
2021-03-27 23:22:25
我真的很想要向后兼容,所以我怎么能把它和 innerHTML 一起使用,比如我检查这个方法是否不为空,也许?
2021-04-05 23:22:25
crescentfresh,我帮助 SO 因为我喜欢帮助别人;如果解决方案不是在所有情况下都 100% 可操作,我很抱歉。如果您如此担心,为什么不提供您自己的解决方案,而不是对已经提供的答案提出不必要的批评?对于任何抽象,总会有边缘情况!这是一个学习环境——我们不是来给人们提供解决方案的——我们来这里是为了帮助彼此在我们所做的事情上变得更好!对不起,但有人提到“AJAX”吗?
2021-04-08 23:22:25

你要这个

document.body.insertAdjacentHTML( 'afterbegin', '<div id="myID">...</div>' );
@Grandy Phill 写道它适用于其他元素。如果<body>未定义,则所有其他元素也将是未定义的,因此这可能不是 Phill 的问题。
2021-03-13 23:22:25
@JonnyLeeds 这似乎不适用于body元素,但适用于任何其他元素。
2021-03-16 23:22:25
@ŠimeVidas 可能是因为 body 元素没有在执行时定义......我将你的行与 window.onload = function() { ... } 配对以防止出现该问题
2021-03-17 23:22:25
@ŠimeVidas 嗯,是的,你说得对......如果它适用于任何事情,它也应该适用于身体
2021-04-05 23:22:25
@Phill 当然它适用于<body>. 事实上,运行它<body>是我通过控制台将样式表等内容注入网页的标准方法。你有什么问题?
2021-04-06 23:22:25

看看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' 在元素本身之后

在老式 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>');
这会分离所有事件处理程序,并可能导致大量内存泄漏。
2021-03-14 23:22:25
此外,如果您直接添加/插入“innerHTML”,您的代码会很快变得非常混乱
2021-03-22 23:22:25
document.getElementsByTagName('body')[0]确实可以换成document.body,好点。但是,如果您想将新 HTML 附加或附加到另一个现有元素而不是 BODY,则必须使用document.getElementById()和/或document.getElementsByTagName()这就是我在示例中使用它的原因。
2021-03-23 23:22:25
非常好。但我感兴趣的是声明一个新元素的属性和事件的来源,而不是一个元素的innerHTML。
2021-04-01 23:22:25
@JimmyP:什么垃圾!这个问题的真正目的是能够直接将 HTML 作为字符串插入,而不是使用函数来构造它,一个个 attrib,一个节点一个节点,一个元素一个元素。
2021-04-09 23:22:25

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

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