Как я могу заставить браузер видеть изменения CSS и Javascript?

Как увидеть изменения CSS и Javascript

Файлы CSS и Javascript меняются не очень часто, поэтому я хочу, чтобы веб-браузер кэшировал их. Но я также хочу, чтобы веб-браузер видел изменения, внесенные в эти файлы, не требуя от пользователя очистки кеша браузера. Также нужно решение, которое хорошо работает с системой контроля версий, такой как Subversion.

Некоторые решения, которые я видел, включают добавление номера версии в конец файла в виде строки запроса.

Можно использовать номер версии SVN, чтобы автоматизировать это для вас: ASP . NET Показать номер версии SVN.

Можете ли вы указать, как вы включаете переменную Revision другого файла? То есть в файле HTML я могу включить номер редакции в URL-адрес файла CSS или Javascript.

В книге Subversion говорится о ревизии: «Это ключевое слово описывает последнюю известную ревизию, в которой этот файл был изменен в репозитории».

Firefox также позволяет нажимать CTRL+R, чтобы перезагрузить все на определенной странице.

Чтобы уточнить, я ищу решения, которые не требуют от пользователя каких-либо действий со своей стороны.

5 ответов

Я обнаружил, что если вы добавите отметку времени последнего изменения файла в конец URL-адреса, браузер будет запрашивать файлы при его изменении. Например, в PHP:

function urlmtime($url) {
   $parsed_url = parse_url($url);
   $path = $parsed_url['path'];

   if ($path[0] == "/") {
       $filename = $_SERVER['DOCUMENT_ROOT'] . "/" . $path;
   } else {
       $filename = $path;
   }

   if (!file_exists($filename)) {
       // If not a file then use the current time
       $lastModified = date('YmdHis');
   } else {
       $lastModified = date('YmdHis', filemtime($filename));
   }

   if (strpos($url, '?') === false) {
       $url .= '?ts=' . $lastModified;
   } else {
       $url .= '&ts=' . $lastModified;
   }

   return $url;
}

function include_css($css_url, $media='all') {
   // According to Yahoo, using link allows for progressive 
   // rendering in IE where as @ import url($css_url) does not
   echo '<link rel="stylesheet" type="text/css" media="' .
        $media . '" href="' . urlmtime($css_url) . '">'."\n";
}

function include_javascript($javascript_url) {
   echo '<script type="text/javascript" src="' . urlmtime($javascript_url) .
        '"></script>'."\n";

привет гром, я пробовал этот метод. однако я обнаружил, что как только я включаю параметр, браузер не кэширует файл css. Он загружает файл css каждый раз, когда я повторно посещаю страницу без ее кэширования. Я обнаружил это, продолжая вносить изменения в файл css, чтобы увидеть, кэшируется ли файл css браузером. Я использую хром. Могу ли я узнать, как заставить браузер кэшировать файл css и загружать его только при изменении параметра? Спасибо.

@ benmsia, вы смотрели, какие заголовки HTTP возвращаются при запросе файла CSS?

Некоторые решения, которые я видел, включают добавление номера версии в конец файла в виде строки запроса.

<script type="text/javascript" src="funkycode.js?v1">

Вы можете использовать номер версии SVN, чтобы автоматизировать это для вас, включив слово LastChangedRevision в ваш html-файл после того места, где v1 появляется выше. Вы также должны настроить свой репозиторий, чтобы сделать это.

Надеюсь, это еще больше прояснит мой ответ?

Firefox также позволяет нажимать CTRL + R, чтобы перезагрузить все на определенной странице.

На мой взгляд, лучше сделать номер версии частью самого файла, например myscript.1.2.3.js. Вы можете настроить свой веб-сервер на кэширование этого файла навсегда и просто добавить новый файл js, когда у вас будет новая версия.

Когда вы выпускаете новую версию своих библиотек CSS или JS, происходит следующее:

  1. изменить имя файла, чтобы включить уникальную строку версии
  2. изменить файлы HTML, которые ссылаются на библиотеку, чтобы они указывали на версионный файл

(обычно это довольно простой вопрос для сценария выпуска)

Теперь вы можете установить Expires для CSS/JS на несколько лет вперед. Всякий раз, когда вы меняете содержимое, если ссылочный HTML-код указывает на новый URI, браузеры больше не будут использовать старую кешированную копию.

Это вызывает поведение кэширования, которое вы хотите, не требуя ничего от пользователя.

Мне также было интересно, как это сделать, когда я нашел ответ Грома. Спасибо за код.

Я изо всех сил пытался понять, как должен был использоваться код. (Я не использую систему контроля версий.) Таким образом, вы включаете временную метку (ts) при вызове таблицы стилей. Вы не планируете часто менять таблицу стилей:

<?php 
    include ('grom_file.php');
    // timestamp on the filename has to be updated manually
    include_css('_stylesheets/style.css?ts=20080912162813', 'all');
?>

?? функция include_css добавит отметку времени последнего изменения файла в конец URL-адреса. Не требуется контроль версий

Как я могу определить, блокирует ли браузер всплывающее окно? - JS

Определить, блокирует ли браузер всплывающее окно

Время от времени я сталкивался с веб-страницей, которая пытается открыть новое окно (для ввода данных пользователем или чего-то важного), но блокировщик всплывающих окон предотвращает это. Какие методы может использовать вызывающее окно, чтобы убедиться, что новое окно запускается правильно? 9 ответов Если вы используете JavaScript для открытия всплывающего окна, вы можете использовать что-то вроде этого: var newWin = window.open(url); if(!newWin || newWin.closed || typeof newWin.closed=='undefined') { //POPUP BLOCKED } Вот ответ для хрома: обнаружить заблокированное всплывающее окно в хроме @ ajwaka, не могли бы вы уточнить, не подходит ли этот ответ для Chrome или есть ли причина, по которой другой ответ лучше подходит для Chrome? Благодарность! @ ajwaka, по крайней мере, сегодня этот код работает в Chrome, отсюда и вопрос. @ Crashalot - Вы спрашиваете меня о чем-то, на что я ответил 6 лет назад…

Подробнее »

Тройные кавычки - Как разграничить строковый параметр Javascript

Разграничить строковый параметр Javascript

Тройные кавычки? Как разграничить строковый параметр Javascript с привязкой к данным в ASP . NET? Как разграничить строковый параметр с привязкой к данным Javascript в якорном OnClick событии? У меня есть тег привязки в элементе управления ASP . NET Repeater. Событие OnClick якоря содержит вызов функции Javascript. Функция Javascript принимает строку в качестве входного параметра. Строковый параметр заполняется значением с привязкой к данным из повторителя. Мне нужны "двойные кавычки" для файла Container.DataItem . Мне нужны 'одинарные кавычки' для OnClick . И мне все еще нужен еще один разделитель (тройные кавычки?) для…

Подробнее »

Пользовательская проверка ASP . NET на стороне клиента

Проверка на стороне клиента

У меня есть настраиваемая функция проверки в JavaScript в пользовательском элементе управления на веб-сайте .Net 2.0, которая проверяет, не превышает ли уплаченная сумма причитающейся суммы. Я поместил код валидатора в ascx файл, а также попытался использовать его, Page.ClientScript.RegisterClientScriptBlock() и в обоих случаях проверка срабатывает, но я не могу найти функцию JavaScript. Вывод в консоли ошибок Firefox…

Подробнее »