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

Хоткеи (Иван Шумков)
Author Message
Иван Шумков
Участник форума



Joined: 30 Dec 2004
Posts: 229
Карма: 6
   поощрить/наказать

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

PostPosted: Sat Apr 30, 2005 12:15 am (написано за 3 минуты 4 секунды)
   Post subject: Хоткеи
Reply with quote

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

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

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

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

Жду поправок и комментариев. Давайте вместе доведем до ума.
Code (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;
}
Back to top
View user's profile Send private message
Евгений Галашин
Модератор



Joined: 29 Dec 2003
Posts: 1861
Карма: 32
   поощрить/наказать


PostPosted: Sat Apr 30, 2005 8:32 am (спустя 8 часов 16 минут; написано за 22 секунды)
   Post subject:
Reply with quote

Ivan Shumkov wrote:
Давайте вместе доведем до ума.
Давайте для начала отформатируем код с отступами (-;
Back to top
View user's profile Send private message
Миша Спларов
Участник форума



Joined: 17 Nov 2003
Posts: 821
Карма: 65
   поощрить/наказать

Location: Россия, Москва

PostPosted: Sat Apr 30, 2005 10:00 am (спустя 1 час 28 минут; написано за 9 секунд)
   Post subject:
Reply with quote

Ivan Shumkov, imfo.ru/archive/2005/01/13/keypressevent - может быть поможет.
Back to top
View user's profile Send private message
Иван Шумков
Участник форума



Joined: 30 Dec 2004
Posts: 229
Карма: 6
   поощрить/наказать

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

PostPosted: Sat Apr 30, 2005 1:37 pm (спустя 3 часа 37 минут; написано за 4 минуты 7 секунд)
   Post subject:
Reply with quote

Евгений Галашин
Хорошо :). Так храню код только для уменьшения размера файла.
Немного подправил код, но с ошибкой Opera не справиться.
Code (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;
}
Back to top
View user's profile Send private message
Дмитрий Котеров
Администратор



Joined: 10 Mar 2003
Posts: 13665
Карма: 412
   поощрить/наказать


PostPosted: Thu May 05, 2005 4:08 pm (спустя 5 дней 2 часа 31 минуту; написано за 23 секунды)
   Post subject:
Reply with quote


М

Ivan Shumkov wrote:
Давайте вместе доведем до ума.
Уверены, что этому коду место в "Готовых решениях"?
Вы его на каком-нибудь своем проекте применяете?
Back to top
View user's profile Send private message Send e-mail
Иван Шумков
Участник форума



Joined: 30 Dec 2004
Posts: 229
Карма: 6
   поощрить/наказать

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

PostPosted: Thu May 05, 2005 10:08 pm (спустя 6 часов 1 секунду; написано за 59 секунд)
   Post subject:
Reply with quote

Дмитрий Котеров
Делаю редизайн для geometria.ru, там и планирую использовать.
zone.geometria.ru/html
Back to top
View user's profile Send private message
Guest






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


PostPosted: Fri Jun 03, 2005 7:12 pm (спустя 28 дней 21 час 3 минуты; написано за 10 минут 27 секунд)
   Post subject:
Reply with quote

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

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

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

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

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

Вот сам класс:
Code (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;
        }
}
Back to top
Иван Шумков
Участник форума



Joined: 30 Dec 2004
Posts: 229
Карма: 6
   поощрить/наказать

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

PostPosted: Fri Jun 03, 2005 7:22 pm (спустя 10 минут; написано за 25 секунд)
   Post subject:
Reply with quote

Ой, простите, забыл залогиниться.
Back to top
View user's profile Send private message
reuse
Заглянувший



Joined: 09 Jun 2005
Posts: 4
Карма: -1
   поощрить/наказать


PostPosted: Thu Jun 09, 2005 9:52 am (спустя 5 дней 14 часов 29 минут; написано за 3 минуты 11 секунд)
   Post subject: Выловлена ошибка
Reply with quote

Удобно использовать это решение. Легко прикручивается.
Но найдена ошибка. Инициализация осуществлялась:
Quote:
Code (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
Back to top
View user's profile Send private message
Иван Шумков
Участник форума



Joined: 30 Dec 2004
Posts: 229
Карма: 6
   поощрить/наказать

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

PostPosted: Thu Jun 09, 2005 12:17 pm (спустя 2 часа 25 минут; написано за 1 минуту 8 секунд)
   Post subject:
Reply with quote

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

Инициализация:
Code (JavaScript): скопировать код в буфер обмена
window.onload = function() {
  myHotkey = new Hotkey;
}
Back to top
View user's profile Send private message
reuse
Заглянувший



Joined: 09 Jun 2005
Posts: 4
Карма: -1
   поощрить/наказать


PostPosted: Thu Jun 09, 2005 12:48 pm (спустя 30 минут; написано за 2 минуты 15 секунд)
   Post subject:
Reply with quote

Ivan Shumkov wrote:
Опечатался, надо без var
Это не решает проблемы с клавишей Backspace и возвратом на предыдущую страницу,
при редактировании полей в форме.
Back to top
View user's profile Send private message
Иван Шумков
Участник форума



Joined: 30 Dec 2004
Posts: 229
Карма: 6
   поощрить/наказать

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

PostPosted: Thu Jun 09, 2005 12:55 pm (спустя 6 минут; написано за 35 секунд)
   Post subject:
Reply with quote

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

Все отлично работает. Вы не могли бы выложить вашу страницу в интернет?
Back to top
View user's profile Send private message
Иван Шумков
Участник форума



Joined: 30 Dec 2004
Posts: 229
Карма: 6
   поощрить/наказать

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

PostPosted: Fri Jun 10, 2005 3:10 am (спустя 14 часов 15 минут; написано за 22 секунды)
   Post subject:
Reply with quote

reuse
Поставил Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.7.8) Gecko/20050511 Firefox/1.0.4
как и у вас. Проблемы с клавищей Backspace не наблюдаю.
Back to top
View user's profile Send private message
reuse
Заглянувший



