Ctrl f5 не работает на ноутбуке

Обновлено: 03.07.2024

Все мы знаем сотню способов загрузки скриптов. У каждого свои плюсы и минусы.

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

Цели: модульность разработки, быстрота загрузки, валидный кэш.
Бонус: индикатор загрузки

UPD. Обозначил главную цель этого метода — валидный кэш.
При использовании данного метода, у вас не будет неуверенности в том, обновится ли скрипт и будет ли он работать у конечного пользователя.

UPD 2. Для тех кто не дочитывает до конца (я вас прекрасно понимаю), в концовке сказано, как всё можно сделать намного проще.
Вместо core.633675510761.js писать core.js?v=633675510761. И там же указано, почему всё же написано так много.

UPD 3. В комментариях от david_mz, WebByte прозвучало предложение для обработки запроса использовать не JSHandler, а urlrewrite.

Под модульностью я понимаю, что каждый компонент системы расположен в отдельном файле: core.js, utils.js, control.js, button.js и т.д.
От этого принципа я не отказываюсь даже при загрузке страницы. Хотя я знаю, что загрузка 1 файла 100Кб быстрее 10-ти по 10Кб.
Эту проблему я решу через кэширование далее.

  • изменение в одном компоненте приводит к необходимости перегрузке всего пакета
  • высока вероятность дублирования компонентов в разных пакетах

Помимо использования заголовков «If-Modified-Since» и «If-None-Match» (ETag) я устанавливаю Expires через год!
Теперь почему я так смело поступаю и уверен что мой файл будет год валидным.

Потому что я приписываю к имени файла дату его последней модификации!
Т.е. есть core.js, включение происходит так

  • мы получаем надежный кэш файла. Даже оперируя заголовками Last-Modified и ETag, мы не всегда получаем последнюю версию файла. Браузер или прокси-сервер, не всегда запрашивают информацию о файле. Часто они берут свой кэш. В таких случаях обычное явление сброс кэша по Ctrl-F5. Знакомо? Теперь же, взять из внутреннего кэша старый файл не возможно, т.к. мы запрашиваем фактически новый файл с новым именем.
  • пропадают все запросы на проверку If-None-Match и If-Modified-Since. Даже если файл не изменился и сервер возращает Not Modified 304, всё равно каждый файл — это новый запрос — это задержка. Теперь повторные обращения к одному файлу сразу берут его из кэша. Здорово, не правда ли?

Для наглядности приведу пару скриншотов. Интернет очень медленный.
Первое обращение к странице.

Второе:

Изменяем один файл — третье обращение

Как видите из второго и третьего рисунков, браузер обновил изменённый скрипт. Также видно, что он не удосужился проверить все файлы на наличие изменений. Т.е. на странице много картинок, а он почему-то проверил только две. Тоже самое происходит со скриптами. Они обновляются не всегда. Web-сервер может устанавить дополнительные заголовки для статических файлов, вроде Set-Expires + (1-9999) минут. Плюс внутреняя логика браузера и proxy-серверов. Вообщем, на что мы повлияеть не можем.

1. Для включения файлов на страницу я использую специальный объект, который проверяет на уникальность включаемого файла. А затем при рендинге пишет мои файлы с префиком даты.

public class ScriptHelper
protected StringCollection includeScripts = new StringCollection();

public void Include( String filename )
filename = filename.ToLower();
StringCollection container;
switch ( System.IO.Path.GetExtension( filename ) )
case ".js" : container = includeScripts; break ;
default : throw new ArgumentException( "Not supported include file: " + filename, "filename" );
>
if ( !container.Contains( filename ) ) container.Add( filename );
>

public void RegisterScripts( Page page )
StringBuilder clientScript = new StringBuilder ();
foreach ( String filename in includeScripts )
clientScript.AppendFormat( includeJS, prefix + FileSystemWatcherManager.GetModifiedName( "Scripts/" + filename ) );
page.ClientScript.RegisterClientScriptBlock( page.GetType(), "clientscripts" , clientScript.ToString(), false );
>
>


