【问题标题】:How an event stream JavaScript reader can trigger page refresh?事件流 JavaScript 阅读器如何触发页面刷新?
【发布时间】:2017-03-21 18:09:41
【问题描述】:

这是我多年来第一次向任何社区发布问题。到目前为止,我一直在使用 PHP/SQL 多年,在此期间我从未需要处理 JavaScript。

所以也许你可以为我提供一些帮助,因为我已经尝试了所有方法,但没有解决这个问题。

下面的脚本目前在 PHP 驱动的网站中正常工作。在事件流中,我发布了 dyntasks.php 从应用引擎更新的文件系统上的文本文件中读取的更新

?><script type="text/javascript">
if(typeof(EventSource)!=="undefined") {
    var eSource = new EventSource("dyntasks.php");
    eSource.onmessage = function(event, previous) { 
        //if ( (previous !== event.data) ) {location.reload(true);};
        document.getElementById("serverData").innerHTML = event.data; 
    };
} else { document.getElementById("serverData").innerHTML="Whoops! Your browser doesn't receive server-sent events."; }
</script><?php

脚本更新页面上的一个块并且它工作正常。

该块以这种形式显示文本:

2017-03-21 16:08:15: task 21624 completed
2017-03-21 16:11:08: task 21627 completed
2017-03-21 16:36:01: task 21629 completed
2017-03-21 17:52:08: task 21635 completed
updating...

现在我需要在完成特定任务 ID 后更新整个页面。 “taskid”已经存储在一个变量中,它也可以在查询字符串中使用。

/index.php?id=taskmanager&fullpage=21624

我尝试了大约 20 个小时来更新 JavaScript 代码,但我无法将其安排为可以触发的方式

location.reload(true)

你能给我一些提示吗?我想我只需要知道如何将 event.data 变量保存到一个全局变量中,以便在函数触发更新之前使用,但我们将不胜感激。

【问题讨论】:

  • 使用window.location.reload();

标签: javascript php loops variables event-stream


【解决方案1】:

一种方法是将事件流从字符串更改为消息对象

而不是发送:

echo "2017-03-21 16:08:15: task 21624 completed";

你可以这样做:

echo json_encode(array(
    "action" => "task completed",
    "task id" => 21624,
    "ts" => "2017-03-21 16:08:15"
));

然后在 JavaScript 中你可以这样做:

eSource.onmessage = function(event) { 
    event = JSON.parse(event);
    if (event.action === "task complete") {
        document.location.href = "/index.php?id=taskmanager&fullpage=" + event["task id"];
    }
};

【讨论】:

  • 你提到的代码部分应该在 dyntasks.php 中替换,对吧?我在想也许我应该改变方法并在任务执行结束时直接发送事件,而不是在磁盘上的日志文件中写入字符串......
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2010-12-30
  • 2011-06-17
  • 2020-03-25
  • 2018-12-14
  • 2014-07-27
  • 1970-01-01
  • 2014-01-27
相关资源
最近更新 更多