0

这是多年来我第一次向任何社区发布问题。到目前为止,我一直在使用 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(真)

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

4

1 回答 1

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"];
    }
};
于 2017-03-21T18:13:40.330 回答