1

这是关于什么的

我目前正在为 Campfire 聊天服务上的表情符号编写脚本,因为它们没有表情符号功能。现在它运行表情符号的速度真的很慢,因为它使用了一个 setInterval,假设在聊天中有新消息时每隔 200 毫秒检查一次。我通过将两个变量“a”和“b”与var a,b;. 因此,在第一个 setInterval 中,我将其计时为150毫秒。在这里面,我只是给变量“a”提供了聊天的 HTML 值。然后在第二个 setInterval (200) 中,我也给变量“b”提供了 HTML 的值,但这是一个不同的时间,所以现在我在if声明,如果不同,我运行函数将符号更改为表情符号。我这样做是为了提高性能。即使在篝火聊天中没有人真正写过东西,它也会检查表情符号,因此无需检查表情符号。

这是完整的功能:

var a, b;
setInterval(function() {
    a = $('#chat').html();
    console.warn("Chat HTML has been Scanned");
}, 150);
var t = "0";
setInterval(function() {
    b = $('#chat').html();
    console.warn("Chat got scanned for Change in html.");
    if (emoOn == true) {
        if (t === $('#num12345').text()) {
            $(".participants").after('<div id="emote"><h3><span class="room_actions"><a href="javascript:void(0)" class="on" style="font-weight:bold;">On</a> | <a href="javascript:void(0)" class="off" style="cursor:pointer;">Off</a></span>Emoticons</h3></div>');
            $('#num12345').text("111")
        }
        if (a !== b) {
            turnOn();
            console.log("CHANGE")
        } else {
            turnOn("off");
        }
    }
}, 200)​;

问题

正如您在上面的代码中看到的,我运行了 3 个控制台。在控制台中,我预计会出现“已扫描聊天 HTML”警告,然后会出现“已扫描聊天以查找 html 中的更改”。一直按这个顺序。但相反,“聊天 HTML 已被扫描”警告两次,它就像我想象的那样不起作用。

当一条新消息显示它假设记录“更改”但大多数时候它没有,我认为这是 setIntervals 的问题。看来他们的时机不对。但我真的不想说 JavaScript 导致了这个问题,但我不知道还有什么可能。我也在使用 Chrome。

4

1 回答 1

1

setInterval 是异步的,因此当您的第一个调用正在等待时,javascript 解释器将继续执行下一项工作(在这种情况下,将 t 设置为“0”,然后是您的第二个 setInterval 调用)。

编辑:我认为问题在于您同时定义了 setInterval 调用,但是 javascript 计时器的精度并不是那么好(请参见此处:http ://ejohn.org/blog/accuracy-of-javascript-时间/ )。

您可以在 setTimeout 之后调用第二个 setInterval 来给自己一点缓冲:

var a, b;
setInterval(function() {
    a = $('#chat').html();
    console.warn("Chat HTML has been Scanned");
    var t = "0";
}, 2000);
setTimeout(function(){
    setInterval(function() {
        b = $('#chat').html();
        console.warn("Chat got scanned for Change in html.");
        if (emoOn == true) {
            if (t === $('#num12345').text()) {
                $(".participants").after('<div id="emote"><h3><span class="room_actions"><a href="javascript:void(0)" class="on" style="font-weight:bold;">On</a> | <a href="javascript:void(0)" class="off" style="cursor:pointer;">Off</a></span>Emoticons</h3></div>');
                $('#num12345').text("111")
            }
            if (a !== b) {
                turnOn();
                console.log("CHANGE")
            } else {
                turnOn("off");
            }
        }
    }, 2000)​;

}, 500);

这将在第一个半秒后设置对 setInterval 的第二个调用,但是您可以得到比这更少的调用(任何超过 30 毫秒的时间都应该足够了)。

于 2012-06-10T01:39:13.443 回答