Форум dkLab и Denwer
Здесь общаются Web-разработчики.
Генеральный спонсор:
Хостинг «Джино»

Хоткеи (Иван Шумков)
Автор Сообщение
Иван Шумков
Участник форума



Зарегистрирован: 30.12.2004
Сообщ.: 229
Карма: 6
   поощрить/наказать

Откуда: Россия, Санкт-Петербург

СообщениеДобавлено: Сб Апр 30, 2005 12:15 am (написано за 3 минуты 4 секунды)
   Заголовок сообщения: Хоткеи
Ответить с цитатой

Моя реализация хоткеев: считывает атрибут accesskey со всех ссылок и инпутов, и создает хоткеи Ctrl+key.

Может:
1. Создовать хотхеи функцией addHotKey('ид элемента', код символа) (срабатывает без Ctrl)
2. Удалять хоткеи функцией remHotKey(код символа)
3. Создавать "одноразовые" хоткеи (срабатывают только один раз) oneHotKey('ид элемента', код символа)

Проверено в IE 6.0, Firefox 1.0.3, Opera 7.54

Известные ошибки:
1. В Опере вместе с хоткеями срабатывают дефолтные хоткеи броузера. Пока не знаю как исправить.

Жду поправок и комментариев. Давайте вместе доведем до ума.
Код (JavaScript): скопировать код в буфер обмена
var isDOM=document.getElementById
var isHB=isDOM&&document.all
var isMZ=isDOM&&navigator.appName=="Netscape"

window.onload = function(){
loadHotKeys()
}

var hotKeys=[];
var oneHotKeys=[];
function loadHotKeys() {
if(a=document.getElementsByTagName('a')){
for(i=0;i<a.length;i++){
if(accesskey=a[i].accessKey)hotKeys[accesskey]=a[i];
}
input=document.getElementsByTagName('input');
for(i=0;i<input.length;i++){
if(accesskey=input[i].accessKey)hotKeys[accesskey]=input[i];
};};}
if(isHB){
document.onkeydown=function(){return hotKey(event)}
}else if(isMZ){
document.addEventListener("keypress",function(ev){hotKey(ev)},true);
document.addEventListener("keyup",function(ev){hotKey(ev)},true);
}
function hotKey(event){
key=event.keyCode;
if(key==0)key=event.charCode;
if (event.ctrlKey){
letter=String.fromCharCode(key).toLowerCase();
if(hotKeys[letter])return _doHotKey(hotKeys[letter],event);
}else if(hotKeys[key]){
_doHotKey(hotKeys[key],event);
if(oneHotKeys[key]){
remHotKey(key);
oneHotKeys[key]=null;
};
return false;
};}
function _doHotKey(object,event){
if(isMZ){
event.cancelBubble = true;
event.preventDefault();
event.stopPropagation();
if(object.onclick)object.onclick();
else window.location=object.href;
}else if(isHB){
object.click();
return false;
};}
function addHotKey(id,key){
if(document.getElementById(id)&&key){
hotKeys[key]=document.getElementById(id);
return true;
}else{
alert('ERROR: Id или Key не существует');
return false;
};}
function remHotKey(key){
if(hotKeys[key])hotKeys[key]=null;
else return false;
}
function oneHotKey(id,key){
if(addHotKey(id,key))oneHotKeys[key]=true;
}
Вернуться к началу
Посмотреть профиль Отправить личное сообщение Посетить сайт автора ICQ Number
Евгений Галашин
Модератор



Зарегистрирован: 29.12.2003
Сообщ.: 1862
Карма: 30
   поощрить/наказать


СообщениеДобавлено: Сб Апр 30, 2005 8:32 am (спустя 8 часов 16 минут; написано за 22 секунды)
   Заголовок сообщения:
Ответить с цитатой

Ivan Shumkov писал(а):
Давайте вместе доведем до ума.
Давайте для начала отформатируем код с отступами (-;
Вернуться к началу
Посмотреть профиль Отправить личное сообщение ICQ Number
Миша Спларов
Участник форума



Зарегистрирован: 17.11.2003
Сообщ.: 799
Карма: 63
   поощрить/наказать

Откуда: Россия, Томск

СообщениеДобавлено: Сб Апр 30, 2005 10:00 am (спустя 1 час 28 минут; написано за 9 секунд)
   Заголовок сообщения:
Ответить с цитатой

Ivan Shumkov, http://imfo.ru/archive/2005/01/13/keypressevent - может быть поможет.
Вернуться к началу
Посмотреть профиль Отправить личное сообщение ICQ Number
Иван Шумков
Участник форума



Зарегистрирован: 30.12.2004
Сообщ.: 229
Карма: 6
   поощрить/наказать

Откуда: Россия, Санкт-Петербург

СообщениеДобавлено: Сб Апр 30, 2005 1:37 pm (спустя 3 часа 37 минут; написано за 4 минуты 7 секунд)
   Заголовок сообщения:
Ответить с цитатой

Евгений Галашин
Хорошо :). Так храню код только для уменьшения размера файла.
Немного подправил код, но с ошибкой Opera не справиться.
Код (JavaScript): скопировать код в буфер обмена
var isDOM=document.getElementById
var isHB=isDOM&&document.all
var isOpera=window.opera&&isDOM
var isMZ=isDOM&&navigator.appName=="Netscape"

