логин: 
<< предыдущая заметкаследующая заметка >>
14 апреля 2010
вопрос по JS

Вот, думаю, реализовать в движке управление шорткеями.

То есть, имея некую функцию function del_x(e){...}, пишешь JS-команду, которая присваивает ее запуск некой комбинации клавиш, типа:

shortkey( 'ctrl+shift+D' , del_x('123') );

И при нажатии этой комбинации функция отрабатывается (скажем, удаляет указанный объект 123). После чего (и даже в ней) шорткей этот можно сбросить или назначить новый или вернуть где-то сохраненный старый.

Что важно: как сделать это технически с клавишами — я очень хорошо понимаю. Хранить коды клавиш и присвоенные им действия в специальном массиве, и при нажатии клавиши проверять, нет ли на счет нее какой-нибудь команды.

Неясность у меня безотносительно клавиш — по мнемонике JS в плане работы с функциями:

1) Могу ли я предать функции функцию и присвоить ее массиву? Типа такого:
function shortkey(key,func) { my_key[key] = func; }
2) Могу ли я каким-то образом выполнить затем эту функцию func? Типа такого обращения:
exec_func( my_key[key] )

Если все вышеописанное невозможно, и с функциями в JS так работать нельзя, то могу ли я хотя бы хранить в массиве само имя функции как текстовую переменную (подразумевается, что она глобальная), а потом как-то (как?) вызывать функцию по ее имени, типа:
f = 'del_x'; exec_func( f );

<< предыдущая заметка следующая заметка >>
пожаловаться на эту публикацию администрации портала
Страницы, которые привлекли мое внимание за последние дни, рекомендую:
2017-11-22 В июне 1982
архив ссылок
Оставить комментарий
Windows
 Киев
0
0
Леша (#7330)
Можно присваивать и запускать.
функции - это тоже объекты как и все остальное.

Вот перевод красивой доки:

http://wap.xidmet.ru/wapmaster/js_teach/obj2.php

Для примера:
http://www.ibm.com/developerworks/ru/library/wa-finitemach2/[...]

Код JavaScript для вызова анонимных функций, хранящихся в ассоциативном массиве
var nextState = this.actionTransitionFunctions[this.currentState][event.type](event);
Windows
 Киев
0
0
Леша (#7330)
JavaScript очень напоминает шаманство.
Что меня всегда удивляло, так это то что большинство людей его использующих не понимает его. Но, что самое странное, это ни сколько не мешает им успешно его использовать :)

Что тоже не плохо.

ps. да если
my_key[key] = func;
то можно не только my_key[key](param,param);
но и
func=my_key[key];
func(param,param);
Windows Opera
0
0
Wot (#83640)
Это шаманство не более чем обьектная модель. Чего в ней понимать ?

На самом деле объявление
function my_func() { ... }
просто запись для
window.myfunc = function() { ... }
или
window['myfunc'] = function() { ... }
Шаманство - это управление силами, в которых ты не понимаешь методом выполнение заученных ритуалов :)
В отличии от колдовства, которое скорее сравнивают с наукой, где ты понимаешь что и зачем делать и как оно работает.

Проблема не в сложности понимания, а в том что никто не хочет изучать это. В этом просто нет практической необходимости для подсветки кнопочки и всякого такого :)
Легко!
Пункты 1 и 2 уже описали, exec опишу я:

f = 'del_x'; - хоть в куки записывайте
exec( f+"()" );

Аналогично можно с переменными так жонглировать. Например, если вы не знаете заранее, какую переменную выбрать.
Так, дико извиняюсь за неразумность, перепутал языки :-)
не exec, а eval.
Linux Firefox
 Москва
1
0
вот прямо eval('func'+'()') ? смешной право язык JS :))) мне нравится эта святая простота ;)))
Вбейте в строку браузера javascript:eval("document.write"+"('hello'"+")");
Linux Ubuntu Firefox
0
1
robin_locksley
Хранить коды клавиш и присвоенные им действия в специальном массиве, и при нажатии клавиши проверять, нет ли на счет нее какой-нибудь команды.
____________________________________

