iPad не обновляет страницу с помощью JavaScript (с бэкэндом Django) - PullRequest
2 голосов
/ 07 марта 2019

Я пишу скрипт на странице, который проверяет, должны ли обновляться определенные части страницы (на основе информации на странице, переданной из представления Django).Обновление работает в браузерах на компьютерах / ноутбуках, но не работает в браузерах на iPad (и, исходя из моего чтения, я ожидаю iPhone).Это даже работает на моем телефоне Pixel.Итак, похоже, что это проблема, ограниченная iPad (и телефонами?).

В данный момент я работаю на dev-сервере Django, если это имеет какое-либо отношение к проблеме.Из того, что я вижу на терминале с замазкой, iPad делает запрос (каждые 2 секунды происходит GET), но я не знаю, что происходит на iPad, что ничего не обновляется.Как Safari, так и Chrome демонстрируют одинаковое проблемное поведение.В прошлый раз, когда я смотрел на эту проблему (с немного другим кодом), это не было проблемой для Macbooks, только для iPad.

--- EDIT ---

Я сейчас работаю напроизводственный сервер.Все еще есть та же проблема.Просматривая журналы доступа, я вижу запросы, поступающие с 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. Если да, то как я могу сказать iPads, что справиться?
  3. Если нет, то на что еще мне обратить внимание?

РЕДАКТИРОВАТЬ:

Окончательное решение: iPad неправильно считывал время.Я выложу ответ, который будет подробно описан.

Ответы [ 2 ]

0 голосов
/ 14 марта 2019

Ладно, разберись со мной, Бэтмен: Почему iPad не обрабатывает строки даты так же, как все остальное? После расспросов обо всем (включая мое здравомыслие), проблема заключалась в том, что на iPad , даты, которые я использовал, чтобы определить, должны ли разделы быть перезагружены, были недействительными типами дат, в то время как они отлично работали во всем остальном .

Итак, чтобы ответить на мои вопросы:

  1. Нет
  2. N / A * * 1 010
  3. Форматирование времени.

Решением было превратить все .toLocaleString () в .toISOString (). По незаметным для меня причинам iPad не смог прочитать updateTime обратно, проанализировать его в объект Date и сравнить его с другими временами, когда код использовал .toLocaleString () (хотя все остальные устройства могут.)

Итак, повторимся, iPad не может анализировать текст из объекта Date, который был помещен в .toLocaleString (), но может, если текст имеет формат ISOString.

0 голосов
/ 12 марта 2019

Здесь вы можете получить условие состязания: если код JavaScript выполняется до полной визуализации страницы, первый вызов update_times () может пропустить $ ('# last_times'), а setTimeout () никогда не сработает.

Я предлагаю отложить вызов следующим образом:

$(document).ready(function() {
    update_times();
});

Это гарантирует, что update_times () запускается, когда DOM страницы готов для выполнения кода JavaScript.

И, возможно, попробуйтезаменить load () на ajax (), чтобы iPad был доволен, как предложила Джейн в предыдущем комментарии;поэтому используйте:

$.ajax( {
    url: url_actions,
    success: function(data) {
        $('#action_log').html(data);
    }
});

вместо:

$('#action_log').load(url_actions)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...