【问题标题】:clearInterval() not working correctlyclearInterval() 无法正常工作
【发布时间】:2014-12-27 19:18:39
【问题描述】:

我最近一直在尝试每两秒重复一次 jQuery AJAX 请求。请注意:我已经查看了关于 SO 的其他问题,但其中似乎不适用于我的情况,我还查看了文档。

片段:

else if (text == "load") {
        $(".response").text("working!");

        var traffic = function load() {
            $.ajax({url:"load.php",success:function(result){
                var obj = jQuery.parseJSON(result);
                var ids = obj.map(function(el) {
                    return "<tr><td>" + el.id + "</td><td>" + el.ip + "</td><td>" + el.proxyip + "</td><td>" + el.ping + "</td><td>" + el.time + "</td></tr>";
                });

                $(".response").html("<table><tr><td><strong>ID</strong></td><td><strong>IPs</strong></td><td><strong>Proxy IP</strong></td><td><strong>Ping</strong></td><td><strong>Time</strong></td></tr>" + ids + "</table>");
            }});
        };

        var trafficInterval = setInterval(traffic, 2000);

要取消超时,我检查文本是否不等于“负载”,如果不等于负载,我会取消超时

else {
        $(".response").text("'" + badCommand + "'" +" is not a valid command, type 'help' for a list of commands.");
        clearInterval(trafficInterval);
    }

但是,当我更改文本字段的输入时,表格仍将每两秒加载一次,超时尚未取消,我似乎不明白为什么。

这是为想知道的人提供的全部功能

$("textarea").keyup(function(){
var text = $(this).val();
$(".log").text(text);

// Commands
if (text != "") {
    var badCommand = $("textarea").val();

    if (text == "help") {
        $(".response").html("Commands:<br/><span class='indent'>traffic -url|all</span><span class='indent'>google #search term</span><span class='indent'>youtube #search term</span><span class='indent'>portfolio</span>")
    } else if (text == "traffic") {
        $(".response").html('Live traffic from:<br/><table><tr><td><strong>IP</strong></td><td><strong>Proxy IP</strong></td><td><strong>Ping</strong></td><td><strong>Time</strong></td></tr><?php try { $db = new PDO("mysql:host=$mysql_host;dbname=$mysql_db", $mysql_user, $mysql_pass); $sql = "SELECT * FROM traffic ORDER BY id DESC LIMIT 50"; foreach ($db->query($sql) as $row) { echo "<tr>"; echo "<td class='details'>" . $row["ip"] . "</td>"; echo "<td class='details'>" . $row["proxyip"] . "</td>"; echo "<td class='details'>" . $row["ping"] . "</td>"; echo "<td class='details'>" . $row["time"] . "</td>"; echo "</tr>"; } $db = null; } catch(PDOException $e) { $e->getMessage(); } ?></tr></table>');
    } else if (text == "load") {
        $(".response").text("working!");

        var traffic = function load() {
            $.ajax({url:"load.php",success:function(result){
                var obj = jQuery.parseJSON(result);
                var ids = obj.map(function(el) {
                    return "<tr><td>" + el.id + "</td><td>" + el.ip + "</td><td>" + el.proxyip + "</td><td>" + el.ping + "</td><td>" + el.time + "</td></tr>";
                });

                $(".response").html("<table><tr><td><strong>ID</strong></td><td><strong>IPs</strong></td><td><strong>Proxy IP</strong></td><td><strong>Ping</strong></td><td><strong>Time</strong></td></tr>" + ids + "</table>");
            }});
        };

        var trafficInterval = setInterval(traffic, 2000);

    } else {
        $(".response").text("'" + badCommand + "'" +" is not a valid command, type 'help' for a list of commands.");
        clearInterval(trafficInterval);
    }
}

if (text == "") {
    var noCommand = $("textarea").val();
    $(".response").text(" ");
}

// End Commands

});

仅供参考:

把 clearInterval();在代码停止工作后,
把 clearInterval();在代码什么都不做之前。

clearInterval(trafficInterval);必须工作,因为如果我把它放在第一个函数的末尾,当我输入“load”时什么都不会发生

这也不是计时器,我尝试了它,而是在鼠标移动时自动更新并且发生完全相同的事情......

【问题讨论】:

  • 能否提供完整的 if-else if-else 结构?
  • 我已经更新了代码
  • text == "traffic" 部分是否应该包含 PHP?
  • 是的。我还没有费心将其更新为 JSON。我将删除该功能并进行测试。 - 还是不行。

标签: javascript jquery ajax timer


【解决方案1】:

这是一个范围界定问题。间隔需要超出事件处理程序调用的范围:

var trafficInterval = null;
$("textarea").keyup(function(){
var text = $(this).val();
$(".log").text(text);

// Commands
if (text != "") {
    var badCommand = $("textarea").val();

    if (text == "help") {
        $(".response").html("Commands:<br/><span class='indent'>traffic -url|all</span><span class='indent'>google #search term</span><span class='indent'>youtube #search term</span><span class='indent'>portfolio</span>")
    } else if (text == "traffic") {
        $(".response").html('');
    } else if (text == "load") {
        $(".response").text("working!");

        var traffic = function load() {
            $.ajax({url:"load.php",success:function(result){
                var obj = jQuery.parseJSON(result);
                var ids = obj.map(function(el) {
                    return "<tr><td>" + el.id + "</td><td>" + el.ip + "</td><td>" + el.proxyip + "</td><td>" + el.ping + "</td><td>" + el.time + "</td></tr>";
                });

                $(".response").html("<table><tr><td><strong>ID</strong></td><td><strong>IPs</strong></td><td><strong>Proxy IP</strong></td><td><strong>Ping</strong></td><td><strong>Time</strong></td></tr>" + ids + "</table>");
            }});
        };

        trafficInterval = setInterval(traffic, 2000);

    } else {
        $(".response").text("'" + badCommand + "'" +" is not a valid command, type 'help' for a list of commands.");
        clearInterval(trafficInterval);
    }
}

if (text == "") {
    var noCommand = $("textarea").val();
    $(".response").text(" ");
}

// End Commands
});

参见小提琴@http://jsfiddle.net/sLooj4on/(可以在开发工具中看到轮询失败,当从输入中删除文本时停止)​​

【讨论】:

  • 块语句如 if-else 到 not 引入范围:developer.mozilla.org/en-US/docs/Web/JavaScript/Guide/…
  • @MoMolog - 我不明白?
  • @ConorReid 我指出,在块语句中定义 var 将它们定义在周围函数的范围内,而不是块。所以这个提议应该不会有什么不同。
  • 嗯,好的。好吧,我从来不知道!谢谢 :) - 不幸的是我还有我的问题 :c
  • @ConorReid 顺便说一句,无需定义 badCommand,只需使用文本 :-)