Жаль, Леонид, что вы являетесь таким уж явным противником ДжКвери (проверяю фильтр :-). Обработка пользовательских (а в нашем случае - даже предопределённых) событий там реализована весьма интуитивно.

Получиться должно что-то вроде:
____________________________________
document.bind('keypress', keyPressListener);
keyPressListener = function (event) {
alert ('Была нажата клавиша с кодом ' + event.keyCode )
if (event.ctrlKey) {
alert ('Удерживая контрол была нажата клавиша с кодом' + event.keyCode )
}
}
Linux Firefox
 Москва
0
0
Поклонники jQuery продолжают свои безумства. Я правильно вас понял, что именно jQuery реализовал event.keyCode, а без него никак? :))) Узнавать коды клавиш я и так могу (загляните в код движка, там все это есть). Вопрос в том, чтобы вешать конкретные процедуры на конкретные клавишные комбинации. Я думаю, это строчек пять в код добавит. Вопрос только, каких. Но мне уже выше и ниже объяснили.
Linux Ubuntu Firefox
0
1
robin_locksley
К сожалению в код заглянуть так и не смог: хеш админского пароля генериться отказывается.
Windows
0
0
zencd (propir)
1) можно; именно так как в примере кода

2) можно, но exec() не нужен
exec_func(my_key[key]) ---> my_key[key]()
Еще можно добавить, что необязательно передавать готовую функцию - ее можно конструировать во время вызова. Например, заранее привязать(некоторые) параметры вызова и даже внутренние переменные функции, чтобы не хранить их отдельно.
Windows Safari Chrome
0
0
alpha-cygnus
Сработает вот такое:
shortkey('ctrl+alt+D', function() { del_x('123'); });
если в shortkey будет присвоение my_key[key] = func;, то потом можно будет вызвать my_key[key]();
Сложности будут, если del_x - это метод объекта. Объект (this) будет при вызове потерян, чтобы не потерять надо принимать некоторые меры. Если this не используется, то всё будет ок.
Linux Firefox
 Москва
0
0
Ну, this можно сохранить в глобальной переменной есличо...
Windows Safari Chrome
0
0
alpha-cygnus
Ну это неспортивно. Готовое решение есть в нелюбимых библиотеках, типа в прототайпе есть метод bind у Function. Ну или, если надо, хранить в массиве не просто func, а {self: self, func: func}. И передавать в shortkey this третьим параметром.
Можно и без библиотек. Например, так:

function bindFunc(obj,func){
var ars=[];
for(var i=2;i &lt; arguments.length;i++){
ars[i-2]=arguments[i];
};
return function(){
var ar=ars.slice(0);
for(var i=0;i &lt; arguments.length;i++)ar[ar.length]=arguments[i];
return func.apply(obj,ar);
}
};


Здесь obj - ссылка на this, func - "привязываемая" функция, дополнительно можно задать еще какие-либо аргументы. Возвращается "привязанный" вариант функции. Пример:

var handler=bindFunc(idd("okno"),maiFun,12,34);
handler("ab","cd");

Примерно равно

idd("okno").maiFun(12,34,"ab","cd");
Windows Opera
0
0
gryzchick
Все функции в JS являются объектами типа function, их можно передавать, возвращать и присваивать. Можно передавать параметром анонимную функцию (как это, например, обычно делается при установке таймера) или хэндл функции.

С хэндлом дело обстоит так.
someFunc(param){alert(param);}

otherFunc(param){alert(param.length);}

function1(someFunc, param)
{
var funcOtherName = someFunc;
funcOtherName(param)
}

function1 (someFunc, "123") //выведет "123"
function1 (otherFunc, "123") //выведет 3

всего комментариев: 18

<< предыдущая заметка следующая заметка >>