window.onload = function(){
  loadHotKeys()
}

var hotKeys=[];
var oneHotKeys=[];
function loadHotKeys() {
  if(a=document.getElementsByTagName('a')){
    for(i=0;i<a.length;i++){
      if(accesskey=a[i].accessKey)hotKeys[accesskey]=a[i];
    }
    input=document.getElementsByTagName('input');
    for(i=0;i<input.length;i++){
      if(accesskey=input[i].accessKey)hotKeys[accesskey]=input[i];
    };
  };
}

if(isHB){
  document.onkeydown=function(){return hotKey(event)}
}else if(isMZ){
  document.addEventListener("keypress",function(ev){hotKey(ev)},true);
   document.addEventListener("keyup",function(ev){hotKey(ev)},true);
}

function hotKey(event){
  key=event.keyCode;
  if(key==0)key=event.charCode;
  if (event.ctrlKey){
    letter=String.fromCharCode(key).toLowerCase();
    if(hotKeys[letter])return _doHotKey(hotKeys[letter],event);
  }else if(hotKeys[key]){
    _doHotKey(hotKeys[key],event);
    if(oneHotKeys[key]){
      remHotKey(key);
      oneHotKeys[key]=null;
    };
    return false;
  };
}
function _doHotKey(object,event){
  if(isMZ){
    event.preventDefault();
    if(object.onclick)object.onclick();
    else window.location=object.href;
  }else if(isHB){
    if(isOpera)event.preventDefault();
    object.click();
    if(isIE)return false;
  };
}
function addHotKey(id,key){
  if(document.getElementById(id)&&key){
    hotKeys[key]=document.getElementById(id);
    return true;
  }else{
    alert('ERROR: Id или Key не существует');
    return false;
  };
}
function remHotKey(key){
  if(hotKeys[key])hotKeys[key]=null;
  else return false;
}
function oneHotKey(id,key){
   if(addHotKey(id,key))oneHotKeys[key]=true;
}
Вернуться к началу
Посмотреть профиль Отправить личное сообщение Посетить сайт автора ICQ Number
Дмитрий Кóтеров
Администратор



Зарегистрирован: 10.03.2003
Сообщ.: 13553
Карма: 405
   поощрить/наказать


СообщениеДобавлено: Чт Мая 05, 2005 4:08 pm (спустя 5 дней 2 часа 31 минуту; написано за 23 секунды)
   Заголовок сообщения:
Ответить с цитатой


М

Ivan Shumkov писал(а):
Давайте вместе доведем до ума.
Уверены, что этому коду место в "Готовых решениях"?
Вы его на каком-нибудь своем проекте применяете?
Вернуться к началу
Посмотреть профиль Отправить личное сообщение Отправить e-mail Посетить сайт автора
Иван Шумков
Участник форума



Зарегистрирован: 30.12.2004
Сообщ.: 229
Карма: 6
   поощрить/наказать

Откуда: Россия, Санкт-Петербург

СообщениеДобавлено: Чт Мая 05, 2005 10:08 pm (спустя 6 часов 1 секунду; написано за 59 секунд)
   Заголовок сообщения:
Ответить с цитатой

Дмитрий Кóтеров
Делаю редизайн для geometria.ru, там и планирую использовать.
zone.geometria.ru/html
Вернуться к началу
Посмотреть профиль Отправить личное сообщение Посетить сайт автора ICQ Number
Гость






Карма: 367
   поощрить/наказать


СообщениеДобавлено: Пт Июн 03, 2005 7:12 pm (спустя 28 дней 21 час 3 минуты; написано за 10 минут 27 секунд)
   Заголовок сообщения:
Ответить с цитатой

Оформил в виде класса.
Изменил функцию добавления хоткея.

Инициализация
Код (JavaScript): скопировать код в буфер обмена
window.onload = function() {
  var myHotkey = new Hotkey;
}
Скрипт пробегает по странице и собирает у ссылок и инпутов атрибуты accesskey.
Значения атрибутов становятся хоткеями. Тоесть Ctrl+accesskey.

Создать хоткей:
Код (JavaScript): скопировать код в буфер обмена
myHotkey.Add(function(){alert(1)}, 27);
myHotkey.Add(document.getElementById('link1'), 27);
Первый параметр обьект (кнопка, ссылка или любой другой объект с onclick), либо функция.
Второй параметри код кнопки. В данном случае Esc.

