Использование кэширования в Firefox 1.5

  • Revision slug: en/Using_Firefox_1.5_caching
  • Revision title: Использование кэширования в Firefox 1.5
  • Revision id: 351275
  • Created:
  • Creator: torbasow
  • Is current revision? Нет
  • комментировать

Revision Content

 

Введение

Firefox 1.5 использует кэширование целых Web-страниц, включая их JavaScript-состояния, в рамках сессии браузера. Переходы по посещённым страницам вперёд-назад не требуют загрузки страниц, а JavaScript-состояния сохраняются. Эта функция, обозначаемая иногда как bfcache (Back-Forward Cache), делает навигацию по страницам очень быстрой. Такое кэшированное состояние сохраняется, пока пользователь не закроет браузер.

Есть случаи, в которых Firefox не кэширует страницы. Вот некоторые обычные программные причины того, что страница не кэширована:

  • страница использует обработчик unload или beforeunload;
  • страница устанавливает заголовок «cache-control: no-store».
  • доступ к сайту происходит по протоколу HTTPS, а страница устанавливает по меньшей мере один из следующих заголовков:
    • «Cache-Control: no-cache»
    • «Pragma: no-cache»
    • с заголовком «Expires: 0» or «Expires» со значением даты, лежащим в прошлом относительно значению заголовка «Date» (если только не указан также заголовок «Cache-Control: max-age=»);
  • страница не полностью загрузилась, когда пользователь ушёл с неё, или имеет прерванные сетевые запросы по другим причинам (например, XMLHttpRequest));
  • страница имеет работающие IndexedDB-транзакции;
  • страница верхнего уровня содержит фреймы (например, {{ HTMLElement("iframe") }}), которые не кэшируются по одной из перечисленных здесь причин;
  • страница находится в фрейме и пользователь загружает новую страницу в этот фрейм (в этом случае, когда пользователь уходит со с этой страницы, последнее загруженное в фреймы содержимое есть то, что закэшировано).

Эта новая функция кэширования меняет поведение загрузки страницы, так что Web-авторы могут захотеть:

  • узнать, когда на страницу происходит переход (когда она загружается из пользовательского кэша);
  • определить поведение страницы, когда пользователь уходит со страницы (позволяя всё же странице быть закэшированной).

Это позволяют сделать два новых события браузера.

Новые события браузера

Если вы используете эти новые события, ваши страницы продолжат правильно отображаться в других браузерах (мы протестировали старые версии Firefox, Internet Explorer, Opera и Safari), а при загрузке в Firefox 1.5 добавится новая функциональность кэширования.

Примечание: по состоянию на октябрь 2009 года разработческие версии Safari добавили поддержку этих новых событий (см. webkit-баг).

Стандартное поведение для Web-страниц следующее:

  1. Пользователь переходит на страницу.
  2. По мере загрузки страницы выполняются инлайновые скрипты.
  3. Как только страница загрузилась, срабатывает обработчик onload.

Некоторые страницы включают четвёртый шаг. Если страница использует обработчик unload или beforeunload handler, он срабатывает прежде чем пользователь уходит со страницы. Если присутствует обработчик unload, эта страница не будет кэширована.

Когда пользователь переходит на кэшированную страницу, инлайновые скрипты и обработчик onload не запускаются (шаги 2 и 3), так как в большинстве случаев эффекты этих скриптов были сохранены.

Если страница содержит скрипты или иное поведение, запускаемое в течение загрузки, которое вы хотите продолжить выполнять каждый раз, когда пользователь заходит на страницу, или если вы хотите знать, когда пользователь заходит на кэшированную страницу, используйте новое событие pageshow.

Если у вас есть поведение, запускаемое, когда пользователь уходит со страницы, но вы хотите воспользоваться новой функциональностью кэширования, и поэтому не хотите использовать обработчик unload, используйте новое событие pagehide.

Событие pageshow

Это событие работает так же, как событие load, но срабатывает каждый раз при загрузке страницы (в то время как событие load в Firefox 1.5 не срабатывает, когда страница загружается из кэша). При первой загрузке страницы событие pageshow срабатывает сразу после события load. Событие pageshow использует булевское свойство persisted, которое выставляется в false при начальной загрузке. Оно выставляется в true, если это не начальная загрузка (то есть когда страница уже кэширована).

