Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/jquery/72.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
JavaScript循环不';t出口_Javascript_Jquery_Loops_Browser_Infinite - Fatal编程技术网

JavaScript循环不';t出口

JavaScript循环不';t出口,javascript,jquery,loops,browser,infinite,Javascript,Jquery,Loops,Browser,Infinite,我已经尝试了我能想到的一切 我正在为IMVU构建一种聊天机器人,在IMVU移动网站上使用注入的JavaScript。我有一个循环来抓取接收到的消息,并搜索某些关键字,比如以斜杠(/)开头的消息,以指示对bot的命令 当使用某些命令时,我遇到一个问题,即bot似乎卡在循环中,几乎就像for循环的索引在循环中被修改一样。代码包括在下面 如果您需要更多,请询问,如果您发现可能导致问题的原因,请告诉我。我束手无策 只需注意:jQuery被正确注入,我的所有变量都在那里,调试控制台中没有错误,并且在Win

我已经尝试了我能想到的一切

我正在为IMVU构建一种聊天机器人,在IMVU移动网站上使用注入的JavaScript。我有一个循环来抓取接收到的消息,并搜索某些关键字,比如以斜杠(/)开头的消息,以指示对bot的命令

当使用某些命令时,我遇到一个问题,即bot似乎卡在循环中,几乎就像for循环的索引在循环中被修改一样。代码包括在下面

如果您需要更多,请询问,如果您发现可能导致问题的原因,请告诉我。我束手无策

只需注意:jQuery被正确注入,我的所有变量都在那里,调试控制台中没有错误,并且在Windows7x64上的Chrome41.0.2272.101m下运行

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,用于显示用法