Создать хоткей, который сработает только один раз:
Код (JavaScript): скопировать код в буфер обмена
myHotkey.One(function(){alert(1)}, 27);
Параметры такие же как и у функции Add.

Удалить хоткей
Код (JavaScript): скопировать код в буфер обмена
myHotkey.Rem(27);
Параметр - код клавиши на котором был хоткей.

Вот сам класс:
Код (JavaScript): скопировать код в буфер обмена
var isDOM=document.getElementById
var isHB=isDOM&&document.all
var isOpera=window.opera&&isDOM
var isMZ=isDOM&&navigator.appName=="Netscape"

function Hotkey() {
        var hotKeys = [];
        var oneHotKeys = [];
       
        var a = document.getElementsByTagName('a');
        if (a) {
                for (var i = 0; i < a.length; i++) {
                        var accesskey = a[i].accessKey;
                        if (accesskey) hotKeys[accesskey] = a[i];
        }
        var input = document.getElementsByTagName('input');
                for (var i = 0; i < input.length; i++) {
                        var accesskey = input[i].accessKey;
                        if (accesskey) hotKeys[accesskey] = input[i];
                }
        }

        if (isHB) document.onkeydown = function(){return KeyDown(event)}
        else if (isMZ) document.addEventListener("keypress", function(ev){KeyDown(ev)}, true);
       
        function KeyDown(event) {
                var key = event.keyCode || event.charCode;
                if (event.ctrlKey) {
                        var letter = String.fromCharCode(key).toLowerCase();
                        if (hotKeys[letter]) return Do(hotKeys[letter], event);
                } else if (hotKeys[key]) {
                        Do(hotKeys[key], event);
                        if (oneHotKeys[key]) {
                                Rem(key);
                                oneHotKeys[key] = null;
                        }
                        return false;
                }
        }

        function Do(object, event) {
                if (typeof object == 'function') {
                        object();
                } else {
                        if (isMZ) {
                                event.preventDefault();
                                if (object.onclick) object.onclick();
                                else window.location = object.href;
                        }        else if (isHB) {
                                if (isOpera) event.preventDefault();
                                object.click();
                                if (isIE) return false;
                        }
                }
        }

        this.Add = function(obj, key) {
                        if (typeof obj == 'function' || typeof obj == 'object') {
                                hotKeys[key] = obj;
                                return true;
                        } else {
                                alert('ERROR: Установить можно только объект или функцию.');
                                return false;
                        }
        }

        Rem = this.Rem = function(key) {
                if (hotKeys[key]) hotKeys[key] = null;
                else return false;
        }

        this.One = function(id, key) {
                if (this.Add(id, key)) oneHotKeys[key]=true;
        }
}
Вернуться к началу
Иван Шумков
Участник форума



Зарегистрирован: 30.12.2004
Сообщ.: 229
Карма: 6
   поощрить/наказать

Откуда: Россия, Санкт-Петербург

СообщениеДобавлено: Пт Июн 03, 2005 7:22 pm (спустя 10 минут; написано за 25 секунд)
   Заголовок сообщения:
Ответить с цитатой

Ой, простите, забыл залогиниться.
Вернуться к началу
Посмотреть профиль Отправить личное сообщение Посетить сайт автора ICQ Number
reuse
Заглянувший



Зарегистрирован: 09.06.2005
Сообщ.: 4
Карма: -1
   поощрить/наказать


СообщениеДобавлено: Чт Июн 09, 2005 9:52 am (спустя 5 дней 14 часов 29 минут; написано за 3 минуты 11 секунд)
   Заголовок сообщения: Выловлена ошибка
Ответить с цитатой

Удобно использовать это решение. Легко прикручивается.
Но найдена ошибка. Инициализация осуществлялась:
Цитата:
Код (JavaScript): скопировать код в буфер обмена
window.onload = function() {
  var myHotkey = new Hotkey;
}
Скрипт пробегает по странице и собирает у ссылок и инпутов атрибуты accesskey.
Значения атрибутов становятся хоткеями. Тоесть Ctrl+accesskey.
После чего, заполняя данные форм, при нажатии клавиши Backspace,
браузер возвращался на предыдущую страницу, т.е. срабатывала "Back".

Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.7.8) Gecko/20050511 Firefox/1.0.4
Вернуться к началу
Посмотреть профиль Отправить личное сообщение ICQ Number
Иван Шумков
Участник форума



Зарегистрирован: 30.12.2004
Сообщ.: 229
Карма: 6
   поощрить/наказать

Откуда: Россия, Санкт-Петербург