Выполняйте любой JavaScript-код, который должен отработать при каждой загрузке страницы, при срабатывании событий pageshow.

Вызывая JavaScript-функции в обработчике события pageshow, вы можете обеспечить их вызов при загрузке страницы в бразерад, отличных от Firefox 1.5, вызывая этот обработчик в обработчике события load, как показано в примере ниже.

Событие pagehide

Если вы хотите определить поведение, которое происходит, когда пользователь уходит со страницы, но не хотите использовать событие unload (что воспрепятствовало бы кэшированию страницы), вы можете использовать новое событие pagehide. Как и pageshow, событие pagehide использует булевское свойство persisted. Оно выставляется в false, если страница не кэширована в браузере, а в true,— если кэширована. Когда это свойство выставлено в false, обработчик unload, если он есть, вызывается сразу после события pagehide.

Firefox 1.5 пытается имитировать события загрузки в том же порядке, в каком они срабатывают при начальной загрузке страницы. Фреймы обрабатываются таким же образом, что и документ верхнего уровня. Если страница содержит фреймы, то при загрузке кэшированной страницы:

  • События pageshow из каждого фрейма срабатывают перед событием pageshow в главном документе.
  • Когда пользователь уходит с кэшированной страницы, событие pagehide из каждого фрейма срабатывает перед событием pagehide в главном документе.
  • Для навигации, происходящей внутри отдельного фрейма, события срабатывают только в затронутом фрейме.

Кэширование страницы несмотря на обработчики unload и beforeunload

Если вы хотите использовать события unload или beforeunload, сохранив кэширование страницы, вы можете просто удалить эти события в обработчике события и восстановить их в обработчике pageshow, если возвращаетесь на эту страницу:

window.addEventListener('pageshow', PageShowHandler, false);
window.addEventListener('unload', UnloadHandler, false);

function PageShowHandler() {
	window.addEventListener('unload', UnloadHandler, false);
}

function UnloadHandler() {
	window.removeEventListener('unload', UnloadHandler, false);
}

Пример кода

Приведённый ниже пример реализует страницу, которая использует обработчики load и pageshow. Поведение этой страницы следующее:

  • В браузерах, отличных от Firefox 1.5, при каждой загрузке страницы происходит следующее: событие load вызывает функцию onLoad, которая вызывает функцию onPageShow (а также дополнительную функцию).
  • В Firefox 1.5 при первой загрузке страницы событие load работает так же, как и в других браузерах. Кроме того, срабатывает событие pageshow, и, так как persisted установлено в false, не предпринимается никаких дополнительных действий.
  • В Firefox 1.5 при загрузке страницы из кэша срабатывает только событие pageshow. Так как persisted установлено в true, вызывается только JavaScript-код в функции onPageShow.

В этом примере:

  • Страница вычисляет и обображает текущие дату и время каждый раз при загрузке. Это вычисление включает секунды и миллисекунды, так что вы легко можете протестировать функциональность.
  • Курсор помещается в поле Name при первой загрузке страницы. В Firefox 1.5 при возвращении на страницу курсор остаётся в том поле, где он был, когда пользователь ушёл со страницы. В других браузерах курсор опять помещается в поле Name.
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
   "http://www.w3.org/TR/html4/loose.dtd">
<HTML>
<head>
<title>Order query : Firefox 1.5 Example</title>
<style type="text/css">
body, p {
	font-family: Verdana, sans-serif;
	font-size: 12px;
   	}
</style>
<script type="text/javascript">
function onLoad() {
	loadOnlyFirst();
	onPageShow();
}

function onPageShow() {
//вычисление текущего времени
	var currentTime= new Date();
	var year=currentTime.getFullYear();
	var month=currentTime.getMonth()+1;
	var day=currentTime.getDate();
	var hour=currentTime.getHours();
	var min=currentTime.getMinutes();
	var sec=currentTime.getSeconds();
	var mil=currentTime.getMilliseconds();
	var displayTime = (month + "/" + day + "/" + year + " " + 
		hour + ":" + min + ":" + sec + ":" + mil);
	document.getElementById("timefield").value=displayTime;	
}