* This source code was highlighted with Source Code Highlighter .

Комментарий:
prefix — префикс относительного пути папки со скриптами
FileSystemWatcherManager — менеджер по работе с физическими файлами. Этот класс позволяет избегать частых вызовов System.IO.File.GetLastWriteTimeUtc(), и является простой оболочкой монитора файловой системы. Позволю себе привести полный код.

using System;
using System.IO;
using System.Collections. Generic ;

public class FileSystemWatcherManager
private static String physicalAppPath;
private static SortedList< String , Int64 > lastModifiedFiles = new SortedList< String , Int64 >();

UpdateLastModifiedFiles( directory, pattern, true );
>
>

private static void OnFileSystemRenamed( object sender, RenamedEventArgs e )
UpdateLastModifiedFiles( Path.GetDirectoryName( e.FullPath ), ( (FileSystemWatcher)sender ).Filter, true );
>

private static void OnFileSystemChanged( object sender, FileSystemEventArgs e )
UpdateLastModifiedFiles( Path.GetDirectoryName( e.FullPath ), ((FileSystemWatcher)sender).Filter, true );
>

public static void UpdateLastModifiedFiles( String directory, String filter, Boolean logAction )
lock ( lastModifiedFiles )
if ( logAction ) WL.Logger.Instance.Log( String .Format( "Update modified files at \"\"" , directory, filter ) );

foreach ( String subDir in Directory .GetDirectories( directory ) )
UpdateLastModifiedFiles( subDir, filter, false );
foreach ( String file in Directory .GetFiles( directory, filter ) )
lastModifiedFiles[file.Substring( physicalAppPath.Length ).ToLower().Replace( '\\' , '/' )] = File .GetLastWriteTimeUtc( file ).Ticks / 1000000;
>
>


* This source code was highlighted with Source Code Highlighter .

Вызов в global.asax

void Application_Start( object sender, EventArgs e )
FileSystemWatcherManager.StartDirectoryWatcher( HttpContext .Current.Request.PhysicalApplicationPath, "*.js,*.css" );
>

* This source code was highlighted with Source Code Highlighter .

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

Обработчик нужен чтобы удалить префикс со временем изменения и отдать реальный файл. Также он проверяет заголовки If-None-Match, If-Modified-Since, устанавливает LastModified, ETag и Expires. Также возможен выбор файла, оригинальный, минимизированый, сжатый, проверка прав и прочее.

Привожу облечённую версию.

public class JSHandler : IHttpHandler
public void ProcessRequest( HttpContext context )
try
String filepath = context.Request.PhysicalPath;
String [] parts = filepath.Split( '.' );
Int64 modifiedTicks = 0;
if ( parts.Length >= 2 )
if ( Int64 .TryParse( parts[parts.Length - 2], out modifiedTicks ) )
List < String > parts2 = new List < String >( parts );
parts2.RemoveAt( parts2.Count - 2 );
filepath = String .Join( "." , parts2.ToArray() );
>
>

FileInfo fileInfo = new FileInfo( filepath );
if ( !fileInfo.Exists )
context.Response.StatusCode = 404;
context.Response.StatusDescription = "Not found" ;
>
else
DateTime lastModTime = new DateTime ( fileInfo.LastWriteTime.Year, fileInfo.LastWriteTime.Month, fileInfo.LastWriteTime.Day, fileInfo.LastWriteTime.Hour, fileInfo.LastWriteTime.Minute, fileInfo.LastWriteTime.Second, 0 ).ToUniversalTime();
String ETag = String .Format( "\"\"" , lastModTime.ToFileTime().ToString( "X8" , System.Globalization.CultureInfo.InvariantCulture ) );
if ( ETag == context.Request.Headers[ "If-None-Match" ] )
context.Response.StatusCode = 304;
context.Response.StatusDescription = "Not Modified" ;
>
else
if ( context.Request.Headers[ "If-Modified-Since" ] != null )
String modifiedSince = context.Request.Headers[ "If-Modified-Since" ];
Int32 sepIndex = modifiedSince.IndexOf( ';' );
if ( sepIndex > 0 ) modifiedSince = modifiedSince.Substring( 0, sepIndex );
DateTime sinceDate;
if ( DateTime .TryParseExact( modifiedSince, "R" , null , System.Globalization.DateTimeStyles.AssumeUniversal, out sinceDate ) &&
lastModTime.CompareTo( sinceDate.ToUniversalTime() ) == 0 )
context.Response.StatusCode = 304;
context.Response.StatusDescription = "Not Modified" ;
>
>
if ( context.Response.StatusCode != 304 )
String file = fileInfo.FullName;

