【问题标题】:How to substitute element contents with DOM-manipulation-functions in JavaScript?如何用 JavaScript 中的 DOM 操作函数替换元素内容?
【发布时间】:2012-04-13 17:44:12
【问题描述】:

我有一个元素,看起来像这样:

 <div id="test">
    <span>You have
    <em>30</em>
    <span> characters left</span>
 </div>

我想将其替换为:

 <div id="test">
    <span>You reached the maximum length</span>
 </div>

或与

 <div id="test">
    <span>Your text is </span>
    <em>30</em>
    <span> characters to long</span>
 </div>

有没有办法用一组新元素替换所有子元素? 目前我正在使用以下功能首先删除所有元素:

function emptyElement(id) {
    while(document.getElementById(id).hasChildNodes()) {
        document.getElementById(id).removeChild(document.getElementById(id).firstChild)
    }
}

之后我再次添加内容:

span1 = document.createElement("span");
span1.appendChild(document.createTextNode("You have "));

len = document.createElement("em");
len.appendChild(document.createTextNode(length));

span2 = document.createElement("span");
span2.appendChild(document.createTextNode(" characters left."));

// remove child elements
emptyElement('test');

// Add content
document.getElementById('test').appendChild(span1);
document.getElementById('test').appendChild(len);
document.getElementById('test').appendChild(span2);

我的印象是,(1) 删除子元素,(2) 生成内容和 (3) 将新元素添加到 div 中,可能有更简单的方法。

【问题讨论】:

    标签: javascript html css dom


    【解决方案1】:
    1. 使用element.innerHTML = ''; 可以更轻松地删除
    2. 通过使用.innerHTML 添加内容或缓存元素集合,也可以更轻松地生成内容。

    3. #test 元素上的 elem.parentNode.replaceChild(new_elem, elem); 将是最简单的方法。

    使用缓存的 DOM 元素

    演示:http://jsfiddle.net/aKASN/1/

    HTML:

    <input type="text" id="input">
    <div id="test"></div>
    

    JavaScript:

    window.onload = function() {
        // References
        var limit_reached = document.createElement('div');
        limit_reached.id = 'test';
        limit_reached.innerHTML = 'You reached the maximum length';
    
        var chars_left = document.createElement('div');
        chars_left.id = 'test';
        chars_left.innerHTML = 'You have <em id="number_of_chars">30</em> characters left';
    
        document.getElementById('input').onkeyup = function() {
            var char_count = this.value.length;
            var limit = 20;
            var test = document.getElementById('test');
    
            if ( char_count > limit ) {
                test.parentNode.replaceChild(limit_reached, test);
            } else {
                chars_left.getElementsByTagName('em')[0].innerHTML = limit - char_count;
                test.parentNode.replaceChild(chars_left, test);
            }
        };
    };
    

    使用隐藏元素(推荐)

    推荐之前的另一种方法是使用 CSS 将所有元素包含在其中并隐藏未使用的消息。这比 DOM 操作更有效,因为不必一遍又一遍地创建元素。

    演示:http://jsfiddle.net/aKASN/

    CSS:

    .hidden {display:none;}
    

    HTML:

    <input type="text" id="input">
    <div><!-- Original id="test" -->
       <span id="charsleft" class="hidden">
          You have
          <em id="number_of_chars">30</em>
          characters left
       </span>
       <span id="limit_reached" class="hidden">
           You reached the maximum length
       </span>
    </div>
    

    JavaScript:

    window.onload = function() {
        // References
        var chars_left = document.getElementById('charsleft');
        var number_of_chars = document.getElementById('number_of_chars');
        var limit_reached = document.getElementById('limit_reached');
        var input = document.getElementById('input');
    
        input.onkeyup = function() {
            // Example value:
            var char_count = input.value.length;
    
            // Example: 20 character limit
            if ( char_count > 20 ) {
                chars_left.className = 'hidden';
                limit_reached.className = '';
            } else {
                chars_left.className = '';
                number_of_chars.innerHTML = 20 - char_count;
                limit_reached.className = 'hidden';
            }
        };
    };
    

    【讨论】:

    • 我尝试让网站易于访问。因此,对于那些停用样式表或使用屏幕阅读器的访问者来说,隐藏元素会很烦人。
    • @Sven 更新了答案。你真的认为禁用 CSS 的用户会激活 JavaScript..?
    • 您还使用了 className,它属于 Microsoft 的“all”模型,而不是 DOM(W3C)。我读到,这种动态 HTML 模型已被弃用,应该由 DOM 代替(德语参考:de.selfhtml.org/javascript/objekte/all.htm)。唯一提到的例外是“向后兼容性”(但我认为这已经不算数了,这篇文章是 5 年前写的)
    • @Sven classNameDOM level 2 specification 的一部分。您正在使用五年前的现代资源。它仍然在说 IE 4 和 FF 1... 扔掉那个引用,改用 MDN:developer.mozilla.org
    • 嗯,到目前为止,我还没有找到一个可比较的来源,它告诉您从哪个浏览器版本开始,主要浏览器支持某些功能。我试过了,例如quirksmode.org/dom/w3c_html.html,但这里只测试到FF4版本,例如,...
    【解决方案2】:

    这更容易,但丑陋:

    function emptyElement(id) {
        document.getElementById(id).innerHTML = '';
    }
    function newContent(id, newHTML) {
        document.getElementById(id).innerHTML = newHTML;
    }
    

    用法:

    newContent('test', '<span>You have </span><em>' + length + '</em><span> characters left.</span>');
    

    【讨论】:

    • 在这种情况下这无关紧要。
    • 为什么这不重要? innerHTML 是 Microsoft 标准,而不是 W3C 标准之一。除此之外,我读到,使用 DOM 操作函数(尤其是 XHTML)总是最好的主意。
    【解决方案3】:

    试试

    document.getElementById(id).innerHTML = 'new html';
    

    【讨论】:

    • 其他答案也一样,而且速度更快。
    • 请学习格式化您的代码 - 缩进 4 个空格或在选中您的代码时单击 {}
    【解决方案4】:

    如果你的内容不是很多用户 .innerHTML

     <div id="test">
        <span>You have
        <em>30</em>
        <span> characters left</span>
     </div>
    

    可以换成

    <div id="test">
        <span>You reached the maximum length</span>
     </div>
    

    通过使用

    document.getElementById('test').innerHTML = '<span>You reached the maximum length</span>';
    

    【讨论】:

    • 其他答案也一样,而且速度更快。
    猜你喜欢
    • 2010-10-25
    • 1970-01-01
    • 2019-02-11
    • 2017-11-04
    • 1970-01-01
    • 1970-01-01
    • 2019-09-27
    • 1970-01-01
    相关资源
    最近更新 更多