СообщениеДобавлено: Чт Июн 09, 2005 12:17 pm (спустя 2 часа 25 минут; написано за 1 минуту 8 секунд)
   Заголовок сообщения:
Ответить с цитатой

reuse писал(а):
window.onload = function() {
  var myHotkey = new Hotkey;
}
Спасибо! Опечатался, надо без var. Иначе в глобальной видимости не видно myHotkey.

Инициализация:
Код (JavaScript): скопировать код в буфер обмена
window.onload = function() {
  myHotkey = new Hotkey;
}
Вернуться к началу
Посмотреть профиль Отправить личное сообщение Посетить сайт автора ICQ Number
reuse
Заглянувший



Зарегистрирован: 09.06.2005
Сообщ.: 4
Карма: -1
   поощрить/наказать


СообщениеДобавлено: Чт Июн 09, 2005 12:48 pm (спустя 30 минут; написано за 2 минуты 15 секунд)
   Заголовок сообщения:
Ответить с цитатой

Ivan Shumkov писал(а):
Опечатался, надо без var
Это не решает проблемы с клавишей Backspace и возвратом на предыдущую страницу,
при редактировании полей в форме.
Вернуться к началу
Посмотреть профиль Отправить личное сообщение ICQ Number
Иван Шумков
Участник форума



Зарегистрирован: 30.12.2004
Сообщ.: 229
Карма: 6
   поощрить/наказать

Откуда: Россия, Санкт-Петербург

СообщениеДобавлено: Чт Июн 09, 2005 12:55 pm (спустя 6 минут; написано за 35 секунд)
   Заголовок сообщения:
Ответить с цитатой

reuse
Хм. Пробывал в Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.7.7) Gecko/20050414 Firefox/1.0.3

Все отлично работает. Вы не могли бы выложить вашу страницу в интернет?
Вернуться к началу
Посмотреть профиль Отправить личное сообщение Посетить сайт автора ICQ Number
Иван Шумков
Участник форума



Зарегистрирован: 30.12.2004
Сообщ.: 229
Карма: 6
   поощрить/наказать

Откуда: Россия, Санкт-Петербург

СообщениеДобавлено: Пт Июн 10, 2005 3:10 am (спустя 14 часов 15 минут; написано за 22 секунды)
   Заголовок сообщения:
Ответить с цитатой

reuse
Поставил Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.7.8) Gecko/20050511 Firefox/1.0.4
как и у вас. Проблемы с клавищей Backspace не наблюдаю.
Вернуться к началу
Посмотреть профиль Отправить личное сообщение Посетить сайт автора ICQ Number
reuse
Заглянувший



Зарегистрирован: 09.06.2005
Сообщ.: 4
Карма: -1
   поощрить/наказать


СообщениеДобавлено: Пт Июн 10, 2005 8:26 am (спустя 5 часов 15 минут; написано за 1 минуту 19 секунд)
   Заголовок сообщения:
Ответить с цитатой

Ivan Shumkov
Сейчас я проверю на обычной странице.
Backspace срабатывает в системе управления продажами. Возможно был конфликт с чем-то.
Вернуться к началу
Посмотреть профиль Отправить личное сообщение ICQ Number
Иван Шумков
Участник форума



Зарегистрирован: 30.12.2004
Сообщ.: 229
Карма: 6
   поощрить/наказать

Откуда: Россия, Санкт-Петербург

СообщениеДобавлено: Пт Июн 10, 2005 1:07 pm (спустя 4 часа 41 минуту; написано за 57 секунд)
   Заголовок сообщения:
Ответить с цитатой

reuse
Я думаю что конфликт. Я проверил на всех элементах форм и не увидел подобной ошибки.
Вернуться к началу
Посмотреть профиль Отправить личное сообщение Посетить сайт автора ICQ Number
reuse
Заглянувший



Зарегистрирован: 09.06.2005
Сообщ.: 4
Карма: -1
   поощрить/наказать


СообщениеДобавлено: Пн Июн 13, 2005 9:19 am (спустя 2 дня 20 часов 12 минут; написано за 1 минуту 24 секунды)
   Заголовок сообщения:
Ответить с цитатой

Ivan Shumkov
Да, точно конфликт. Прошу прощения за ложную тревогу.
Будем разбираться в чем проблема.
Вернуться к началу
Посмотреть профиль Отправить личное сообщение ICQ Number
kukutz
Заглянувший



Зарегистрирован: 19.02.2005
Сообщ.: 5
Карма: 1
   поощрить/наказать


СообщениеДобавлено: Пн Июн 13, 2005 3:51 pm (спустя 6 часов 31 минуту; написано за 2 минуты 35 секунд)
   Заголовок сообщения:
Ответить с цитатой