/* String encoding = context.Request.Headers["Accept-Encoding"];
if( encoding != null && encoding.IndexOf( "gzip", StringComparison.InvariantCultureIgnoreCase ) >= 0 &&
File.Exists( file + ".jsgz" ) )
<
file = file + ".jsgz";
context.Response.AppendHeader( "Content-Encoding", "gzip" );
>
else*/
if ( File .Exists( file + ".jsmin" ) ) file = file + ".jsmin" ;

if ( context.Request.HttpMethod == "GET" )
context.Response.TransmitFile( file );
>

context.Response.Cache.SetCacheability( HttpCacheability.Public );
context.Response.Cache.SetLastModified( lastModTime );
context.Response.Cache.SetETag( ETag );
if ( modifiedTicks != 0 )
context.Response.Cache.SetExpires( DateTime .UtcNow.AddYears( 1 ) );
context.Response.AppendHeader( "Content-Type" , "text/javascript" );

context.Response.StatusCode = 200;
context.Response.StatusDescription = "OK" ;
>
>
>
catch ( Exception ex )
WL.Logger.Instance.Error( ex );
context.Response.StatusCode = 500;
context.Response.StatusDescription = "Internal Server Error" ;
>
>

* This source code was highlighted with Source Code Highlighter .

Замечание. Если заметили я отдаю либо оригинальный файл, либо .jsmin, либо .jsgz.
Это минимизированная и сжатая версии, которые строятся автоматически отдельной тулзой при билде сервера. Чтобы запретить прямой доступ к ним надо добавить в web.config

Вместо концовки

Возможно вы скажете, много сложностей с реализацией отдельного хэндлера.
Могу посоветовать более простой способ обработки файла. Вместо писать
Тогда не нужен JSHandler. Но я не уверен как будет работать кэш. Фактически имя файла не меняется, а появляется только дополнительный параметр. Т.е. может возникнуть та же проблема с Ctrl-F5 из-за внутренного кэша браузера или прокси-сервера.
Но мне отдельный JSHandler нужен ещё для проверки прав на доступ к скриптам, например из папки Admin отдаю только админам.
Плюс ко всему кому-то будет полезно и интересно посмотреть реализации JSHander'а и монитора файловой системы.

Если задача JSHandler только в отрезании ключа модификации, то его можно заменить urlrewrite-модулем.

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

И обещанный бонус с индикатором загрузки.

Пока грузятся ваши скрипты первый раз, визуально ускорить процесс можно показав процесс загрузки.
Помните место где я пишу включение файлов? Там на самом деле код такой:

* This source code was highlighted with Source Code Highlighter .

Рисуется два div'а. И второму по мере загрузки наращивается ширина.
В CSS это выглядит вот так:

Доброго времени суток!

Собственно, сегодняшняя статья будет о работе и настройке функциональных клавиш F1÷F12 и Fn на ноутбуках. Дело в том, что частенько они либо вообще не работают, либо работают не так, как должны.

Причем, многие производители "городят" форму клавиш, их функции, включение/выключение, настройку, как им вздумается (никакой стандартизации).

Меж тем, клавиши Fn, F1, F2, F3 и др. — очень важны, они позволяют быстро прибавить/убавить яркость и звук, включить/выключить сеть Wi-Fi, тачпад и многое другое.

В общем-то, отказываться от них — значит лишать себя нужного функционала, что не есть хорошо.

Причины неработоспособности Fn и F1÷F12

