Как стать автором
Обновить

Комментарии 91

В системе Flede это сейчас работает в версии 0.73rc, которая доступна с svn. Есть одно пожелание - в firefox под линукс нажатие Ctrl-Ы не срабатывает как Ctrl-S. Это бага firefox, но можно ли пофиксить средствами JS?
Это особенность Лисы именно под Линукс, под вин — всё ОК.
Да, надо потестить. Как только доберусь до Линукса — обязательно починю :-)
Это бага именно фаера именно под линукс, лечится вот этим https://addons.mozilla.org/ru/firefox/addon/3529 =)
Это бага линукса и именно хоткеев. В Мозиллу костыли вставить можно, а вот в остальные приложения - проблемно.

Решения вменяемого я так и не нашел. Может поделится кто?
мне кажется, это баг только gtk, разве нет ? и вроде бы где то я видел решение на эту тему) но может я ошибаюсь, скорей всего так и есть =)
линукса - это вы уж слишком )
скорее GTK, в QT приложениях такого не наблюдается
Это _не_ баг GTK. Если не обрабатывать сырое событие "key-press-event", а делать акселераторы, то никаких проблем нет. Сам исправлял подобный баг в gajim.
Большая часть GTK приложений прекрасно понимают шорткаты в любой раскладке.

И, кстати, в Firefox3 баг был исправлен. Но, к сожалению, костылём, который, впрочем, работает лучше, чем вышеупомянутое расширение.
Don't try it with other languages/layouts, the result will be unpredictable.

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

Можете почтитаь топик про решение проблемы.
Эта проблема решена в ff3. А вот 1 и 2 версии останутся без этого фикса :(
Так что, на мой взгляд, при создании хоткеев надо учитывать и это.
извините что дабл пост, но я не нашел как отредактировать сообщение =(

я тут новый...

Вот ссылка на решение проблемы с Лисом в Линуксе:

http://habrahabr.ru/blog/firefox/28589.html
+1
Хороший пост, пишите еще.
осталось внедрить на хабр (а лучше - повсеместно, где есть формы) :)
большое спасибо за статью! буду адаптировать код под jQuery и юзать в проектах :)
Как сделаете решение для jQuery, если Вас не затруднит, отпишите его мне или в комментах. С удовольствием добавлю его в статью.
Прошу простить, не тестировал совсем :) Просто переложил (с некоторыми неточностями, т.к. jQuery, судя по примерам из документации, не знает gecko, но знает msie, opera, safari & firefox). В общем, предлагаю уважаемому сообществу принять участие в разработке :)

