Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   Передать обработчику событие + замкнутый аргумент (https://javascript.ru/forum/misc/15419-peredat-obrabotchiku-sobytie-zamknutyjj-argument.html)

poorking 26.02.2011 03:42

Передать обработчику событие + замкнутый аргумент
 
Здравствуйте.
Возникла проблема при назначении обработчика событию. Обработчику нудно передать событие и счетчик, который нужно замыкать в обработчике.

Вот максимально возможно близкий пример
function constr(){/*...*/}

var control = [
	{	//стрелки
		left: 37,
		up: 38,
		right: 39,
		down: 40
	},
	{	//wasd
		left: 65,
		up: 87,
		right: 68,
		down: 83
	}]
var objs = []

for(var i = 0; i < control.length; i++)
	objs.push(new constr())


	
function hnd(e, arg){		
	if(!e) e = window.event
	var key = e.which || e.keyCode
	switch(key){
		case control[arg].left:
			objs[arg].doSomething1()
		
		break
		case control[arg].up:
			objs[arg].doSomething2()
		
		break
		case control[arg].right:
			objs[arg].doSomething3()
		
		break
		case control[arg].down:
			objs[arg].doSomething4()
		break
	}
}
/*В цикле каждому объекту назначаем обработчик*/
for(var i = 0; i < control.length; i++){
	window.addEventListener("keydown",
		function(e, n){
			
			return function(){ hnd(e, n)}
			
			
		}(/*Здесь видимо должна быть ссылка на событие*/, i)
	
	,false)
}

В обработчике в switch case с объектом под номером arg будут выполняться определенные действия, грубо говоря, несколько идентичных вариантов управления в массиве, соответствующих разным объектам из другого массива, которыми можно будет управлять с клавиатуры, каждому соответствует свой набор клавиш. Событие внутри обработчика нужно знать чтобы определять какая нажата клавиша.
Подскажите пожалуйста, как передать событие + замкнуть аргумент в обработчике? И возможно ли это вообще. Прошу прощения за много букв, ведь наверняка решение очень простое и лежит на поверхности

poorking 26.02.2011 04:29

Прошу прощения, все получилось.
/*...*/
for(var i = 0; i < control.length; i++){
	window.addEventListener("keydown",
		function(n){
			
			return function(e){ hnd(e, n)}
				
		}(i)
	
	,false)
}
/*...*/


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