Напоминаю , что в большинстве случаев, чтобы функциональные клавиши могли выполнить альтернативную функцию (убавить ту же яркость) необходимо нажимать их одновременно с клавишей Fn.

Например, для того, чтобы включить/выключить Wi-Fi — нужно нажать комбинацию Fn+F2 (это в качестве примера! На каждом ноутбуке свои сочетания, см. внимательно на картинки на клавишах) .

Одновременное нажатие Fn+F2 - включает или выключает Wi-Fi

Одновременное нажатие Fn+F2 - включает или выключает Wi-Fi / в качестве примера!

1) А включена ли Fn? Нет ли альтернативной кнопки на клавиатуре?

Некоторые типы клавиатур снабжены дополнительными кнопками F Lock или F Mode. Они позволяют блокировать (отключать) функциональные клавиши. Присмотритесь внимательно — нет ли у вас их?

Клавиша F Lock (чаще всего встречается на классической клавиатуре)

Клавиша F Lock (чаще всего встречается на классической клавиатуре, а не на ноутбуках)

Также отмечу, чтобы задействовать кнопку Fn, на некоторых ноутбуках необходимо нажать сочетание кнопок Fn+Esc (см. скрин ниже — на клавише должен быть нарисован небольшой замок) . Кстати, вместо Fn+Esc — может использоваться сочетание Fn+NumLock.

Fn+Esc - изменяют режим работы Fn

Fn+Esc - изменяют режим работы Fn

2) Настройки BIOS (режимы Hotkey Mode и аналоги)

В некоторых ноутбуках (например, Dell Inspiron, Lenovo ThinkPad и др.) в BIOS можно задать режим работы функциональных клавиш (т.е. они могут выступать в классической роли, а могут без нажатия на Fn сразу же выполнять вторую свою функцию: убавлять звук, включать/выключать тачпад и т.д.).

Чаще всего, для входа в BIOS — нужно перезагрузить ноутбук, и при его включении (до загрузки ОС Windows) сразу же нажимать клавиши F2 или Delete (кнопки могут быть отличными, зависит от модели устройства).

Называются подобные режимы: Hotkey Mode, Action Keys Mode (и прочие производные) . Для изменения их режима работы — необходимо зайти в раздел BIOS Configuration и поменять режим с Enabled на Disabled (или наоборот) .

Hotkey Mode - измененный режим работы клавиш F1-F12

Hotkey Mode - измененный режим работы клавиш F1-F12

3) Отсутствие драйверов и специального ПО от производителя

Когда драйвера ставятся автоматически вместе с Windows, либо используются различные комплекты/паки (например, Driver Pack Solution) — в системе часто не оказывается специального ПО от производителя ноутбука. В следствии чего, некоторые клавиши могут не работать (в том числе и функциональные).

Рассмотрю ниже пример обновления подобных драйверов на примере ASUS (если у вас марка ноутбука отличная, скажем HP, Acer, Dell, Lenovo — все действия будут аналогичны, только адрес офиц. сайта будет отличный) .

ASUS

Поиск по базе продукта

Поиск по базе продукта

Загружаем необходимые драйвера

Загружаем необходимые драйвера

Pointed Device

В общем-то, если подводить некий итог : необходимо просто обновить драйвера, скачав их с сайта производителя вашего ноутбука. Причем, сделать это нужно для конкретно той версии Windows, который пользуетесь в настоящий момент.

Если для вашей версии Windows на сайте производителя ноутбука нет драйверов — то это серьезный повод задуматься о переходе на другую версию ОС (вполне возможно, что из-за этого и не работает часть функционала, в том числе и функциональные клавиши).

4) Проблема с самой клавиатурой

Обратите внимание на то, реагирует ли клавиша хоть иногда (может быть попробовать нажать на нее чуть сильнее) . Если проблема с дорожками под клавишей — то часто более сильное нажатие срабатывает (например, дорожки могут окислиться после залития, или вести себя так в следствии износа) .