var e = "keypress";
if($.browser.msie || $.browser.opera) e = "keydown";
$(document).bind(e, function(evt){
var evt = evt || window.event;
var key = evt.keyCode || evt.which;

var isIE = $.browser.msie || $.browser.opera;
var isGecko = !isIE;
key = !isGecko ? (key == 83 ? 1 : 0) : (key == 115 ? 1 : 0);
if (evt.ctrlKey && key) {
if(evt.preventDefault) evt.preventDefault();
evt.returnValue = false;
clientFunction();
window.focus();
return false;
})

ЗЫ: ногами не бить, с jQuery знаком второй день :)
:) за ссылку спасибо, пошёл искать ритуальную стену для самоубийств.
Спасибо!
Работает, только у Вас одной фигурной скобки не хватает закрывающей для ифа в конце.
Статья обновлена, спасибо!
Лучше положить в статью ссылку rold. Моё решение кривое (у меня оно под IE7 не заработало, а под FF заработало со второго нажатия).
Да, ссылка на гугл будет актуальнее.
А у Вас всё работает, видимость неработоспособности из-за того, что дебажите алертом. Лучше обновите какую-нибудь ноду на страницу, сразу всё станет на свои места ;-)
Во всём есть плюсы и минусы :) В ИЕ у меня не заработало так: http://www.href.kz/save
А решение по ссылке исполняет код параллельно с вызовом сохранительного окошка (по крайней мере в опере) :)
Нет в жизни счастья :)
Но, попытаться стоило )
Немного не в тему: встречал однажды интересную реализацию отлова CTRL+S на сайте. При нажатии на данную комбинацию открывался DIV, визуально копирующий окно сохранения файла в MSIE. При нажатии кнопки Save страница якобы сохранялась в MyDocuments и div-чик закрывался.
Разумеется позже, когда пользователь хотел посмотреть сохранённую страницу и искал её в папке с документами, он там её не обнаруживал.
На локальную машину без использования хаков или activeX яваскрипт никого не пустить. А вот сделать такую вещь с привлечением сервера никто не мешает.
Например, Вы жмете Ctrl+S, открывается тот самый ДИВ, похожий на браузерный диалог и предлагает выбрать папку на хосте, для сохранения HTML-документа (при участии БД или еще как, не суть). Вы выбираете и сохраняете.
Или в почте — выбрать папку куда положить черновик письма.
Возможностей для реализации можно придумать много.
Вы не совсем меня поняли. Данный функционал явно сделан был чтобы ввести пользователя в заблуждение. Пользователь считал, что страница сохранена, чего по сути не происходило. Видимо, таким образом пытались защитить авторский контент. Хотя не уверен: не было защиты от selection, да и "File -> Save As" работало прекрасно. Имхо - просто разработчику не фиг делать было, вот он и реализовал такую "фичу".
К сожалению не могу дать ссылку, видел это несколько лет назад и сейчас уже адрес ресурса не помню.
Я всё прекрасно понял, и предложил вместо бестолкового решения вариант полезного (более-менее) применения :-)
Ну, собственно, в таком случае, простите, Вы изобрели велосипед :)
Схожий функционал реализован у некоторых служб Google (например, GoogleDocs)
В таком случае я изобрел 2 велосипеда, сама статья тоже неактуальна в виду того, что Ctrl+S уже реализован у Гугла :-)
Боюсь расстроить: http://jshotkeys.googlepages.com/test-st… :)
Другое дело, далеко не всегда желательно подключать большие либы в проекте.
Видел уже. Да и когда гмэйлом пользуешься такая реализация сохранения выделяется своим удобством. А вот отдельный скрипт для сохранения нигде не встречал, вот и результат в виде статьи :-)
блин... опять эта страница... люблю я её... какое-то неповторимое ощущение зарождается, когда по нажатию Ctrl+W - ничего не происходит :)
В Опере очень даже происходит :)
именно поэтому я пока использую решение из статьи, за неимением лучшего :)
Подкинули бы кармы мне, пост хочу по javascript написать. А то у меня 0 - зарегился неделю назад :)
Совет: не просите карму. Её нужно заслужить, а после таких просьб у кармы имеется тенденция уменьшаться :)
Ну ваше дело :) Если никому неинтересно про то как красиво вписать понятия процесса и потоков и как следствие динамическую подгрузку модулей на javascript.

//
// Dynamic script example.
//

// Load script.
var pLib = new HDynamicScript("Lib\\MapAppTest.js", "Map" ]);
var Map = pLib.GetExport("Map");

var pMap = new Map;

alert(pMap.PrivateData());

