这是多年来我第一次向任何社区发布问题。到目前为止,我已经使用 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
脚本更新了页面上的一个 block 并且它工作正常。
该 block 以这种形式显示文本:
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 变量保存到全局变量中,以便在函数触发更新之前使用,但任何进一步的建议将不胜感激。
最佳答案
实现此目的的一种方法是将事件流从字符串更改为消息对象。
而不是发送:
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"];
}
};
关于javascript - 事件流 JavaScript 阅读器如何触发页面刷新?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42935027/