iPad无法使用javascript更新页面(带有Django后端)

时间:2019-03-07 16:57:28

标签: javascript jquery django ipad

我正在页面上编写脚本,以检查页面的特定部分是否应更新(基于从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中缓存。

问题:

  1. 这是一个缓存问题吗?
  2. 如果是,我如何告诉iPad处理它?<​​/ li>
  3. 如果没有,我还要看什么?

编辑:

最终解决方案:iPad读取的时间不正确。我将详细发布答案。

2 个答案:

答案 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上,我用来确定是否应重新加载这些部分的日期是无效的日期类型,而它们在所有情况下都可以正常工作其他。

所以,回答我的问题:

  1. 不适用
  2. 时间格式。

解决方案是将所有.toLocaleString()转换为.toISOString()。由于我不知道的原因,iPad无法读回updateTime,无法将其解析为Date对象,并与代码使用.toLocaleString()的其他时间进行比较(即使所有其他设备可以。)

因此,重申一下,iPad无法解析已放入.toLocaleString()中的Date对象中的文本,但如果文本为ISOString格式则可以。