Хотел реально полезную штуку осветить, походу тут это не нужно...
Почему же не нужно?
Считаете полезным другим - пишите, в этом ограничений нет. А если то, что напишите будет действительно полезным, то проблема кармы и переноса из персонального блога в коллективный очень быстро решится :)
Хинт: для записи в персональный блог карма должна быть >= 0
Тут Вы ошибаетесь. В персональный блог нельзя писать с нулевой кармой, только комменты.
именно это и сказал bur :)
Согласен, мой косяк в операторе.
Но суть осталась: m007 вполне иеет возможность писать в блог.
Нет, не осталось.
При регистрации карма = 0.
А писать можно при карме > 0.
Вывод?
при добавлении коммента карма уже была положительная. А сейчас даже увеличилась. Так что утверждение "m007 вполне иеет возможность писать в блог" верно :)
При добавлении комментария карма была нулевая (я сам лично это видел), а потом её плюсанули. Поверьте, я сам только пару недель на Хабре. Пока не плюсанут в карму - живешь полностью в комментах.
Я тоже посмотрел практически сразу. Карма была меньше единицы, но больше нуля.
Кстати, считаю верным тот момент, что с нулевой кармой писать блог нельзя. Хорошо, если чловек некоторое время будет только читателем. Блоггин на Хабре довольно специфичен :)
карма >0
а вы утверждаете, что карма >= 0
;-)
пиши в личный блог. там тебе скажут что надо было писать в блог о яваскриптах, скажешь что кармы не хватает и будет тебе кармы) перенесёшь пост в нужный блог.
Классная штука, мне понравилось. Mac OS X + FF3b5 работает, но в макосях вместо Ctrl+S принято нажимать Command+S, посему диалог появляется, но с Ctrl все работает. На виндовой клаве у меня оно равняется клавише Win.
Спасибо! Допишу в топик.
Дополнение про Mac OS X: Ctrl+Ы на Маке не работает.
Спасибо, учёл в статье.
Решение для jQuery от Google
Не совсем корректная фраза, скорее «Плагин для jQuery, размещенный на Google Code» :)
Спасибо, изменил.
Наверняка, многие попробовали нажать ctrl + S после прочтения заголовка :D
чисто ради интереса, зачем блокировать горячие клавиши?
Если вам нужен интерфейс для сохранения ваших данных, а не HTML-кода страницы, то логично воспользоваться уже существующими хоткеями.
И их никто не блокирует, их переопределяют для сохранения других данных.
ничего не понял из вашего ответа :(
если я нажимаю ctrl+s то должна сохраниться страница. для каких целей блокировать это?
Объясню проще.
Ctrl+S — это горячая клавиша для сохранения.
А что сохранять, HTML-страницу или введенные пользователем данные решает уже конкретное приложение.
Есть такой почтовик - Gmail. Так вот, когда я пишу письмо, мне очень удобно по нажатию Ctrl+S сохранять письмо, а не видеть диалог о сохранении страницы.
Здесь речь идет не просто о блокировании Ctrl+S, а о возможности привязать к этому хоткею другое событие.
в таком случае, следует предупреждать большими буквами, что ctrl+s сохраняет письмо, а не страницу. иначе такая юзабильность будет только со знаком "−". В том же GMail'e я вовсе не ожидаю сохранения письма по ctrl+s, хоть это и логично было бы.
Извините за придирство, но это всё равно что взять чью-либо машину и перекрасить в другой цвет.
А за скрипт респектище!
fixed
спасибо, интересно. но лично я считаю, что функция сохранения документа должна лежать на браузере. а для сайта следует определить уровень доступности, что-то вроде предупреждения перед сохранением и служебной информацией для браузера как, что и в каком варианте сохранять. так, думаю, будет грамотней и логичней.

может подкинуть как идейку W3C?:)
Что и куда сохранять должно определяться приложением исходя из удобства пользователей. Иначе мы получим враждебный по отношению к юзеру интерфейс. Здесь речь идет исключительно о перехвате хоткея. Никакая служебная информация никуда не уходит, а сохранять можно не только документ.
перехватка хоткея по своей идее вещь не правильная. я говорю о том, что сайт дне должен определять функцию сохранения, в лучшем случае должен указывать браузеру что и как сохранять. отсюда будет и удобство для пользователя и стандарт для сайтостроителя, а для браузера это новая встроенная функция и отсутствие избыточной загрузки яваскрипт кодом.
1) Под сохранения в данном случае подразумевается отправка HTTP-запросов на хост. Это для юзера выглядит сохранением, а для браузера - ничем не примечательный запрос с данными формы.
2) В мозгу пользователя хоткей привязан к событию, а не конкретному действию, и это правильно. Неправильно на Ctrl+S привязывать выделение всего документа или закрытие страницы. А сохранение данных, если есть что сохранять и оно часто требуется - очень правильно повесить на этот хоткей.
1) я рассуждал о том как можно было бы реализовать эту функцию в будущем;)
2) я согласен с тем, что в голове у пользователя на хоткей Ctrl+S записана одна постоянная функция, не правильным я считаю сокрытие от него факта переделки этой функции и невозможность перенастройки этого хоткея. у браузера есть свой вариант выполнения функции, у авторов сайта свой - получается насильственный запрет функции браузера. а если браузерная функция мне была удобней?
1) Зачем? Нет, действительно, чем запрос отправленный по хоткею отличается своего обычного собрата?
2) Ответственность за такие случаи ложится на разработчика приложения. Если разработчик перехватил хоткей там, где все пользуются браузерным — значит он мудак и юзеры быстро забьют на эту страницу.
Как по мне, неудачная идея переопределять стандартное поведение программы. Один сайт будет реагировать на Ctrl-S стандартно, другой иначе, третий вообще непредсказуемо. Будет каша в головах юзеров и разрыв привычных шаблонов.
Предполагаю, что Вы не работали с web-приложениями где это реализовано и не представляете насколько это удобно и естественно :-)
К тому же не стоит втыкать перехват хоткеев по поводу и без повода.

