使用JavaScript插入HTML元素

使用JavaScript插入HTML元素,javascript,html,Javascript,Html,使用以下语法时,不要为每种类型的属性和事件繁琐地搜索变通方法: 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

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

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]);
elem=document.createElement(“我的文本”);
document.body.insertBefore(elem,document.body.childNodes[0]);

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

document.body.innerHTML = '<p id="foo">Some HTML</p>' + document.body.innerHTML;
使用JavaScript框架将使代码更不冗长,并提高可读性。例如,jQuery允许您执行以下操作:

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

');
与其直接与
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]);
函数创建(htmlStr){
var frag=document.createDocumentFragment(),
temp=document.createElement('div');
temp.innerHTML=htmlStr;
while(临时第一个孩子){
第二个子女(临时第一个子女);
}
返回碎片;
}
var fragment=create('Hello!..

'); //可以使用本机DOM方法插入片段: document.body.insertBefore(fragment,document.body.childNodes[0]);
好处:

  • 您可以使用本机DOM方法进行插入,如insertBefore、appendChild等
  • 在插入实际DOM节点之前,您可以访问这些节点;您可以访问片段的childNodes对象
  • 使用文档片段非常快;比在DOM之外创建元素更快,在某些情况下比innerHTML更快


  • 尽管函数中使用了
    innerHTML
    ,但这一切都是在DOM之外发生的,因此速度比您想象的要快得多…

    据我所知,这是一个相当新且有限的过程,这种技术唯一的潜在问题是无法动态创建某些表元素

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

    您希望这样做吗

    document.body.insertAdjacentHTML( 'afterbegin', '<div id="myID">...</div>' );
    
    document.body.insertAdjacentHTML('afterbegin','…');
    
    如果要在现有页面的标记中插入HTML代码,请使用。此工具是专门为此目标创建的

    而不是编写下一个代码

        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-element=document.getElementById(“一”);
    var newElement='two'
    元素。insertAdjacentHTML('afterend',newElement)
    //新的DOM结构:onetwo
    
    位置是相对于要插入的相邻图元的位置:

    “开始前” 在元素本身之前

    'afterbegin' 就在元素内部,在它的第一个子元素之前

    “结束前” 就在元素内部,在其最后一个子元素之后

    'afterend'
    在元素本身之后

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

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

    insertAdjacentHTML
    可能是一个不错的选择:

    相当不错。但我感兴趣的是声明新元素属性和事件的源,而不是元素的innerHTML。
    document.getElementsByTagName('body')[0]
    确实可以替换为
    document.body
    ,这很好。但是,如果要将新的HTML预加或附加到另一个现有元素而不是正文,则必须使用
    document.getElementById()
    和/或
    document.getElementsByTagName()
    ;这就是我在示例中使用它的原因。此外,如果您直接添加/插入“innerHTML”@JimmyP:真是垃圾!这个问题的真正目的是能够直接插入HTML作为字符串,而不是玩弄函数来构造它,一个属性一个属性,一个节点一个节点,一个元素一个元素。这会分离所有事件处理程序,并可能导致大量内存泄漏。我打赌这个createDocumentFragment()不会像“遗留”那样好innerHTML。此方法适用于所有现代浏览器。对于IE 5.5及以下版本,您可以执行如下检查::if(document.createDocumentFragment){create(“…”);}else{/*使用innerHTML也许*/}crescentfresh,我之所以这样做是因为我喜欢帮助别人;如果解决方案不是在所有情况下都100%可操作,我很抱歉。如果你如此担心,为什么不提供自己的解决方案,而不是对已经提供的答案进行不必要的批评?任何抽象都会有边缘案例!这是一个学习环境——我们在这里不是为了给人们提供解决方案——我们在这里是为了帮助彼此在我们所做的事情上变得更好!很抱歉,但是哪里有人提到“AJAX”?很公平。我道歉。我只是觉得这里有这么多的抽象,没有提到任何警告。这比它需要的要复杂得多-sime vidas的答案要好得多不确定为什么这不是公认的答案。这是一种更简单、更明显的方式correct@JonnyLeeds这似乎不适用于
    body
    元素,但适用于任何其他元素。@Phill当然适用于
    。事实上,在
    上运行它是我通过控制台将样式表之类的东西注入网页的标准方法。您遇到了什么问题?@ŠimeVidas可能是因为执行时未定义body元素。。。我将您的行与window.onload=function(){…}配对以防止出现这种情况problem@GrandyPhill写道,它对其他元素有效。如果
    是未定义的,那么所有其他元素也是未定义的,所以这可能不是Phill的问题。
        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;
    
    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>
    
    var html = '<div>Hello prepended</div>';
    document.body.innerHTML = html + document.body.innerHTML;
    
    var html = '<div>Hello prepended</div>';
    document.body.insertAdjacentHTML('afterbegin', html)