Что можно сделать:

  1. заменить клавиатуру на ноутбуке на новую (рекомендую сдать в сервис на диагностику, т.к. не лишним будет проверить нет ли проблем еще с чем-то);
  2. подключить к USB порту внешнюю клавиатуру и пользоваться ей (чем не временный вариант?) ; на другую;
  3. использовать экранную клавиатуру. Чтобы ее вызвать, зайдите в: Панель управления\Специальные возможности\Центр специальных возможностей

Раньше я мог создавать и запускать консольные приложения, нажав Ctrl + F5 в visual studio. Это больше не работает. Я везде искал. Кто-нибудь знает, как повторно включить эту команду?

ОТВЕТЫ

Ответ 1

Возможно, это смехотворное предложение, но на вашей клавиатуре есть какой-то "F Lock" ключ? Случилось со мной после того, как я получил новую клавиатуру и случайно ударил ее. Даже не знал, что это было:)

Ответ 2

У меня была аналогичная проблема, когда некоторые из моих ярлыков (например, ярлык Alt + Shift + F10 intellisense) перестали работать.

Я смог reimport сохранить сохраненные настройки после того, как у меня был Reset их, но только с нарушенными сокращенными сокращениями!

Надеюсь, это поможет!

Ответ 3

Прежде чем удалять все ваши настройки, рассмотрите возможность простого сброса настроек клавиатуры:

В "Инструменты/Параметры/Среда/Клавиатура" вы увидите раскрывающийся список для вашей схемы клавиатуры и рядом с ним кнопку Reset. Убедитесь, что схема сопоставления настроена на то, что вы хотите, а затем нажмите кнопку Reset.

Ответ 4

У меня был аналогичный вопрос, и чтение этой темы привело меня к ответу, который похож на ответ ключа f-Lock. Я использую новый ноутбук и снова представляю себя программированию. Когда в книге говорилось, что нажмите Ctrl-F5, я сделал это, и единственное, что произошло, это то, что мой монитор немного смягчился, хотя он вернулся к нормальной яркости, как только я нажал несколько других вещей. То, что я заметил после прочтения этой темы, состоит в том, что эта новомодная клавиатура имеет синий ключ Fn, и все имена функциональных клавиш печатаются синим цветом. Другими словами, чтобы получить функциональные функциональные клавиши, вы должны удерживать синюю клавишу Fn, когда вы нажимаете фактическую функциональную клавишу. Таким образом, F5 становится Fn-F5, а Ctrl-F5 становится Ctrl-Fn-F5. Это находится на Dell Inspiron 1564. Это не столь вопиющее, как ключ F-Lock, поэтому я надеюсь, что скоро примусь к этому.

Ответ 5

Что я делаю, чтобы заставить его работать снова, щелкнул правой кнопкой мыши по этому решению, на вкладке дерева визуальной студии "Solution Explorer" справа, где отображаются все файлы вашего проекта, и выберите свойства.

Затем выберите там проект и поместите его в качестве стартового проекта.

Возможно, это ваша проблема. Если нет, я надеюсь, что это может помочь кому-то в будущем.

Ответ 6

Я исправил это, нажав Fn + F5, это прямо рядом с кнопкой Windows.

Ответ 7

Ответ 8

Мне сошлось что-то похожее, но только с одним проектом, а остальные работают с CTRL + F5, поэтому я опубликую здесь свою проблему и решение, потому что это может помочь людям, которые ищут ту же проблему, что и я: )

Я открыла в Visual Studio 2012 решение, созданное с помощью Visual Studio 2013, и не работало с CTRL + F5. Я открываю файл решения с помощью блокнота, и я изменяю следующий раздел:

Это решает проблему для меня.

Ответ 9

Ответ 10

У меня была аналогичная проблема с Alt + F7 (Find Usages in Resharper). Оказывается, GeForce Experience использует ярлык для его совместного использования. Деинсталляция GE и все это хорошо.

При нажатии функциональной клавиши на клавиатуре Microsoft, она не работает должным образом. Кроме того, при нажатии клавиш некоторые клавиши не работают. Сюда могут входить следующие разделы:

