【问题标题】:If statement in jQuery and HTML?jQuery 和 HTML 中的 if 语句?
【发布时间】:2021-07-16 05:21:31
【问题描述】:

我正在成功运行以下脚本:它每 3 秒更新一次文本

<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.2.0/jquery.min.js"></script>
<script>
$(function() {
  window.setInterval(function() {
    loadNewText()
  }, 3000)

  function loadNewText() {
    $.ajax({
      url: "/update_report",
      type: "POST",
      dataType: "json",
      success: function(data) {
        $(report).replaceWith(data)
      }
    });
  }
});
</script>

我想将 HTML 中的函数更改为仅在 Python 代码中的某些变量发生更改时才运行“loadNewText()”!

我已将变量放入 python 路由中:

@app.route('/console-output')
def console_output():
    fileHandle = open("console_output.txt", "r")
    lineList = fileHandle.readlines()
    fileHandle.close()
    last= lineList[len(lineList)-1]
    with open('console_output.txt', 'r') as r:
        co =r.read()
    return render_template("console-output.html",console_output_msg=console_output_msg, last=last, co=co)

并在 HTML 中编写以下代码:

<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.2.0/jquery.min.js"></script>
<script>
$(function() {

  if (last != console_output_msg) {
    loadNewText();
  }

  function loadNewText() {
    $.ajax({
      url: "/update_text",
      type: "POST",
      dataType: "json",
      success: function(data) {
        $(new_text).replaceWith(data)
      }
    });
  }
});
</script>

此方法无效!我对 Javascript 没有丰富的经验!我不知道我是否没有以正确的方式调用变量(最后一个,console_output_msg)或者我的函数无效!

如果有任何方法可以纠正它或任何其他建议在 python 代码发生更改时调用“loadNewText()”!

谢谢!

【问题讨论】:

  • 您无法在客户端访问服务器变量。而且你已经摆脱了setInterval,所以它不会重复运行。
  • 你想要的在逻辑上是不可能的。在您进行 AJAX 调用之前,Python 代码不会运行。所以变量在你调用它之前不会得到一个值,只有这样你才能测试它是否从之前的调用中改变了。
  • @Barmar 是否可以使用setInterval 来比较来自 Python 代码的两个变量并在特定条件下运行函数?
  • 您需要进行 AJAX 调用才能将 Python 中的变量导入 JS。
  • @Barmar 您能否提供一个示例或链接,以便我可以找到有关该解决方案的更多信息?

标签: javascript python html jquery flask


【解决方案1】:

您无法在客户端访问服务器变量。

您可以将先前的输出保存在 JavaScript 变量中,并且仅在 DOM 发生更改时才更新它。需要在loadNewText()函数收到响应后,将if语句放入函数中,以便比较。

这不会跳过 AJAX 调用,但会避免在没有任何更改时刷新页面。

$(function() {
  let last_output;
  window.setInterval(loadNewText, 3000)

  function loadNewText() {
    $.ajax({
      url: "/update_report",
      type: "POST",
      dataType: "json",
      success: function(data) {
        if (data != last_output) {
          $(report).replaceWith(data);
          last_output = data;
        }
      }
    });
  }
});

【讨论】:

  • 感谢您的解释,但我的问题是我想避免每 3 秒调用一次函数!我的意思是避免每 3 秒访问一次 update_report 路由!我正在寻找一种解决方案,仅当某个文本文件发生更改时才更新,该文本文件是我在 Python 中的输入!谢谢
  • 必须调用服务器,客户端无法知道服务器上的文件是否发生了变化。
  • 打个比方:你只想在她生病时给她打电话。但是如果不打电话问她,你就无法知道她是否生病了。
  • 好吧!谢谢你的耐心 !我会寻找有关它的更多信息!
【解决方案2】:

当 Python 发生变化时,有 2 种流行的方式来更新文本:

  • 长轮询
    使用setInterval()函数触发ajax调用服务端检查是否有变化。

  • WebSocket
    在服务器和浏览器之间实现 WebSocket 连接。接收服务器发来的消息。

    在 Python 中实现 WebSocket 的链接。
    https://websockets.readthedocs.io/en/8.1/intro.html

【讨论】:

  • 他在问如何实现长轮询,他只是没有这么称呼它。
  • @Barmar 是的,我想这是他案例中最简单的方法。因为他想消除调用loadNewText()函数,我让他知道还有另一种选择,以防他不知道。
猜你喜欢
  • 1970-01-01
  • 2017-04-23
  • 2016-07-21
  • 1970-01-01
  • 2012-03-15
  • 2013-06-20
  • 2010-11-21
  • 2016-05-04
相关资源
最近更新 更多