И еще информация для размышления. Часто ли Вы на страницах ежедневно используемых сайтов (почта, поиск) жмете Ctrl+S для сохранения html-кода? :-)
Я, например, работал с приложениями, где это реализовано. И отлично представляю, насколько это неудобно.
Я привык что броузер по ctrl+s/cmd+s сохраняет страничку, а не делает какую-то там другую фигню. Мне не нужную тем более.

Моментально проникаюсь отвращением к сайтам, которые пытаются переназначить хоткеи моего браузера.
Фича очень полезная, знаю по себе, отработана уже привычка если пишешь "долго" некий текст автоматом жмешь ктрл+Ы, от этого зачастую получаю диалог сохранения страницы =) Так что когда в свое время увидел подобную фишку в редакторе tinymce принял на вооружение и использую в некоторых местах.

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

ЗЫ и вообще стандартные хоткеев много ) главное не переборщить.
Винградовцам, привет! :-)
Ловите плюс.

key = !isGecko ? (key == 83 ? 1 : 0) : (key == 115 ? 1 : 0);
???
По кейпрессу разные кейкоды в Гекко и Опере.
:)
Я думал, что достаточно будет обратить внимание программиста на строку...
Что ж, еще раз (конкретнее): key == 83 ? 1 : 0
key == 83 ? 1 : 0
Если на клавиатуре нажата клавиша с виртуальным кодом 83 ("S"), то присваиваем флагу истинное значение, если нет - ложное.
:-)
Кстати, есть более элегантное решение для всей строки:
key = String.fromCharCode(key).toLowerCase() == "s" ? 1 : 0;
key = key == 83;
То же самое и для "более элегантного решения", т.к. булева значения, которое возвращает оператор сравнения, вполне достаточно, чтобы не "городить огород".
+1
Глаз замылен, не увидел (
Те, кто используют PrototypeJS, могут поставить просто evt.stop(). Он сам определяет, что использовать: evt.preventDefault() или evt.stopPropogation().

Если надо делать в iframe, то для IE строчка определения event выглядеть будет так:
evt = iframe.contentWindow.document.parentWindow.event;
Имхо, пытаться изменить действие браузера по умолчанию - моветон.
А что, если вы хотите сделать какой-нибудь тул типа wysiwyg-редактора?
Стараться не использовать "браузерные" комбинации. Я привык к тому, что Ctrl+S сохраняет страницу и если кому-то вздумается, что на его сайте будет по-другому, то я больше никогда этот сайт не посещу.
Согласен с вами... но не полностью. Обычно такие вещи делаются там, где нужен именно функционал (привычный для большинства пользователей), а не там, где располагается контент.
Сколько людей - столько мнений. Лично я привык сабмитить данные по Ctrl-Enter, Ctrl-S - сохранение страницы на диск. Веб-приложение ни под каким предлогом не вправе переназначать пользовательские хоткеи, до тех пора пока это явно не указано юзером в настройках.
Вот и я о том же!
НЛО прилетело и опубликовало эту надпись здесь
"который повесил на Ctrl-Home переход на главную страницу"
а почему просто не нажать home, чтобы попасть наверх страницы?
Привык на маке сохранять cmd+s. почему бы и тут не сделать такой обработчик?
Зарегистрируйтесь на Хабре, чтобы оставить комментарий

Публикации

Истории