function loadOnlyFirst() {
	document.zipForm.name.focus();
}
</script>
</head>
<body onload="onLoad();" onpageshow="if (event.persisted) onPageShow();"> 
<h2>Order query</h2>

<form name="zipForm" action="http://www.example.com/formresult.html" method="get">
<label for="timefield">Date and time:</label>
<input type="text" id="timefield"><br>
<label for="name">Name:</label>
<input type="text" id="name"><br>
<label for="address">Email address:</label>
<input type="text" id="address"><br>
<label for="order">Order number:</label>
<input type="text" id="order"><br>
<input type="submit" name="submit" value="Submit Query"> 
</form>
</body>
</html>

Напротив, если приведённая выше страница не слушает событие pageshow и выполняет все вычисления в обработчике события load (если код написан так, как показано в примере ниже), как положение курсора, так и дата/время в Firefox 1.5 будут кэшированы, когда пользователь when the user navigated away from the page. When the user returned to the page, the cached date/time would display.

<script>
function onLoad() {
	loadOnlyFirst();

//calculate current time
	var currentTime= new Date();
	var year = currentTime.getFullYear();
	var month = currentTime.getMonth()+1;
	var day = currentTime.getDate();
	var hour=currentTime.getHours();
	var min=currentTime.getMinutes();
	var sec=currentTime.getSeconds();
	var mil=currentTime.getMilliseconds();
	var displayTime = (month + "/" + day + "/" + year + " " + 
		hour + ":" + min + ":" + sec + ":" + mil);
	document.getElementById("timefield").value=displayTime;
}

function loadOnlyFirst() {
	document.zipForm.name.focus();
}
</script>
</head>

<body onload="onLoad();">

Developing Firefox extensions

Firefox 1.5 extensions need to allow for this caching functionality. If you are developing a Firefox extension that you want to be compatible with both 1.5 and earlier versions, make sure that it listens for the load event for triggers that can be cached and listens for the pageshow event for triggers that shouldn’t be cached.

For instance, the Google Toolbar for Firefox should listen for the load event for the autolink function and to the pageshow event for the PageRank function in order to be compatible with both 1.5 and earlier versions.

{{ languages( { "it": "it/Usare_il_caching_di_Firefox_1.5", "de": "de/Benutzen_des_Zwischenspeichers_in_Firefox_1.5_(caching)", "fr": "fr/Utilisation_du_cache_de_Firefox_1.5", "ja": "ja/Using_Firefox_1.5_caching" } ) }}

Revision Source

<p>&nbsp;</p>
<h3 id="Introduction" name="Introduction">Введение</h3>
<p><a href="/en/Firefox_1.5_for_developers" title="en/Firefox_1.5_for_developers">Firefox 1.5</a> использует кэширование целых Web-страниц, включая их JavaScript-состояния, в рамках сессии браузера. Переходы по посещённым страницам вперёд-назад не требуют загрузки страниц, а JavaScript-состояния сохраняются. Эта функция, обозначаемая иногда как <strong>bfcache</strong> (Back-Forward Cache), делает навигацию по страницам очень быстрой. Такое кэшированное состояние сохраняется, пока пользователь не закроет браузер.</p>
<p>Есть случаи, в которых Firefox не кэширует страницы. Вот некоторые обычные программные причины того, что страница не кэширована:</p>
<ul>
  <li>страница использует обработчик <code>unload</code> или <code>beforeunload</code>;</li>
  <li>страница устанавливает заголовок «cache-control: no-store».</li>
  <li>доступ к сайту происходит по протоколу HTTPS, а страница устанавливает по меньшей мере один из следующих заголовков:
    <ul>
      <li>«Cache-Control: no-cache»</li>
      <li>«Pragma: no-cache»</li>
      <li>с заголовком «Expires: 0» or «Expires» со значением даты, лежащим в прошлом относительно значению заголовка «Date» (если только не указан также заголовок «Cache-Control: max-age=»);</li>
    </ul>
  </li>
  <li>страница не полностью загрузилась, когда пользователь ушёл с неё, или имеет прерванные сетевые запросы по другим причинам (например, <code>XMLHttpRequest</code>));</li>
  <li>страница имеет работающие IndexedDB-транзакции;</li>
  <li>страница верхнего уровня содержит фреймы (например, {{ HTMLElement("iframe") }}), которые не кэшируются по одной из перечисленных здесь причин;</li>
  <li>страница находится в фрейме и пользователь загружает новую страницу в этот фрейм (в этом случае, когда пользователь уходит со с этой страницы, последнее загруженное в фреймы содержимое есть то, что закэшировано).</li>