【解决方案2】:

如果不查看其余代码很难判断,但您的 trafficInterval 变量可能超出范围。尝试在 if/else 语句之外进行初始化

【讨论】:

【解决方案3】:

trafficInterval 仅在 if 语句中定义。您试图在错误的范围内清除它。我在这里仍然缺乏一些上下文,但你可以试试这个:

var trafficInterval;
$("textarea").keyup(function() {
      var text = $(this).val();
      $(".log").text(text);

      // Commands
      if (text != "") {
        var badCommand = $("textarea").val();

        if (text == "help") {
          $(".response").html("Commands:<br/><span class='indent'>traffic -url|all</span><span class='indent'>google #search term</span><span class='indent'>youtube #search term</span><span class='indent'>portfolio</span>")
        } else if (text == "traffic") {
          $(".response").html('Live traffic from:<br/><table><tr><td><strong>IP</strong></td><td><strong>Proxy IP</strong></td><td><strong>Ping</strong></td><td><strong>Time</strong></td></tr><?php try { $db = new PDO("mysql:host=$mysql_host;dbname=$mysql_db", $mysql_user, $mysql_pass); $sql = "SELECT * FROM traffic ORDER BY id DESC LIMIT 50"; foreach ($db->query($sql) as $row) { echo "<tr>"; echo "<td class='
            details '>" . $row["ip"] . "</td>"; echo "<td class='
            details '>" . $row["proxyip"] . "</td>"; echo "<td class='
            details '>" . $row["ping"] . "</td>"; echo "<td class='
            details '>" . $row["time"] . "</td>"; echo "</tr>"; } $db = null; } catch(PDOException $e) { $e->getMessage(); } ?></tr></table>');
        } else if (text == "load") {
          $(".response").text("working!");

          var traffic = function load() {
            $.ajax({
              url: "load.php",
              success: function(result) {
                var obj = jQuery.parseJSON(result);
                var ids = obj.map(function(el) {
                  return "<tr><td>" + el.id + "</td><td>" + el.ip + "</td><td>" + el.proxyip + "</td><td>" + el.ping + "</td><td>" + el.time + "</td></tr>";
                });

                $(".response").html("<table><tr><td><strong>ID</strong></td><td><strong>IPs</strong></td><td><strong>Proxy IP</strong></td><td><strong>Ping</strong></td><td><strong>Time</strong></td></tr>" + ids + "</table>");
              }
            });
          };

          trafficInterval = setInterval(traffic, 2000);

        } else {
          $(".response").text("'" + badCommand + "'" + " is not a valid command, type 'help' for a list of commands.");
          clearInterval(trafficInterval);
        }
      }

      if (text == "") {
        var noCommand = $("textarea").val();
        $(".response").text(" ");
      }

      // End Commands

【讨论】:

  • 不知道,同样的错误 - 它似乎不想在输入后取消加载。
  • 您的解决方案有效,但它不是 if 语句的范围,而是事件处理函数的范围是罪魁祸首。
  • 这段代码完全破坏了脚本。复制粘贴后无法在输入框中输入。想要网站链接吗?
【解决方案4】:

移动变量声明

var trafficInterval = null;

在 keyup 事件处理程序之前(将其移动到外部范围)。请参阅此处的工作,精简示例:

http://jsbin.com/yitiquwoce/1/

【讨论】:

  • 不起作用。一样。您的精简版本有效,当编辑以适合脚本时,它没有任何不同。
  • 事实上,你的精简版也不起作用:不知道。 gyazo.com/1208ae319e2e955c5c1cec60f11ad9a6
  • @ConorReid jsbin 示例始终如一地工作。原因:如果将 var 声明移动到处理函数中,则在以下几次调用处理程序时将不会保留其值 - 每次都是一个新变量。通过更改示例中 var 声明的位置来检查它。
  • 它确实不工作,即使没有输入“负载”,您是否也看不到它持续记录“调用流量”? gyazo.com/23e57b65869340ff02e6aab55dc18811
  • @ConorReid 很奇怪。我在您的屏幕截图中看到了它,但在我自己尝试时却没有
猜你喜欢
  • 2016-12-01
  • 1970-01-01
  • 2016-09-01
  • 2012-07-11
  • 2018-04-08
  • 2017-04-20
  • 2018-10-02
  • 2016-09-04
  • 2010-10-06
相关资源
最近更新 更多