Чтобы отменить дефолтное поведение клавиш в Опере (например, в восьмой), нужно:
1. вешать обработчика на onkeypress
2. в нём делать
Код (JavaScript): скопировать код в буфер обмена
    e.cancelBubble = true;
    e.preventDefault();
    e.stopPropagation();
    e.returnValue = false;
    return false;
e - обьект события.

Возможно, какие-то из строк лишние, в моём коде для всех трёх браузеров это выглядит так:
Код (JavaScript): скопировать код в буфер обмена
    if (isMZ || isO8) {
     e.cancelBubble = true;
     e.preventDefault();
     e.stopPropagation();
    }
    e.returnValue = false;
    return false;
Вернуться к началу
Посмотреть профиль Отправить личное сообщение
Иван Шумков
Участник форума



Зарегистрирован: 30.12.2004
Сообщ.: 229
Карма: 6
   поощрить/наказать

Откуда: Россия, Санкт-Петербург

СообщениеДобавлено: Пн Июн 13, 2005 4:43 pm (спустя 52 минуты; написано за 7 минут 23 секунды)
   Заголовок сообщения:
Ответить с цитатой

kukutz
Спасибо большое.

Ошибка с дефолтными клавишами Оперы исправлена. Подчистил код.

reuse, попробуйте этот код. Вроде не должно быть конфликтов.

Исправленный код:
Код (JavaScript): скопировать код в буфер обмена
function Hotkey() {
  var hotKeys = [];
  var oneHotKeys = [];
  var a = document.getElementsByTagName('a');
  var input = document.getElementsByTagName('input');
  if (a) {
    for (var i = 0; i < a.length; i++) {
      var accesskey = a[i].accessKey;
      if (accesskey) hotKeys[accesskey] = a[i];
    }
  }
  if (input) {
    for (var i = 0; i < input.length; i++) {
      var accesskey = input[i].accessKey;
      if (accesskey) hotKeys[accesskey] = input[i];
    }
  }
  if (isIE) document.attachEvent('onkeydown', function(){return KeyDown(event)});
  else document.addEventListener('keypress', function(ev){KeyDown(ev)}, true);
  function KeyDown(event) {
    var key = event.keyCode || event.charCode;
    if (event.ctrlKey) {
      var letter = String.fromCharCode(key).toLowerCase();
      if (hotKeys[letter]) return Do(hotKeys[letter], event);
    } else if (hotKeys[key]) {
      Do(hotKeys[key], event);
      if (oneHotKeys[key]) {
        Rem(key);
        oneHotKeys[key] = null;
      }
      return false;
    }
  }
  function Do(object, event) {
    if (typeof object == 'function') object();
    else {
      if (isIE) object.click();
      else {
        event.cancelBubble = true;
        event.preventDefault();
        event.stopPropagation();
        if (object.onclick) object.onclick();
        else window.location = object.href;
      }
      event.returnValue = false;
      return false;
    }
  }
  this.Add = function(obj, key) {
    if (typeof obj == 'function' || typeof obj == 'object') {
      hotKeys[key] = obj;
      return true;
    } else {
      alert('ERROR: Установить можно только объект или функцию.');
      return false;
    }
  }
  Rem = this.Rem = function(key) {
    if (hotKeys[key]) hotKeys[key] = null;
    else return false;
  }
  this.One = function(id, key) {
    if (this.Add(id, key)) oneHotKeys[key]=true;
  }
}
Вернуться к началу
Посмотреть профиль Отправить личное сообщение Посетить сайт автора ICQ Number
Иван Шумков
Участник форума



Зарегистрирован: 30.12.2004
Сообщ.: 229
Карма: 6
   поощрить/наказать

Откуда: Россия, Санкт-Петербург

СообщениеДобавлено: Ср Авг 10, 2005 6:21 am (спустя 1 месяц 26 дней 13 часов 37 минут; написано за 48 секунд)
   Заголовок сообщения:
Ответить с цитатой

Запуск:
Код (JavaScript): скопировать код в буфер обмена
window.onload = Hotkey.Init();
Код (JavaScript): скопировать код в буфер обмена
/*

        Hotkey, v. 1.1
        (c) 2005, Ivan Shumkov (ivan@shumkov.ru)

*/