</ul>
<p>Эта новая функция кэширования меняет поведение загрузки страницы, так что Web-авторы могут захотеть:</p>
<ul>
  <li>узнать, когда на страницу происходит переход (когда она загружается из пользовательского кэша);</li>
  <li>определить поведение страницы, когда пользователь уходит со страницы (позволяя всё же странице быть закэшированной).</li>
</ul>
<p>Это позволяют сделать два новых события браузера.</p>
<h3 id="New_browser_events" name="New_browser_events">Новые события браузера</h3>
<p>Если вы используете эти новые события, ваши страницы продолжат правильно отображаться в других браузерах (мы протестировали старые версии Firefox, Internet Explorer, Opera и Safari), а при загрузке в Firefox 1.5 добавится новая функциональность кэширования.</p>
<p>Примечание: по состоянию на октябрь 2009 года разработческие версии Safari добавили поддержку этих новых событий (см. <a class="link-https" href="https://bugs.webkit.org/show_bug.cgi?id=28758" title="https://bugs.webkit.org/show_bug.cgi?id=28758">webkit-баг</a>).</p>
<p>Стандартное поведение для Web-страниц следующее:</p>
<ol>
  <li>Пользователь переходит на страницу.</li>
  <li>По мере загрузки страницы выполняются инлайновые скрипты.</li>
  <li>Как только страница загрузилась, срабатывает обработчик <code>onload</code>.</li>
</ol>
<p>Некоторые страницы включают четвёртый шаг. Если страница использует обработчик <code>unload</code> или <code>beforeunload</code> handler, он срабатывает прежде чем пользователь уходит со страницы. Если присутствует обработчик <code>unload</code>, эта страница не будет кэширована.</p>
<p>Когда пользователь переходит на кэшированную страницу, инлайновые скрипты и обработчик <code>onload</code> не запускаются (шаги 2 и 3), так как в большинстве случаев эффекты этих скриптов были сохранены.</p>
<p>Если страница содержит скрипты или иное поведение, запускаемое в течение загрузки, которое вы хотите продолжить выполнять каждый раз, когда пользователь заходит на страницу, или если вы хотите знать, когда пользователь заходит на кэшированную страницу, используйте новое событие <code>pageshow</code>.</p>
<p>Если у вас есть поведение, запускаемое, когда пользователь уходит со страницы, но вы хотите воспользоваться новой функциональностью кэширования, и поэтому не хотите использовать обработчик unload, используйте новое событие <code>pagehide</code>.</p>
<h4 id="pageshow_event" name="pageshow_event">Событие pageshow</h4>
<p>Это событие работает так же, как событие <code>load</code>, но срабатывает каждый раз при загрузке страницы (в то время как событие <code>load</code> в Firefox 1.5 не срабатывает, когда страница загружается из кэша). При первой загрузке страницы событие <code>pageshow</code> срабатывает сразу после события <code>load</code>. Событие <code>pageshow</code> использует булевское свойство <code>persisted</code>, которое выставляется в <code>false</code> при начальной загрузке. Оно выставляется в <code>true</code>, если это не начальная загрузка (то есть когда страница уже кэширована).</p>
<p>Выполняйте любой JavaScript-код, который должен отработать при каждой загрузке страницы, при срабатывании событий <code>pageshow</code>.</p>
<p>Вызывая JavaScript-функции в обработчике события <code>pageshow</code>, вы можете обеспечить их вызов при загрузке страницы в бразерад, отличных от Firefox 1.5, вызывая этот обработчик в обработчике события <code>load</code>, как показано в примере ниже.</p>
<h4 id="pagehide_event" name="pagehide_event">Событие pagehide</h4>
<p>Если вы хотите определить поведение, которое происходит, когда пользователь уходит со страницы, но не хотите использовать событие <code>unload</code> (что воспрепятствовало бы кэшированию страницы), вы можете использовать новое событие <code>pagehide</code>. Как и <code>pageshow</code>, событие <code>pagehide</code> использует булевское свойство <code>persisted</code>. Оно выставляется в <code>false</code>, если страница не кэширована в браузере, а в <code>true</code>,— если кэширована. Когда это свойство выставлено в <code>false</code>, обработчик <code>unload</code>, если он есть, вызывается сразу после события <code>pagehide</code>.</p>
<p>Firefox 1.5 пытается имитировать события загрузки в том же порядке, в каком они срабатывают при начальной загрузке страницы. Фреймы обрабатываются таким же образом, что и документ верхнего уровня. Если страница содержит фреймы, то при загрузке кэшированной страницы:</p>
<ul>
  <li>События <code>pageshow</code> из каждого фрейма срабатывают перед событием <code>pageshow</code> в главном документе.</li>
  <li>Когда пользователь уходит с кэшированной страницы, событие <code>pagehide</code> из каждого фрейма срабатывает перед событием <code>pagehide</code> в главном документе.</li>
  <li>Для навигации, происходящей внутри отдельного фрейма, события срабатывают только в затронутом фрейме.</li>
