Javascript-форум (https://javascript.ru/forum/)
-   Events/DOM/Window (https://javascript.ru/forum/events/)
-   -   Все теже events (https://javascript.ru/forum/events/46232-vse-tezhe-events.html)

syul 02.04.2014 17:54

Все теже events
 
вот туплю....

есть массив, который я передаю как параметр в конструктор объекта.

buttons : {
   "Ok" : function(){
        console.log("Ok");
	this.action();
   },
  "Cancel" : function(){
	console.log("Cancel");
	this.action();
   }
}


в объекте есть функция:

this.action = function(){
					events.beforeAction(self);
					console.log("action");
					events.afterAction(self);
				}


в объекте , есть кусок кода, который создает кнопки, в данном случае 2

for (i in buttons) {
								
	var bName = i;
	var bClick = buttons[i];
								
	var b = document.createElement("button");
	b.textContent = bName;
					
	b.addEventListener('click', function(){bClick.call(self)}, false);
								
	/*b.onclick = function(event){
		return bClick.call(self);
	}*/
								
	//b.onclick = bClick;
								
								            document.body.appendChild(b);
}


так вот. Для баттанов добавляется всегда последний переданный в массиве метод. Ткните лицом, где туплю.

syul 02.04.2014 18:04

да.... забыл сказать
b.onclick = bClick;

работает как надо. Но она не передает this. А мне он оч. нужен.

danik.js 02.04.2014 18:08

Цитата:

Сообщение от syul
Ткните лицом, где туплю

Не расстраивайся, с этим тупит почти каждый по началу. Прочитай про замыкания. Заметь, что в JavaScript переменные внутри блоков (for, while if и тд) на самом деле объявляются на уровне функции, а не блока, как допустим в C# или Java. И получается что в цикле переменная создается единожды, а не на каждой итерации.

syul 02.04.2014 18:16

спасибо... .разобрался.... вопрос снят

kostyanet 03.04.2014 15:00

Цитата:

Сообщение от syul
b.addEventListener('click', function(){bClick.call(self)}, false);

Зачем безымянная и к чему self?

Насчет "блоков" и "замыканий" тоже не понял. Вот каноничный кот:
var elems = obj.getElementsByTagName('img');

		images = [];
		
		for(var i=0; i<elems.length; i++) {
			var elem = elems[i].parentNode;
			if(elem && elem.nodeName == 'A') {
				elem.index = images_length;
				elem.addEventListener("click", load_image, false);
				images[images_length++] = elem;
			}
		}


Развешивается и щелкает как доктор прописал.


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