我正在页面上编写脚本,以检查页面的特定部分是否应更新(基于从Django视图传入的页面信息)。更新适用于计算机/笔记本电脑上的浏览器,但不适用于iPads上的浏览器(根据我的阅读,我希望使用iPhone)。它甚至可以在我的Pixel手机上使用。因此,看来这是仅限于iPad(和手机?)的问题。
目前,我正在Django的dev服务器上运行,如果这与问题有关。从我在腻子终端上看到的内容来看,iPad正在发出请求(每2秒发送一次GET),但我不知道iPad上正在发生什么,没有任何更新。 Safari和Chrome都表现出相同的问题行为。上次我查看此问题(代码稍有不同)时,对于Macbook而言,对iPad而言,这并不是一个问题。
---编辑---
我现在正在生产服务器上运行。仍然有同样的问题。查看访问日志,我可以看到来自iPad的请求,而对显示的页面没有任何更改。
这是有问题的代码:
HTML
{% block page_updates %}
<div class="container-fluid" id="last_times">
<p style="display:none">Last action taken: <span id="actionTime">{{ update_times.action.isoformat }}</span></p>
<p style="display:none">Last chat made: <span id="chatTime">{{ update_times.chat.isoformat }}</span></p>
</div>
<p style="display:none">Page last updated: <span id="updateTime"></span>
{% endblock %}
JavaScript
<script>
function refresh_action_log(){
var url_actions = document.URL + ' #action_log';
var url_destiny = document.URL + ' #destiny_box';
$('#action_log').load(url_actions);
$('#destiny_box').load(url_destiny);
}
function refresh_chat_log() {
var url_chat_log = document.URL + ' #chat_log';
$('#chat_log').load(url_chat_log);
}
function check_and_update() {
var pageUpdate = new Date(document.getElementById('updateTime').innerHTML);
var actionUpdate = new Date($("#actionTime").text());
var chatUpdate = new Date($("#chatTime").text());
var now = new Date();
if (actionUpdate > pageUpdate && chatUpdate > pageUpdate) {
refresh_action_log();
refresh_chat_log();
// changing all of the .toLocaleString() to .toISOString() was the solution
document.getElementById('updateTime').innerHTML = now.toLocaleString();
} else if (actionUpdate > pageUpdate) {
refresh_action_log();
document.getElementById('updateTime').innerHTML = now.toLocaleString();
} else if (chatUpdate > pageUpdate) {
refresh_chat_log();
document.getElementById('updateTime').innerHTML = now.toLocaleString();
};
}
function update_times() {
var url_last_times = document.URL + ' #last_times';
$('#last_times').load(url_last_times, function () {
// When it loads, schedule the next request for 2s later
setTimeout(update_times, 2000)
});
check_and_update();
};
$(function () {
update_times();
var dt = new Date(); // This line and the next were sitting in another function
document.getElementById('updateTime').innerHTML = dt.toLocaleString();
})
</script>
基于其他一些堆栈溢出问题,我直觉这个问题是在iPad中缓存。
问题:
编辑:
最终解决方案:iPad读取的时间不正确。我将详细发布答案。
答案 0 :(得分:0)
在这里您可能会遇到争用条件:如果JavaScript代码在完全呈现页面之前执行了,则对update_times()的首次调用可能会错过$('#last_times'),并且setTimeout()永远不会被触发。
我建议按如下方式推迟通话:
$(document).ready(function() {
update_times();
});
这确保一旦页面DOM准备好执行JavaScript代码,update_times()就会运行。
并可能尝试用ajax()替换load()来使iPad保持快乐,正如Jane在先前的评论中所建议的那样; 因此使用:
$.ajax( {
url: url_actions,
success: function(data) {
$('#action_log').html(data);
}
});
代替:
$('#action_log').load(url_actions)
答案 1 :(得分:0)
好的,这让我感到困惑,蝙蝠侠:为什么iPad不像其他所有东西一样处理日期字符串?在质疑了一切(包括我的理智)之后,问题是,在iPad上,我用来确定是否应重新加载这些部分的日期是无效的日期类型,而它们在所有情况下都可以正常工作其他。
所以,回答我的问题:
解决方案是将所有.toLocaleString()转换为.toISOString()。由于我不知道的原因,iPad无法读回updateTime,无法将其解析为Date对象,并与代码使用.toLocaleString()的其他时间进行比较(即使所有其他设备可以。)
因此,重申一下,iPad无法解析已放入.toLocaleString()中的Date对象中的文本,但如果文本为ISOString格式则可以。