</ul>
<h4 id="pagehide_event" name="pagehide_event">Кэширование страницы несмотря на обработчики <code>unload</code> и <code>beforeunload</code></h4>
<p>Если вы хотите использовать события <code>unload</code> или <code>beforeunload</code>, сохранив кэширование страницы, вы можете просто удалить эти события в обработчике события и восстановить их в обработчике <code>pageshow</code>, если возвращаетесь на эту страницу:</p>
<pre>
window.addEventListener('pageshow', PageShowHandler, false);
window.addEventListener('unload', UnloadHandler, false);

function PageShowHandler() {
	window.addEventListener('unload', UnloadHandler, false);
}

function UnloadHandler() {
	window.removeEventListener('unload', UnloadHandler, false);
}
</pre>
<h3 id=".D0.9F.D1.80.D0.B8.D0.BC.D0.B5.D1.80_.D0.BA.D0.BE.D0.B4.D0.B0">Пример кода</h3>
<p>Приведённый ниже пример реализует страницу, которая использует обработчики <code>load</code> и <code>pageshow</code>. Поведение этой страницы следующее:</p>
<ul>
  <li>В браузерах, отличных от Firefox 1.5, при каждой загрузке страницы происходит следующее: событие <code>load</code> вызывает функцию <code>onLoad</code>, которая вызывает функцию <code>onPageShow</code> (а также дополнительную функцию).</li>
</ul>
<ul>
  <li>В Firefox 1.5 при первой загрузке страницы событие <code>load</code> работает так же, как и в других браузерах. Кроме того, срабатывает событие <code>pageshow</code>, и, так как <code>persisted</code> установлено в <code>false</code>, не предпринимается никаких дополнительных действий.</li>
</ul>
<ul>
  <li>В Firefox 1.5 при загрузке страницы из кэша срабатывает только событие <code>pageshow</code>. Так как<code> persisted</code> установлено в <code>true</code>, вызывается только JavaScript-код в функции <code>onPageShow</code>.</li>
</ul>
<p>В этом примере:</p>
<ul>
  <li>Страница вычисляет и обображает текущие дату и время каждый раз при загрузке. Это вычисление включает секунды и миллисекунды, так что вы легко можете протестировать функциональность.</li>
  <li>Курсор помещается в поле Name при первой загрузке страницы. В Firefox 1.5 при возвращении на страницу курсор остаётся в том поле, где он был, когда пользователь ушёл со страницы. В других браузерах курсор опять помещается в поле Name.</li>
</ul>
<pre>
&lt;!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
   "http://www.w3.org/TR/html4/loose.dtd"&gt;
&lt;HTML&gt;
&lt;head&gt;
&lt;title&gt;Order query&nbsp;: Firefox 1.5 Example&lt;/title&gt;
&lt;style type="text/css"&gt;
body, p {
	font-family: Verdana, sans-serif;
	font-size: 12px;
   	}
