如何在JavaScript中创建打字机效果这将考虑html标签规则?

时间:2015-04-05 21:15:21

标签: javascript

假设我有一个来自div标签的文本:

 <div id="outPutContainer">
     <div id="contentDiv" style="display:none;"> This is some cool content... </div>
 </div>

现在,如果我想,我可以创建一个JavaScript函数,一次打印一个字符,它将正常工作。示例如下。

function printSentence(inner, outer, index, speed) {
    var input = document.getElementById(inner).innerHTML;
    var timer = setInterval(function(){
        document.getElementById(outer).innerHTML+=input.charAt(index);
        index++;
        if(index  == sentence.length -1){
            printResume(inner, outer, index+1, speed);
        }else{
           clearInterval(timer);
        }
     }, speed);
}

printSentence("contentDiv", "outPutContainer", 0, 100);

同样,上面的函数运行得很好,但是假设我想考虑元素中的html标签,它将如何工作。一个例子是

<div id="contentDiv2"> This is some cool <strong>content</strong>
    <p>Paragraph of content</p>
</div>

所以理想的效果是

这是一些很酷的内容

内容段

(打字机效果的灵感来自查理)“我喜欢在信用到期时给予信任”(: Javascript typing effect

我想我可以投入一个jsFiddle以方便人们。 http://jsfiddle.net/bJxe3/19/

1 个答案:

答案 0 :(得分:12)

您可以使用字符串的子字符串直到索引更新内容,而不是一次添加字符。如果索引处的字符小于号(&lt;),则只需向前跳到下一个大于号(&gt;)。

<强>段:

&#13;
&#13;
function printSentence(id, sentence, speed) {
  var index = 0,
      timer = setInterval(function() {
    var char= sentence.charAt(index);
    if(char === '<') index= sentence.indexOf('>',index);
    document.getElementById(id).innerHTML= sentence.substr(0,index);
    if(++index === sentence.length){
      clearInterval(timer);
    }
  }, speed);
} //printSentence

printSentence(
  'contentDiv',
  'This is some cool <strong>content</strong>.<p>Paragraph of content</p><ul><li>This<li>is<li>a<li>test</ul><table><tr><th>Header 1<th>Header 2<tr><td>Row 2, Col 1<td>Row 2, Col 2</table>',
  50
);
&#13;
body, table {font: 12px verdana;}
table {border-spacing: 0;}
td,th {border: 1px solid gray;}
th {background: #def;}
&#13;
<div id="contentDiv"></div>
&#13;
&#13;
&#13;