Работает везеде с влюченным кешом AJAX - JavaScript jason xhr XMLHttpRequest, кроме iPhone Есть решение

Здравствуйте. Может кто-то сталкивался и сразу может что-то быстро подсказать?

 Суть.

AJAX работает везде с включенным кешом, кроме iPhone браузеров.

 На сайте данные корзины обновляются отлично во всех браузера, за исключением Айфона, что не так куда смотреть, может кто-то сталкивался и сразу знает ответ? Причем ошибок в браузере савафри на макбуке нет и там работает все исправно, конечный вариант написанный на JavaScript.

Вот сам код.

var xhr = new XMLHttpRequest();
		xhr.open('POST', 'https://fvsport.com/minicart/total');
		xhr.setRequestHeader('Cache-Control', 'no-cache');
		xhr.onreadystatechange = function() {
		  if (xhr.readyState != 4) {
		    return;
		  }
		  if (xhr.status == 200) {
		    var result = JSON.parse(xhr.responseText);
		    if (result.data.total_count >= 1) {
		    	document.getElementsByClassName("basket-count")[0].innerText = document.getElementsByClassName("basket-count")[1].innerText = result.data.total_count;
		    	document.getElementsByClassName("cart-total")[0].innerText = document.getElementsByClassName("cart-total")[1].innerText = result.data.total_raw + ' р';
				document.getElementsByClassName("is-active")[0].style.display  = document.getElementsByClassName("is-active")[1].style.display  = 'block';
				document.getElementsByClassName("is-active")[0].style.opacity  = document.getElementsByClassName("is-active")[1].style.opacity  = '1';
		    } else {
				document.getElementsByClassName("is-active")[0].style.display  = document.getElementsByClassName("is-active")[1].style.display  = 'none';
				document.getElementsByClassName("is-active")[0].style.opacity  = document.getElementsByClassName("is-active")[1].style.opacity  = '0';
		    }

		  } else {
		    console.log("The JSON Data was't comeing from cart!");
		  }
		}
		xhr.send();

Пока нашел только такую штуку(https://software.intel.com/en-us/forums/intel-xdk/topic/594542), но попробовать пока не успел, решил написать сюда, может кто-то знает более простой способ, возможно fetch или что-то еще.

Мозила говорит, что действительно бывают проблемы на iOS - https://developer.mozilla.org/en-US/docs/Web/API/XMLHttpRequest/response

Только проблема во всех браузерах на Айфонах, а не тольк на Сафари, поэтому верхний пост с root директорией похож на правду.

Всем спасибо за внимание. 

5 ответов

  • 2

    P.S. Видимо fetch не поддерживает на айфонах header заголовки под кэш. Печально, а мне нужна на стороне клиента именно опция настройки кеша.

    https://developer.mozilla.org/...

  • 2
    Roman Primerov Эксперт Разработчик 8 апреля 2019 00:15 # Решение

    Тему можно закрыть.

     Я разную херню встречал, но такого глюка и подставы еще поискать надо, огромную тучу времени убил, даже fetch зацепить пришлось. На яблочных и Сафари проблема решается так, нужно сделать два запроса, один POST другой GET, еще и с задержкой и тогда все глюки уходят, даже на телефонах. Ну не умеют Apple, нормально поддерживать кеш на уровне разработчиков, к такому выводу я пришел ...

  • 3

    Pragma: no-cache
    Cache-control: no-cache; must-revalidate

    Или

    Pragma: no-cache
    Cache-control: no-store

    • +1

      Спасибо большое, попробуем и такой вариант.

    • +2

      Да, данный способ работает, проверено в консоли Safari последняя версия. Спасибо.

      Решил объединить два способа, чтобы наверняка и железно на все браузеры.


      Цитирую, может кому-то пригодится:

      Using a query string for cache control isn't your best option nowadays for multiple reasons, and (only) a few are mentioned in this answer. He even explains the new standard method of version control. Though if you just want to be able to set your request headers, the right way to do it is:

      xhr.setRequestHeader('cache-control', 'no-cache, must-revalidate, post-check=0, pre-check=0');
      xhr.setRequestHeader('cache-control', 'max-age=0');
      xhr.setRequestHeader('expires', '0');
      xhr.setRequestHeader('expires', 'Tue, 01 Jan 1980 1:00:00 GMT');
      xhr.setRequestHeader('pragma', 'no-cache');

      Hope this helps anyone in the future.


      и второй вариант:

      http.setRequestHeader("Cache-Control", "no-cache, no-store, must-revalidate");

Добавить ответ

Чтобы добавить комментарий, зарегистрируйтесь или войдите