(Hotkey = {
        hotKeys : [],
        oneHotKeys : [],
        Init : function($a, $input) {
                var a = document.getElementsByTagName('a');
                var input = document.getElementsByTagName('input');
               
                if (a) {
                        for (var i = 0; i < a.length; i++) {
                                var accesskey = a[i].accessKey;
                                if (accesskey) Hotkey.hotKeys[accesskey] = a[i];
                                alert(1);
                        }
                }
                if (input) {
                        for (var i = 0; i < input.length; i++) {
                                var accesskey = input[i].accessKey;
                                if (accesskey) Hotkey.hotKeys[accesskey] = input[i];
                                alert(2);
                        }
                }
               
                if (window.isIE) document.attachEvent('onkeydown', function(){return Hotkey.KeyDown(event)});
                else document.addEventListener('keypress', function(ev){Hotkey.KeyDown(ev)}, true);
        },
        KeyDown : function (event) {
                var key = event.keyCode || event.charCode;
                if (event.ctrlKey) {
                        var letter = String.fromCharCode(key).toLowerCase();
                        if (Hotkey.hotKeys[letter]) return Hotkey.Do(Hotkey.hotKeys[letter], event);
                } else if (Hotkey.hotKeys[key]) {
                        Hotkey.Do(Hotkey.hotKeys[key], event);
                        if (Hotkey.oneHotKeys[key]) {
                                Hotkey.Rem(key);
                                Hotkey.oneHotKeys[key] = null;
                        }
                        return false;
                }
        },
        Do : function (object, event) {
                if (typeof object == 'function') object();
                else {
                        if (window.isIE) object.click();
                        else {
                     event.cancelBubble = true;
                     event.preventDefault();
                     event.stopPropagation();
                     if (object.onclick) object.onclick();
                                else window.location = object.href;
                        }
                        event.returnValue = false;
                        return false;
                }
        },
        Add : function(obj, key) {
                        if (typeof obj == 'function' || typeof obj == 'object') {
                                Hotkey.hotKeys[key] = obj;
                                return true;
                        } else {
                                alert('ERROR: Установить можно только объект или функцию.');
                                return false;
                        }
        },
        Rem : function(key) {
                if (Hotkey.hotKeys[key]) Hotkey.hotKeys[key] = null;
                else return false;
        },
        One : function(id, key) {
                if (Hotkey.Add(id, key)) Hotkey.oneHotKeys[key]=true;
        }
})();
Вернуться к началу
Посмотреть профиль Отправить личное сообщение Посетить сайт автора ICQ Number
Иван Шумков
Участник форума



Зарегистрирован: 30.12.2004
Сообщ.: 229
Карма: 6
   поощрить/наказать

Откуда: Россия, Санкт-Петербург

СообщениеДобавлено: Ср Авг 10, 2005 7:24 am (спустя 1 час 2 минуты; написано за 43 секунды)
   Заголовок сообщения:
Ответить с цитатой

Прошу прощения, вот исправленная:
Код (JavaScript): скопировать код в буфер обмена
/*

        Hotkey, v. 1.1
        (c) 2005, Ivan Shumkov (ivan@shumkov.ru)

*/



(Hotkey = {
        hotKeys : [],
        oneHotKeys : [],
        Init : function($a, $input) {
                var a = document.getElementsByTagName('a');
                var input = document.getElementsByTagName('input');
               
                if (a) {
                        for (var i = 0; i < a.length; i++) {
                                var accesskey = a[i].accessKey;
                                if (accesskey) Hotkey.hotKeys[accesskey] = a[i];
                        }
                }
                if (input) {
                        for (var i = 0; i < input.length; i++) {
                                var accesskey = input[i].accessKey;
                                if (accesskey) Hotkey.hotKeys[accesskey] = input[i];
                        }
                }
               
                if (window.isIE) document.attachEvent('onkeydown', function(){return Hotkey.KeyDown(event)});
                else document.addEventListener('keypress', function(ev){Hotkey.KeyDown(ev)}, true);
        },
        KeyDown : function (event) {
                var key = event.keyCode || event.charCode;
                if (event.ctrlKey) {
                        var letter = String.fromCharCode(key).toLowerCase();
                        if (Hotkey.hotKeys[letter]) return Hotkey.Do(Hotkey.hotKeys[letter], event);
                } else if (Hotkey.hotKeys[key]) {
                        Hotkey.Do(Hotkey.hotKeys[key], event);
                        if (Hotkey.oneHotKeys[key]) {
                                Hotkey.Rem(key);
                                Hotkey.oneHotKeys[key] = null;
                        }
                        return false;
                }
        },
        Do : function (object, event) {
                if (typeof object == 'function') object();
                else {
                        if (window.isIE) object.click();
                        else {
                     event.cancelBubble = true;
                     event.preventDefault();
                     event.stopPropagation();
                     if (object.onclick) object.onclick();
                                else window.location = object.href;
                        }
                        event.returnValue = false;
                        return false;
                }
        },
        Add : function(obj, key) {
                        if (typeof obj == 'function' || typeof obj == 'object') {
                                Hotkey.hotKeys[key] = obj;
                                return true;
                        } else {
                                alert('ERROR: Установить можно только объект или функцию.');
                                return false;
                        }
        },
        Rem : function(key) {
                if (Hotkey.hotKeys[key]) Hotkey.hotKeys[key] = null;
                else return false;
        },
        One : function(id, key) {
                if (Hotkey.Add(id, key)) Hotkey.oneHotKeys[key]=true;
        }
});
Вернуться к началу
Посмотреть профиль Отправить личное сообщение Посетить сайт автора ICQ Number
Иван Шумков
Участник форума