&lt;/style&gt;
&lt;script type="text/javascript"&gt;
function onLoad() {
	loadOnlyFirst();
	onPageShow();
}

function onPageShow() {
//вычисление текущего времени
	var currentTime= new Date();
	var year=currentTime.getFullYear();
	var month=currentTime.getMonth()+1;
	var day=currentTime.getDate();
	var hour=currentTime.getHours();
	var min=currentTime.getMinutes();
	var sec=currentTime.getSeconds();
	var mil=currentTime.getMilliseconds();
	var displayTime = (month + "/" + day + "/" + year + " " + 
		hour + ":" + min + ":" + sec + ":" + mil);
	document.getElementById("timefield").value=displayTime;	
}

function loadOnlyFirst() {
	document.zipForm.name.focus();
}
&lt;/script&gt;
&lt;/head&gt;
&lt;body onload="onLoad();" onpageshow="if (event.persisted) onPageShow();"&gt; 
&lt;h2&gt;Order query&lt;/h2&gt;

&lt;form name="zipForm" action="http://www.example.com/formresult.html" method="get"&gt;
&lt;label for="timefield"&gt;Date and time:&lt;/label&gt;
&lt;input type="text" id="timefield"&gt;&lt;br&gt;
&lt;label for="name"&gt;Name:&lt;/label&gt;
&lt;input type="text" id="name"&gt;&lt;br&gt;
&lt;label for="address"&gt;Email address:&lt;/label&gt;
&lt;input type="text" id="address"&gt;&lt;br&gt;
&lt;label for="order"&gt;Order number:&lt;/label&gt;
&lt;input type="text" id="order"&gt;&lt;br&gt;
&lt;input type="submit" name="submit" value="Submit Query"&gt; 
&lt;/form&gt;
&lt;/body&gt;
&lt;/html&gt;
</pre>
<p>Напротив, если приведённая выше страница не слушает событие <code>pageshow</code> и выполняет все вычисления в обработчике события <code>load</code> (если код написан так, как показано в примере ниже), как положение курсора, так и дата/время в Firefox 1.5 будут кэшированы, когда пользователь when the user navigated away from the page. When the user returned to the page, the cached date/time would display.</p>
<pre>
&lt;script&gt;
function onLoad() {
	loadOnlyFirst();

//calculate current time
	var currentTime= new Date();
	var year = currentTime.getFullYear();
	var month = currentTime.getMonth()+1;
	var day = currentTime.getDate();
	var hour=currentTime.getHours();
	var min=currentTime.getMinutes();
	var sec=currentTime.getSeconds();
	var mil=currentTime.getMilliseconds();
	var displayTime = (month + "/" + day + "/" + year + " " + 
		hour + ":" + min + ":" + sec + ":" + mil);
	document.getElementById("timefield").value=displayTime;
}

function loadOnlyFirst() {
	document.zipForm.name.focus();
}
&lt;/script&gt;
&lt;/head&gt;

&lt;body onload="onLoad();"&gt;
</pre>
<h3 id="Developing_Firefox_extensions" name="Developing_Firefox_extensions">Developing Firefox extensions</h3>
<p>Firefox 1.5 <a href="/en/Building_an_Extension" title="en/Building_an_Extension">extensions</a> need to allow for this caching functionality. If you are developing a Firefox extension that you want to be compatible with both 1.5 and earlier versions, make sure that it listens for the <code>load</code> event for triggers that can be cached and listens for the <code>pageshow</code> event for triggers that shouldn’t be cached.</p>
<p>For instance, the Google Toolbar for Firefox should listen for the <code>load</code> event for the autolink function and to the <code>pageshow</code> event for the PageRank function in order to be compatible with both 1.5 and earlier versions.</p>
<p>{{ languages( { "it": "it/Usare_il_caching_di_Firefox_1.5", "de": "de/Benutzen_des_Zwischenspeichers_in_Firefox_1.5_(caching)", "fr": "fr/Utilisation_du_cache_de_Firefox_1.5", "ja": "ja/Using_Firefox_1.5_caching" } ) }}</p>
Revert to this revision