Клавиша NUM LOCK

Клавиша PRINT SCREEN

Клавиша SCROLL LOCK

Клавиша F1 в функциональных клавишах F12

Блокировка F

Примечание. В этой статье описана и resovedа проблема на клавиатуре Microsoft, которая оснащена клавишей переключателя F LOCK, но при этом другие типы Keyborad могут не применяться к этой статье.

Причина

Это может происходить, если клавиатура оснащена клавишей переключения F LOCK, а клавиша F LOCK включена. В зависимости от модели клавиатуры следующие клавиши могут быть альтернативными функциональными клавишами:

Клавиша PRINT SCREEN

F1 — функция F12

Клавиша F LOCK включает и выключает функции альтернативных функциональных клавиш. Альтернативной функциональной клавишей является клавиша с двумя возможными командами в зависимости от состояния клавиши переключения переключателя F LOCK.

Обходное решение

Чтобы обойти эту проблему, нажмите клавишу F LOCK. Клавиша F LOCK переключается между командами стандартной функциональной клавиши и командой Microsoft Keyboard Enhanced.

Дополнительная информация

Альтернативные командные клавиши предоставляют дополнительные возможности клавиатуры, предоставляя два режима команд для верхней строки стандартных клавиш F LOCK. Клавиши F LOCK и альтернативные командные клавиши доступны только на некоторых моделях клавиатуры, а доступные типы альтернативных команд зависят от модели клавиатуры. Клавиша F LOCK используется для переключения между стандартными командами, помеченными на передней стороне клавиш, такими как F1 или вставка, а также с помощью альтернативных команд, которые могут быть помечены с помощью клавиш. Если индикатор F LOCK включен, клавиша F LOCK включена, и эти клавиши выполняют стандартные команды. Если индикатор F LOCK выключен, дополнительные команды включены. Вы можете выбрать режим, с которым вы предпочитаете работать, или включить и отключить клавишу F LOCK для доступа к наиболее часто используемым командам. ФУНКЦИИ с помощью клавиши F1 и F12 имеют специальные альтернативные команды. Эти клавиши называются улучшенными функциональными клавишами. Улучшенные функциональные клавиши предоставляют быстрый доступ к часто используемым командам, которые могут повысить производительность. Эти команды обычно выводятся выше или по клавишам. В таблице ниже указаны сочетания клавиш, используемые по умолчанию, которые доступны для клавиатуры Microsoft. Однако вы можете переназначить многие клавиши с помощью клавиатуры Microsoft IntelliType Pro. Клавиатуры различаются в отношении того, какие дополнительные клавиши они предоставляют. Например, некоторые клавиатуры предоставляют клавиши для управления калькулятором, громкостью, домашней страницей Интернета, страницей поиска в Интернете, электронной почтой и т. д.

Улучшенная функциональная клавиша

F6: закрытие документа или файла в активном окне.

Блокировка функции (F-блокировка)

Переключение между командами стандартных сочетаний клавиш (F LOCK Light On) и улучшенными командами клавиатуры Microsoft (F LOCK Light Off). Не закрывайте его, а также переключаться между режимами для повышения функциональных возможностей нажатия клавиш.

F1: Открытие справочной системы для активного окна.

F4: создание нового документа в программах, поддерживающих эту команду.

Office для дома

Запуск веб-браузера и переход на веб-сайт Microsoft Office. (Эта возможность недоступна на всех клавиатурах.)

F5: Открытие документа в программах, поддерживающих эту команду.

F12: печатает файл в активном окне.

F3: Отменяет предыдущее действие отмены.

F11: сохранение файла в активном окне.

F10: запуск программы проверки орфографии в активном документе, если эта функция есть в программе документа.

Отображение или скрытие области задач Office, которая была ранее отображена. (Эта возможность недоступна на всех клавиатурах.)

F2: Отмена предыдущего действия.

Чтобы загрузить последнюю версию программного обеспечения для клавиатуры, посетите веб-сайт корпорации Майкрософт по следующему адресу:

Читайте также: