在javascript中模拟滚动文本

在javascript中模拟滚动文本,javascript,jquery,Javascript,Jquery,我正试图想出一些东西来模拟老式的调制解调器连接。即,文本以可变速度绘制自身,而不是立即渲染 我想出了一些有用的方法: 我的问题是我不能让它跑得更快。我已将设置间隔设置为1ms,这似乎是我能达到的最快速度 有人知道如何重新考虑这一点以消除我遇到的速度上限吗?您可以尝试一次添加多个字符。尝试追加2或3个字符或更多字符 动画速度取决于帧速率和帧间的变化量。您可以尝试一次附加多个角色。尝试追加2或3个字符或更多字符 动画速度取决于帧速率和帧间的变化量。是的,只需在displayText功能中添加两个字

我正试图想出一些东西来模拟老式的调制解调器连接。即,文本以可变速度绘制自身,而不是立即渲染

我想出了一些有用的方法:

我的问题是我不能让它跑得更快。我已将设置间隔设置为1ms,这似乎是我能达到的最快速度


有人知道如何重新考虑这一点以消除我遇到的速度上限吗?

您可以尝试一次添加多个字符。尝试追加2或3个字符或更多字符


动画速度取决于帧速率和帧间的变化量。

您可以尝试一次附加多个角色。尝试追加2或3个字符或更多字符


动画速度取决于帧速率和帧间的变化量。

是的,只需在displayText功能中添加两个字母(或更多)。在for循环中执行此操作,您可以为其设置一个易于调整的变量。

是的,只需在displayText函数中添加两个字母(或更多)。在for循环中执行此操作,您可以为其设置一个易于调整的变量。

这似乎要快一点,至少在FireFox中是这样。尽管进行了完全的重写,唯一真正的区别是没有在“循环”中使用jQuery或字符串长度属性。我还增加了一次扮演多个角色的能力。5-10个字符似乎是一个不错的范围

function TextTyper(targetElement, charsAtATime, textToType) {
    var i,
        l = textToType.length,
        timeout,
        el = $(targetElement)[0],
        textNode = el.childNodes[0];
    if (!textNode) {
        textNode = document.createTextNode('');
        el.appendChild(textNode);
    }
    this.begin = function() {
        i = 0;
        if (timeout) { clearTimeout(timeout); }
        textNode.nodeValue = '';
        typeChar();
    };
    console.log(textNode);
    function typeChar() {
        if (i < l) {
            textNode.nodeValue += textToType.substr(i, charsAtATime);
            i += charsAtATime;
            timeout = setTimeout(typeChar, 1);
        } else {
            timeout = 0;
        }
    }
}

(new TextTyper('#test', 8, 'Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nullam rhoncus urna vitae mi aliquet suscipit. Nullam vulputate ultrices tortor vel luctus. Duis sodales lacinia consequat. Vestibulum vehicula, ligula sit amet tincidunt scelerisque, orci arcu malesuada odio, eu ornare ipsum risus at metus. Nullam porttitor condimentum nunc, nec euismod massa consectetur id. Mauris ut nisl nulla, et tristique sem. In non ante vel libero lacinia vehicula in quis urna. Suspendisse urna erat, ornare sit amet rhoncus eget, bibendum at ipsum.'))
   .begin();