Joined: 09 Jun 2005
Posts: 4
Карма: -1
   поощрить/наказать


PostPosted: Fri Jun 10, 2005 8:26 am (спустя 5 часов 15 минут; написано за 1 минуту 19 секунд)
   Post subject:
Reply with quote

Ivan Shumkov
Сейчас я проверю на обычной странице.
Backspace срабатывает в системе управления продажами. Возможно был конфликт с чем-то.
Back to top
View user's profile Send private message
Иван Шумков
Участник форума



Joined: 30 Dec 2004
Posts: 229
Карма: 6
   поощрить/наказать

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

PostPosted: Fri Jun 10, 2005 1:07 pm (спустя 4 часа 41 минуту; написано за 57 секунд)
   Post subject:
Reply with quote

reuse
Я думаю что конфликт. Я проверил на всех элементах форм и не увидел подобной ошибки.
Back to top
View user's profile Send private message
reuse
Заглянувший



Joined: 09 Jun 2005
Posts: 4
Карма: -1
   поощрить/наказать


PostPosted: Mon Jun 13, 2005 9:19 am (спустя 2 дня 20 часов 12 минут; написано за 1 минуту 24 секунды)
   Post subject:
Reply with quote

Ivan Shumkov
Да, точно конфликт. Прошу прощения за ложную тревогу.
Будем разбираться в чем проблема.
Back to top
View user's profile Send private message
kukutz
Заглянувший



Joined: 19 Feb 2005
Posts: 5
Карма: 1
   поощрить/наказать


PostPosted: Mon Jun 13, 2005 3:51 pm (спустя 6 часов 31 минуту; написано за 2 минуты 35 секунд)
   Post subject:
Reply with quote

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

Возможно, какие-то из строк лишние, в моём коде для всех трёх браузеров это выглядит так:
Code (JavaScript): скопировать код в буфер обмена
    if (isMZ || isO8) {
     e.cancelBubble = true;
     e.preventDefault();
     e.stopPropagation();
    }
    e.returnValue = false;
    return false;
Back to top
View user's profile Send private message
Иван Шумков
Участник форума



Joined: 30 Dec 2004
Posts: 229
Карма: 6
   поощрить/наказать

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

PostPosted: Mon Jun 13, 2005 4:43 pm (спустя 52 минуты; написано за 7 минут 23 секунды)
   Post subject:
Reply with quote

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

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

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

Исправленный код:
Code (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;
  }
}
Back to top
View user's profile Send private message
Иван Шумков
Участник форума



Joined: 30 Dec 2004
Posts: 229
Карма: 6
   поощрить/наказать

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

PostPosted: Wed Aug 10, 2005 6:21 am (спустя 1 месяц 26 дней 13 часов 37 минут; написано за 48 секунд)
   Post subject:
Reply with quote

Запуск:
Code (JavaScript): скопировать код в буфер обмена
window.onload = Hotkey.Init();
Code (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;
        }
})();
Back to top
View user's profile Send private message
Иван Шумков
Участник форума



Joined: 30 Dec 2004
Posts: 229
Карма: 6
   поощрить/наказать

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

PostPosted: Wed Aug 10, 2005 7:24 am (спустя 1 час 2 минуты; написано за 43 секунды)
   Post subject:
Reply with quote

Прошу прощения, вот исправленная:
Code (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;
        }
});
Back to top
View user's profile Send private message
Иван Шумков
Участник форума



Joined: 30 Dec 2004
Posts: 229
Карма: 6
   поощрить/наказать

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

PostPosted: Tue Oct 11, 2005 12:18 am (спустя 2 месяца 16 часов 54 минуты; написано за 14 секунд)
   Post subject:
Reply with quote

Code (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;
        }
});
Back to top
View user's profile Send private message
Иван Шумков
Участник форума



Joined: 30 Dec 2004
Posts: 229
Карма: 6
   поощрить/наказать

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

PostPosted: Thu Dec 29, 2005 8:31 pm (спустя 2 месяца 18 дней 20 часов 13 минут; написано за 17 секунд)
   Post subject:
Reply with quote

Code (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;
                        }
                }
        }
});
Back to top
View user's profile Send private message
Иван Шумков
Участник форума



Joined: 30 Dec 2004
Posts: 229
Карма: 6
   поощрить/наказать

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

PostPosted: Sat Apr 08, 2006 8:00 pm (спустя 3 месяца 9 дней 23 часа 29 минут; написано за 9 секунд)
   Post subject: 1.8
Reply with quote

Code (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
                        }
                }
        }
});
Back to top
View user's profile Send private message
Display posts from previous:   
Post new topic   Reply to topic All times are GMT + 3 Hours
Page 1 of 1    Email to a Friend.
You cannot post new topics in this forum. You cannot reply to topics in this forum. You cannot edit your posts in this forum. You cannot delete your posts in this forum. You cannot vote in polls in this forum. You cannot attach files in this forum. You can download files in this forum.
XML