JavaScript循环不';t出口
我已经尝试了我能想到的一切 我正在为IMVU构建一种聊天机器人,在IMVU移动网站上使用注入的JavaScript。我有一个循环来抓取接收到的消息,并搜索某些关键字,比如以斜杠(/)开头的消息,以指示对bot的命令 当使用某些命令时,我遇到一个问题,即bot似乎卡在循环中,几乎就像for循环的索引在循环中被修改一样。代码包括在下面 如果您需要更多,请询问,如果您发现可能导致问题的原因,请告诉我。我束手无策 只需注意:jQuery被正确注入,我的所有变量都在那里,调试控制台中没有错误,并且在Windows7x64上的Chrome41.0.2272.101m下运行JavaScript循环不';t出口,javascript,jquery,loops,browser,infinite,Javascript,Jquery,Loops,Browser,Infinite,我已经尝试了我能想到的一切 我正在为IMVU构建一种聊天机器人,在IMVU移动网站上使用注入的JavaScript。我有一个循环来抓取接收到的消息,并搜索某些关键字,比如以斜杠(/)开头的消息,以指示对bot的命令 当使用某些命令时,我遇到一个问题,即bot似乎卡在循环中,几乎就像for循环的索引在循环中被修改一样。代码包括在下面 如果您需要更多,请询问,如果您发现可能导致问题的原因,请告诉我。我束手无策 只需注意:jQuery被正确注入,我的所有变量都在那里,调试控制台中没有错误,并且在Win
function verifyCommand() {
if (document.getElementsByClassName("message-list-item").length > last_cmd_count && !processing_commands) {
var new_length = $('.message-list .message-list-item').length;
console.log("Begin processing commands... ** SYSTEM LOCK **");
console.log(new_length);
for (var i = last_cmd_count; i < (new_length); i++) {
processing_commands = true;
try {
var callinguser = $('.message-list .message-list-item .header .username .username-text')[i].innerText.replace("Guest_", "");
var messagetext = $('.message-list .message-list-item .message .message-text')[i].innerText
if (callinguser != "USERNAME REMOVED") {
if (messagetext.substr(0, 1) == "/") {
if (strContains(callinguser, "IMVU User")) {
die();
}
processCommand(messagetext.substr(1), callinguser);
} else {
if (messagetext.toLowerCase().indexOf('roomgreet') > -1 || messagetext.toLowerCase().indexOf('room greet') > -1) {
if (detectFlirt()) {
sendMsgRaw('Please do not hit on me, ' + callinguser + '.');
if (!isAdmin(callinguser)) {
logIdiot(callinguser);
}
} else if (strContains(messagetext, 'what is ')) {
sendMsgRaw('Please use /solve or /advsolve for math.');
} else {
if (callinguser != "USERNAME REMOVED") {
ident();
}
}
}
if (strContains(messagetext, 'free') && strContains(messagetext, 'credits') && strContains(messagetext, 'http://')) {
sendMsgFrom("*** SCAM ALERT ***", callinguser);
}
}
}
} catch (ex) {} finally {}
}
processing_commands = false;
last_cmd_count = new_length;
console.log("Finish processing commands... ** SYSTEM FREE **");
if (monitoring) {
verifyUserMessageCount();
}
}
}
函数验证命令(){
if(document.getElementsByClassName(“消息列表项”).length>last\u cmd\u count&&!processing\u命令){
var new_length=$('.message list.message list item').length;
log(“开始处理命令…**系统锁**”);
控制台日志(新的_长度);
对于(变量i=最后一次命令计数;i<(新长度);i++){
处理_命令=真;
试一试{
var callinguser=$('.message list.message list item.header.username.username text')[i].innerText.replace(“Guest\”,“”);
var messagetext=$('.message list.message list item.message.message text')[i].innerText
如果(callinguser!=“用户名已删除”){
if(messagetext.substr(0,1)==“/”){
if(strContains(称为“IMVU用户”)){
模具();
}
processCommand(messagetext.substr(1),callinguser);
}否则{
if(messagetext.toLowerCase().indexOf('roomgreet')>-1 | | messagetext.toLowerCase().indexOf('roomgreet')>-1){
if(detectFlrt()){
sendMsgRaw('请不要打我,'+callinguser+');
如果(!isAdmin(callinguser)){
罗吉迪奥特(卡林格瑟);
}
}else if(strContains(messagetext,'what is')){
sendMsgRaw('请使用/solve或/advsolve进行数学运算');
}否则{
如果(callinguser!=“用户名已删除”){
ident();
}
}
}
if(strContains(messagetext,'free')&&strContains(messagetext,'credits')&&strContains(messagetext,'http://')){
sendMsgFrom(“***诈骗警报***”,callinguser);
}
}
}
}捕获(ex){}最后{}
}
处理_命令=错误;
last_cmd_count=新长度;
log(“完成处理命令…**系统空闲**”);
如果(监测){
verifyUserMessageCount();
}
}
}
IMVU手机短信的HTML可以在上找到,我想你的问题是
if (messagetext.substr(0,1) == "/") {
如果用户在“/”前面有一个空格,那么它将不会解释为命令,因此您需要进行处理
var messagetext = $('.message-list .message-list-item .message .message-text')[i].innerText
删除邮件文本中的所有空白,如下所示
messagetext.text().replace(" ", "");
您还应该有更多的错误捕获
if (messagetext.substr(0,1) == "/") {
尝试将函数更改为使用
each()
循环每个元素,而不是使用已有的循环。处理完一个元素后,向该元素添加一个“processed”类,这样我们以后就不会再查看它们了。这应该比强迫我们的逻辑跟上已经处理的逻辑更稳定
,从页面中插入实际导致问题的html,然后查看问题是否仍然存在
function verifyCommand() {
//fixed some logic in here
if ($(".message-list-item").length > last_cmd_count && !processing_commands) {
processing_commands = true; // you should set this immediately
var new_length = $('.message-list-item').length;
console.log("Begin processing commands... ** SYSTEM LOCK **");
console.log('Last command count: '+ last_cmd_count +', New Length: '+new_length);
var newMessages = $('.message-list-item:not(.processed)'); // get all of the message elements that do not have the class "processed"
// loop through each of the message elements
newMessages.each(function(index, element){
console.log('Processing new element at index '+index );
try {
var callinguser = $(this).find('.username-text').text().replace("Guest_", "");
var messagetext = $(this).find('.message-text').text();
$(this).addClass('processed'); // add processed class to the element so we know not to process it again later
if (callinguser != "RoomGreet") {
if (messagetext.match(/^\//)) {
if (callinguser.match(/IMVU User/)) {
die();
}
processCommand(messagetext.substr(1), callinguser);
}
else {
if (detectFlirt(messagetext)) {
if (!isAdmin(callinguser)) {
sendMsgRaw('Please do not hit on me, ' + callinguser + '.');
logIdiot(callinguser);
}
}
else if (messagetext.match('what is ')) {
sendMsgRaw('Please use /solve or /advsolve for math.');
}
else {
if (callinguser != "Nezzle" && !isAdmin(callinguser)) {
ident();
}
}
if (strContains(messagetext,"imvu") && strContains(messagetext,"credits") && strContains(messagetext,"http://")) {
sendMsgFrom("*** SCAM ALERT ***", callinguser);
}
}
}
}
catch (ex) {
console.log('caught error');
}
finally {
}
});
last_cmd_count = new_length;
console.log("Finish processing commands... ** SYSTEM FREE **");
processing_commands = false;
if (monitoring) {
verifyUserMessageCount();
}
}
}
如果您将for循环更改为(var i=last\u cmd\u count;i
verifyCommand()
本身吗?如果是这样的话,我会从调用第一个函数的任何地方开始。@bleeted0d,我的代码中没有递归。选中的。它仅由setInterval调用(verifyCommand,1000)脚本文件末尾的代码>,该脚本文件位于函数本身之外。不,继续添加var,不敢相信我忘记了,把它留在那里了。这就是为什么你不在深夜编写@vsync,如果你没有什么有用的贡献,请不要评论。我建议在processing\u commands=true代码>。每次调用此行时,查看i
并查看该值是否按预期递增。一旦看到值意外更改,请记下最后一个有效值并重新开始循环。当i
的最后一个有效值出现时,从逻辑上一直观察代码,你应该能够发现哪里开始出错了,那里有一个死亡
(不管是什么)。你确定它不是在死的地方吗?为什么这会导致循环无限继续?在你的if(messagetext.substr(0,1)=“/”{…do stuff if command}else中{…否则如果不是命令做东西,但如果它是一个命令,但格式错误怎么办?程序说我不知道该怎么做,所以我会再做一次,这样您应该有一个类似if(messagetext.indexOf(“/”)>0){;//这是一个我们错过的命令}为什么这会导致循环再次运行?我只需点击else语句并以这种方式处理它,或者抛出一个错误。这不会导致无限循环。这个for循环是错误的,它永远不会退出循环(I=last_cmd_count;I<(new_length);I++){如果您要使用for循环,则此部分i=last_cmd_count需要是一个常量,如for(i=0;将for循环替换为for each循环,了解如何一起执行此操作,尽管此代码编写得很糟糕……我将从草稿开始。问题确实仍然存在。有问题的命令是/commands,用于显示用法