Зарегистрирован: 30.12.2004
Сообщ.: 229
Карма: 6
   поощрить/наказать

Откуда: Россия, Санкт-Петербург

СообщениеДобавлено: Вт Окт 11, 2005 12:18 am (спустя 2 месяца 16 часов 54 минуты; написано за 14 секунд)
   Заголовок сообщения:
Ответить с цитатой

Код (JavaScript): скопировать код в буфер обмена
/*

        Hotkey, v. 1.2
        (c) 2005, Ivan Shumkov (ivan@shumkov.ru)

*/



(Hotkey = {
        hotKeys : [],
        oneHotKeys : [],
        Init : function($a, $input) {
                var a = document.getElementsByTagName('a');
                var input = document.getElementsByTagName('input');
               
                if (a) {
                        for (var i = 0; i < a.length; i++) {
                                var accesskey = a[i].accessKey;
                                if (accesskey) Hotkey.hotKeys[accesskey] = a[i];
                        }
                }
                if (input) {
                        for (var i = 0; i < input.length; i++) {
                                var accesskey = input[i].accessKey;
                                if (accesskey) Hotkey.hotKeys[accesskey] = input[i];
                        }
                }
               
                if (window.isIE) document.attachEvent('onkeydown', function(){return Hotkey.KeyDown(event)});
                else document.addEventListener('keypress', function(ev){Hotkey.KeyDown(ev)}, true);
        },
        KeyDown : function (event) {
                var key = event.keyCode || event.charCode;
                if (event.ctrlKey) {
                        var letter = String.fromCharCode(key).toLowerCase();
                        if (Hotkey.hotKeys[letter]) return Hotkey.Do(Hotkey.hotKeys[letter], event);
                } else if (Hotkey.hotKeys[key]) {
                        Hotkey.Do(Hotkey.hotKeys[key], event);
                        if (Hotkey.oneHotKeys[key]) {
                                Hotkey.Rem(key);
                                Hotkey.oneHotKeys[key] = null;
                        }
                        return false;
                }
        },
        Do : function (object, event) {
                if (typeof object == 'function') object();
                else {
                        if (window.isIE) object.click();
                        else {
                     event.cancelBubble = true;
                     event.preventDefault();
                     event.stopPropagation();
                     if (object.nodeName == 'INPUT') object.click();
                     else if (object.onclick) object.onclick();
                                else window.location = object.href;
                        }
                        event.returnValue = false;
                        return false;
                }
        },
        Add : function(obj, key) {
                        if (typeof obj == 'function' || typeof obj == 'object') {
                                Hotkey.hotKeys[key] = obj;
                                return true;
                        } else {
                                alert('ERROR: Установить можно только объект или функцию.');
                                return false;
                        }
        },
        Rem : function(key) {
                if (Hotkey.hotKeys[key]) Hotkey.hotKeys[key] = null;
                else return false;
        },
        One : function(id, key) {
                if (Hotkey.Add(id, key)) Hotkey.oneHotKeys[key]=true;
        }
});
Вернуться к началу
Посмотреть профиль Отправить личное сообщение Посетить сайт автора ICQ Number
Иван Шумков
Участник форума



Зарегистрирован: 30.12.2004
Сообщ.: 229
Карма: 6
   поощрить/наказать

Откуда: Россия, Санкт-Петербург

СообщениеДобавлено: Чт Dec 29, 2005 8:31 pm (спустя 2 месяца 18 дней 20 часов 13 минут; написано за 17 секунд)
   Заголовок сообщения:
Ответить с цитатой

Код (JavaScript): скопировать код в буфер обмена
/*

        Hotkey, v. 1.7
        (c) 2005, Ivan Shumkov (ivan@shumkov.ru)

*/


