Javascript-форум (https://javascript.ru/forum/)
-   Firefox/Mozilla (https://javascript.ru/forum/css-html-firefox-mizilla/)
-   -   [FF+GM] Проверьте пжл. скрипт(не могу найти ошибку) (https://javascript.ru/forum/css-html-firefox-mizilla/36884-%5Bff-gm%5D-proverte-pzhl-skript-ne-mogu-najjti-oshibku.html)

Benos 30.03.2013 15:03

[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
и т.д.

Похоже ошибка в установке аттрибута?

danik.js 30.03.2013 15:51

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

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();
    }
}


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

Benos 30.03.2013 16:07

Цитата:

Сообщение от danik.js (Сообщение 243466)
А к чему все эти пляски с какими-то непонятными атрибутами?

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

Цитата:

Сообщение от danik.js (Сообщение 243466)
Кстати, события из фрейма не всплывают в родительский документ, если что.

Хм... а можно поподробнее )

danik.js 30.03.2013 16:28

Цитата:

Сообщение от Benos
Хм... а можно поподробнее )

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

Цитата:

Сообщение от Benos
название кнопок разные

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

Benos 30.03.2013 17:46

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


Часовой пояс GMT +3, время: 18:27.