我目前正在为Campfire聊天服务制作表情符号脚本,因为他们没有表情符号功能。现在它运行表情符号的速度非常慢,因为它使用了一个setInterval,如果聊天中有新消息,则假设它会检查200毫秒。我通过使用var a,b;
创建两个变量“a”和“b”来实现此目的。那么在第一个setInterval中我用 150 毫秒计时。在此内部我只给变量“a”聊天的HTML值。然后在第二个setInterval(200)中我给变量“b”也给出了HTML的值,但这是一个不同的时间,所以现在我在if
语句中检查HTML,如果它不同,我运行函数将符号更改为表情符号。我这样做是为了提高性能。在它检查表情符号之前,即使篝火聊天中没有人真正写过东西,所以不需要检查表情符号。
这是完整的功能:
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。
答案 0 :(得分:1)
setInterval是异步的,所以当你的第一个调用正在等待时,javascript解释器会转到它的下一个作业(在这种情况下,将t设置为“0”,然后再设置第二个setInterval调用)。
编辑:我认为问题在于您同时定义了setInterval调用,但javascript计时器的精度并不是那么好(请参阅此处:http://ejohn.org/blog/accuracy-of-javascript-time/)。
你可以在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半秒,你可以远远超过那个(30ms以上就足够了)。