Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 30.03.2013, 15:03
Аспирант
Отправить личное сообщение для Benos Посмотреть профиль Найти все сообщения от Benos
 
Регистрация: 09.01.2012
Сообщений: 48

[FF+GM] Проверьте пжл. скрипт(не могу найти ошибку)
День добрый!
Сваял скрипт, но что то не пашет(т.е. пашет, но частично) не могу определить где ошибся посмотрите пжл.
Буду очень благодарен.

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

собственно код:
// массив горячих клавиш
var ArrayKey = [' F1',' F2',' F4',' F8',' F9',' F12'];
// массив кодов горячих клавиш
var ArrayCodeKey = [112, 113, 115, 119, 120, 123];
// массив текстов кнопок на сайте
var ArrayNameBut = ['Вперед',
                    'Назад',
                    'Закрыть',
                    'Открыть',
                    'Поиск',
                    'Выйти',
                    'Добавить',
                    'Удалить',
                    'Обновить'];
    
document.getElementById('mainbox').onload = GUI_Key;
document.onkeyup = testAlert; 

// функция переписывает название кнопок и добавления атрибута
function GUI_Key(){ 
    var NumButKey = 0; // задаем начальный элемент перебора
    var ButtomArrayTag = document.getElementById('mainbox').contentWindow.document.getElementsByTagName('input');
    for(i=0; i<ButtomArrayTag.length; i++){
        for(a=0; a<ArrayNameBut.length; a++){
            if(ButtomArrayTag[i].value.toString() == ArrayNameBut[a]){ // определяем название кнопки
               ButtomArrayTag[i].value = ButtomArrayTag[i].value+ArrayKey[NumButKey]; // переименовываем название кнопки было "Вперед" стало "Вперед F1" и т.д.
               ButtomArrayTag[i].setAttribute('modid', ArrayCodeKey[NumButKey]); // задаем в код кнопки атрибут по порядковому номеру NumButKey (F1 - 112  и т.д.)
               NumButKey++; // переход на следующий элемент
            }
        }
    }
}

// функция обработки нажатой клавиши (при нажатии кнопки проверяем код кнопки и код атрибута, если совпал то кликаем
function testAlert(event){
     var testId = document.getElementById('mainbox').contentWindow.document.getElementsByTagName('input');
     for(i=0; i <testId.length; i++){
        if(testId[i].hasAttribute('modid') && testId[i].getAttribute('modid') == event.keyCode){
            testId[i].click();
            //alert(event.keyCode+' '+testId[i].getAttribute('modid'));
        }
     break;            
     }  
}

по факту выходит следующее:
1. Название кнопок переписывается нормально(все кнопки переименовываются как нужно)
2. Вызов кнопок идет не корректно. Всегда вызывается кнопка идущая первая на сайте.

При тесте через:
alert(event.keyCode+' '+testId[i].getAttribute('modid'));

Видно что, атрибут 'modid' всегда постоянный и соответствует первому значению из массива ArrayCodeKey, а именно 112
т.е. при нажатии на любую кнопку видим алерт:
При клике F1 112 112
При клике F2 113 112
и т.д.

Похоже ошибка в установке аттрибута?
Ответить с цитированием
  #2 (permalink)  
Старый 30.03.2013, 15:51
Аватар для danik.js
Профессор
Отправить личное сообщение для danik.js Посмотреть профиль Найти все сообщения от danik.js
 
Регистрация: 11.09.2010
Сообщений: 8,804

А к чему все эти пляски с какими-то непонятными атрибутами?

var keyCodes = {
    112 : 'F1',
    113 : 'F2',
    ..
}

var buttonKeys = {
    'Вперед' : 'F1',
    'Назад' : 'F2',
    ..
}

// сопоставляет клавиши (F1, F2, ..) элементам
var keyMap = {};

var buttons = document.getElementsByTagName('input');
for (var i = 0, button; button = buttons[i]; i++) {
    if (button.value in buttonKeys) {
        // меняем надпись ..
        // {'F1': this, ..}
        keyMap[ buttonKeys[button.value] ] = this;
    }
}

document.onkeydown = function(e) {
    var key = keyCodes[e.keyCode];
    if (key in keyMap) {
        var target = keyMap[key];
        target.click();
    }
}


Кстати, события из фрейма не всплывают в родительский документ, если что.
Ответить с цитированием
  #3 (permalink)  
Старый 30.03.2013, 16:07
Аспирант
Отправить личное сообщение для Benos Посмотреть профиль Найти все сообщения от Benos
 
Регистрация: 09.01.2012
Сообщений: 48

Сообщение от danik.js Посмотреть сообщение
А к чему все эти пляски с какими-то непонятными атрибутами?
Задумка в том, что на каждой странице сайта 5 нужных кнопок, в зависимости от типа страницы(каталог, текстовая страница, редактор и т.д.) название кнопок разные... хотел сделать динамическую привязку...
можно в ручную перебрать все... но это муторно и код будет большой... думал избежать этого...
а для вызова нужной кнопки хотел задать атрибиты(для простоты хотел атрибут задать по коду кнопки)... вот тут и возник косяк...

Сообщение от danik.js Посмотреть сообщение
Кстати, события из фрейма не всплывают в родительский документ, если что.
Хм... а можно поподробнее )
Ответить с цитированием
  #4 (permalink)  
Старый 30.03.2013, 16:28
Аватар для danik.js
Профессор
Отправить личное сообщение для danik.js Посмотреть профиль Найти все сообщения от danik.js
 
Регистрация: 11.09.2010
Сообщений: 8,804

Сообщение от Benos
Хм... а можно поподробнее )
Нельзя. Событие возникшее во фрейме не выйдет за его пределы. Куда еще подробнее?

Сообщение от Benos
название кнопок разные
Ну так делай. Только причем тут какие-то атрибуты?
Нашел нужный элемент - запомнил его в каком-нибудь массиве. Верней в хэш-таблице. Затем по нажатию клавишы получаешь нужный элемент (или массив элементов), привязанный к нажатой клавишей. Причем без всяких переборов - просто по ключу.
Ответить с цитированием
  #5 (permalink)  
Старый 30.03.2013, 17:46
Аспирант
Отправить личное сообщение для Benos Посмотреть профиль Найти все сообщения от Benos
 
Регистрация: 09.01.2012
Сообщений: 48

еще бы было бы где нормально описано про Хеш массивы...
смутно представляю структуру...
{ ключ : элемент , ... } так ?
Можно собрать хэш массив таким образом?
HashBut[ArrayCodeKey[NumButKey]] = ButtomArrayTag[i];

Последний раз редактировалось Benos, 30.03.2013 в 19:01.
Ответить с цитированием
Ответ



Опции темы Искать в теме
Искать в теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Не могу найти ошибку nemo4430 Общие вопросы Javascript 6 26.11.2012 23:33
никак не могу найти ошибку. наследование AmniCat Events/DOM/Window 3 17.11.2011 00:50
не могу найти ошибку в коде MasterP Общие вопросы Javascript 1 03.07.2011 02:54
Не могу найти ошибку. Hellp jey7 Events/DOM/Window 2 20.06.2010 10:49
Не могу найти ошибку Lewik AJAX и COMET 4 19.07.2009 21:33