函数TextTyper(targetElement、CharsAtime、textToType){
var i,
l=textToType.length,
超时,
el=$(targetElement)[0],
textNode=el.childNodes[0];
如果(!textNode){
textNode=document.createTextNode(“”);
el.appendChild(textNode);
}
this.begin=函数(){
i=0;
if(timeout){cleartimout(timeout);}
textNode.nodeValue='';
typeChar();
};
console.log(textNode);
函数typeChar(){
如果(i
我在这里观察到了一些关于闭包和作用域的最佳实践。但是您应该在页面卸载时丢弃TextTyper对象,并且应该正确地处理它们,而不在紧密循环中创建新对象(或者您可以在targetElement上使用闭包泄漏内存)


注意:我选择了
setTimeout
而不是
setInterval
,因为我不想让同一个脚本的多个调用互相影响。考虑到代码运行的速度,我怀疑这是可能的,但这是一个很好的设计实践。如果这是一个Ajax调用,您不会希望在应答之前用请求使服务器饱和第一个请求出现了。

这似乎快了一点,至少在FireFox中是这样。尽管进行了完全重写,唯一真正的区别是没有在“循环”中使用jQuery或字符串长度属性。我还增加了一次处理多个字符的能力。5-10个字符的范围似乎不错

function TextTyper(targetElement, charsAtATime, textToType) {
    var i,
        l = textToType.length,
        timeout,
        el = $(targetElement)[0],
        textNode = el.childNodes[0];
    if (!textNode) {
        textNode = document.createTextNode('');
        el.appendChild(textNode);
    }
    this.begin = function() {
        i = 0;
        if (timeout) { clearTimeout(timeout); }
        textNode.nodeValue = '';
        typeChar();
    };
    console.log(textNode);
    function typeChar() {
        if (i < l) {
            textNode.nodeValue += textToType.substr(i, charsAtATime);
            i += charsAtATime;
            timeout = setTimeout(typeChar, 1);
        } else {
            timeout = 0;
        }
    }
}

(new TextTyper('#test', 8, 'Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nullam rhoncus urna vitae mi aliquet suscipit. Nullam vulputate ultrices tortor vel luctus. Duis sodales lacinia consequat. Vestibulum vehicula, ligula sit amet tincidunt scelerisque, orci arcu malesuada odio, eu ornare ipsum risus at metus. Nullam porttitor condimentum nunc, nec euismod massa consectetur id. Mauris ut nisl nulla, et tristique sem. In non ante vel libero lacinia vehicula in quis urna. Suspendisse urna erat, ornare sit amet rhoncus eget, bibendum at ipsum.'))
   .begin();
函数TextTyper(targetElement、CharsAtime、textToType){
var i,
l=textToType.length,
超时,
el=$(targetElement)[0],
textNode=el.childNodes[0];
如果(!textNode){
textNode=document.createTextNode(“”);
el.appendChild(textNode);
}
this.begin=函数(){
i=0;
if(timeout){cleartimout(timeout);}
textNode.nodeValue='';
typeChar();
};
console.log(textNode);
函数typeChar(){
如果(i
我在这里观察到了一些关于闭包和作用域的最佳实践。但是您应该在页面卸载时丢弃TextTyper对象,并且应该正确地处理它们,而不在紧密循环中创建新对象(或者您可以在targetElement上使用闭包泄漏内存)

注意:我选择了
setTimeout
而不是
setInterval
,因为我不想让同一个脚本的多个调用互相影响。考虑到代码运行的速度,我怀疑这是可能的,但这是一个很好的设计实践。如果这是一个Ajax调用,您不会希望在应答之前用请求使服务器饱和第一个请求来了。

另一种方法

var txt="Lorem ipsum dolor sit amet";
index=0;
function displayText(text) {
    $('#test').append(text[index]); index ++;
    $('#test').append(text[index]); index ++;
    if (index  < text.length) {
        setTimeout(function(){ displayText(txt) }, 1);
    }
}

displayText(txt);
var txt=“Lorem ipsum door sit amet”;
指数=0;
函数displayText(文本){
$('#test').append(text[index]);index++;
$('#test').append(text[index]);index++;
如果(索引<文本长度){
setTimeout(函数(){d
function displayText(id, text) {
    var node = document.createTextNode(""),
        i = 0,
        chars = 5;
    document.getElementById(id).appendChild(node);

    (function add(){
        node.data += text.substr(i, chars);
        i += chars;
        if (i < text.length)
            setTimeout(add, 1000/60);
    })();
}