(Hotkey = {

        _hotKeys : {},
        _oneHotKeys : {},
        hotElements : ['a', 'input'],

        Init : function() {
                for (i = 0; i < this.hotElements.length;i++) {
                        var e = document.getElementsByTagName(this.hotElements[i]);
                        if (e)
                                for (var i = 0; i < e.length; i++)
                                        if (e[i].accessKey) this.Add(e[i], e[i].accessKey);
                }
                if (document.attachEvent) document.attachEvent('onkeydown', function(){return Hotkey.KeyDown(event)});
                else document.addEventListener('keypress', function(ev){Hotkey.KeyDown(ev)}, true);
        },
        Add : function(obj, key, keycode) {
                        if (typeof(obj) == 'function' || typeof(obj) == 'object') {
                                if (!keycode) key = key.charCodeAt()
                                this._hotKeys[key] = obj;
                                return key;
                        } else return false;
        },
        AddOne : function(object, key, keycode) {
                mKey = this.Add(object, key, keycode);
                if (mKey) this._oneHotKeys[mKey]=true;
        },
        Rem : function(key) {
                if (this._hotKeys[key]) {
                        delete this._hotKeys[key];
                        if (this._oneHotKeys[key]) delete this._oneHotKeys[key];
                        return true;
                }
                else return false;
        },
        KeyDown : function (event) {
                if (event.ctrlKey) {
                        var key = event.keyCode || event.charCode;               
                        if (this._hotKeys[key]) {
                                if (typeof(this._hotKeys[key]) == 'function') this._hotKeys[key]();
                                else {
                                        if (window.isIE) this._hotKeys[key].click();
                                        else {
                                     event.cancelBubble = true;
                                     event.preventDefault();
                                     event.stopPropagation();
                                     if (this._hotKeys[key].nodeName == 'INPUT') this._hotKeys[key].click();
                                     else if (this._hotKeys[key].onclick) this._hotKeys[key].onclick();
                                                else window.location = object.href;
                                        }
                                        event.returnValue = false;
                                }
                                if (this._oneHotKeys[key]) this.Rem(key);
                                return false;
                        }
                }
        }
});
Вернуться к началу
Посмотреть профиль Отправить личное сообщение Посетить сайт автора ICQ Number
Иван Шумков
Участник форума



Зарегистрирован: 30.12.2004
Сообщ.: 229
Карма: 6
   поощрить/наказать

Откуда: Россия, Санкт-Петербург

СообщениеДобавлено: Сб Апр 08, 2006 8:00 pm (спустя 3 месяца 9 дней 23 часа 29 минут; написано за 9 секунд)
   Заголовок сообщения: 1.8
Ответить с цитатой

Код (JavaScript): скопировать код в буфер обмена
/*

        Hotkey, v. 1.8
        (c) 2005, Ivan Shumkov (ivan@shumkov.ru)

*/


(Hotkey = {

        _hotKeys : {},
        _oneHotKeys : {},
        hotElements : ['a', 'input'],

        Init : function() {
                for (i = 0; i < this.hotElements.length;i++) {
                        var e = document.getElementsByTagName(this.hotElements[i])
                        if (e) for (var k = 0; k < e.length; k++) if (e[k].accessKey) this.Add(e[k], e[k].accessKey)
                }
                if (document.attachEvent) document.attachEvent('onkeydown', function(){return Hotkey.KeyDown(event)})
          else document.addEventListener('keypress', function(ev){Hotkey.KeyDown(ev)}, true)
        },
        Add : function(obj, key, keycode) {
                if (typeof(obj) == 'function' || typeof(obj) == 'object') {
                        if (!keycode) key = key.charCodeAt()
                        this._hotKeys[key] = obj
                        return key
                } else return false
        },
        AddOne : function(object, key, keycode) {
                mKey = this.Add(object, key, keycode)
                if (mKey) this._oneHotKeys[mKey]=true
        },
        Rem : function(key) {
                if (this._hotKeys[key]) {
                        delete this._hotKeys[key]
                        if (this._oneHotKeys[key]) delete this._oneHotKeys[key]
                        return true
                }
                else return false
        },
        KeyDown : function (event) {
                if (event.ctrlKey) {
                        var key = event.keyCode? event.keyCode + 32 : event.charCode
                        if (this._hotKeys[key]) {
                                if (typeof(this._hotKeys[key]) == 'function') this._hotKeys[key]()
                                else {
                                        if (this._hotKeys[key].click) this._hotKeys[key].click()
                                        else {
                                     if (this._hotKeys[key].nodeName == 'INPUT') this._hotKeys[key].click()
                                     else if (this._hotKeys[key].onclick) this._hotKeys[key].onclick()
                                                else window.location = object.href
                                        }
                                        if (event.preventDefault) {
                                                event.returnValue = false
                                                event.cancelBubble = true
                                     event.preventDefault()
                                     event.stopPropagation()
                             }
                                }
                                if (this._oneHotKeys[key]) this.Rem(key)
                                return false
                        }
                }
        }
});
Вернуться к началу
Посмотреть профиль Отправить личное сообщение Посетить сайт автора ICQ Number
Показать сообщения:   
Начaть нoвую тeму   Ответить на тему Часовой пояс: GMT + 3 (Москва)
Страница 1 из 1   
Вы не можете начинать темы. Вы не можете отвечать на сообщения. Вы не можете редактировать свои сообщения. Вы не можете удалять свои сообщения. Вы не можете голосовать в опросах. Вы не можете прилагать файлы к сообщениям. Вы можете скачивать файлы.
  XML