3

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

 <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 可能有一种更简单的方法。

4

4 回答 4

4
  1. 删除可以通过使用更轻松地完成element.innerHTML = '';
  2. 生成内容也可以更容易地完成,既可以使用添加内容.innerHTML,也可以缓存元素集合。

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

使用缓存的 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';
        }
    };
};
于 2012-04-13T09:17:43.220 回答
0

这更容易,但丑陋:

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>');
于 2012-04-13T09:17:36.513 回答
0

尝试

document.getElementById(id).innerHTML = 'new html';
于 2012-04-13T09:18:16.517 回答
-1

如果您的内容不是很多用户 .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>';
于 2012-04-13T09:19:33.447 回答