Javascript-форум (https://javascript.ru/forum/)
-   Элементы интерфейса (https://javascript.ru/forum/dom-window/)
-   -   Как записать все елементы в массив, чтобы потом применить ко всем сразу событие? (https://javascript.ru/forum/dom-window/30960-kak-zapisat-vse-elementy-v-massiv-chtoby-potom-primenit-ko-vsem-srazu-sobytie.html)

Deff 23.08.2012 01:23

platedz,
лучше делегировать с ближайшей обертки всех этих элементов (или создатьеё спецом

platedz 23.08.2012 01:46

Смысл в том, чтобы к массиву элементов применить какое-нибудь одно действие.
Т.е. чтобы при нажатии на id1,id2 или id3, выполнялась какая-нибудь одна фукнция, а один точнее метод.



topmenu = (function(window) {
var elements = {};

return {
			Sattr: function(name)
				{
				try{ elements = document.querySelectorAll(name);}catch(e){}
					
					return this;
				},	
				
			functio: function()
				{
					
					for(var i = 0; i<elements.length;i++) elements[i].parentNode.removeChild(elements[i]); 
					return this;
				
				}
	
	}
	

}(window)); 

topmenu.Sattr(".eror").functio();

Сейчас получается так, что к в каждом методе мне необходимо сделать цикл, что как-то очень неудобно. Может есть какой-то способ сделать так, чтобы применяемый метод вызывался для каждого элемента массива. Может через функцию внутри метода, или какой-нибудь калбек. Или еще как?

oneguy 23.08.2012 02:22

Можно сделать через встроенный метод Array.prototype.forEach (правда, не для IE<9):
topmenu = (function(window) {
var elements = {};
 
return {
            Sattr: function(name)
                {
                try{ elements = document.querySelectorAll(name);}catch(e){}
                     
                    return this;
                }, 
                 
            functio: function () {
               Array.prototype.forEach.call(elements, function(v)
                {
                     v.parentNode.removeChild(v);
                 
                });
               return this;
            }
    }
     
 
}(window));
 
topmenu.Sattr(".eror").functio();

platedz 23.08.2012 02:41

Спасибо за ответ. Но я так понимаю, разницы особой нет. Array.prototype.forEach нужно добавлять в каждый объект.

Хотелось чтобы это было както так

element(element).parentNode.removeChild(element(el ement));

или так

element.functio : function(){....}

или так

for() return{

......

}

Или я не знаю как. Как-то чтобы не писать цикл в каждом методе.

Может Sattr вынести куда-то и как-то по другому обратиться к объекту.

oneguy 23.08.2012 02:52

В моём примере ведь не используется цикл, только функция в качестве аргумента к Array.prototype.forEach.call. Если это писать долго, можно поставить этот forEach в NodeList.prototype:
NodeList.prototype.forEach=Array.prototype.forEach;

...

functio: function () {
               elements.forEach(function(v)
                {
                     v.parentNode.removeChild(v);
                  
                });
               return this;
            }

platedz 23.08.2012 13:05

Спасибо за пример. Я в основном писал на jquery, сейчас стараюсь отходить и больше писать на чистом javascript.
К сожалению опп у меня хромает, а с прототипами и вовсе плохо. Поэтому Ваш пример мне не до конца понятен, из-за плохого понимания прототипов.
В любом случае, в нем используется перебор, хоть и в виде метода, forEach - это ведь по большому счету то же цикл.
В общем-то это не главное. Главное, что этот перебор необходимо вставлять в каждый метод. Т.е. в каждом методе делать обертку ....какой_то_перебор {а тут уже сама функция}.
Я хочу избавиться непосредственно от вложенности, т.к. везде приходится делать примерно так

method: function(){

try{

for(){

и только тут уже сама функция.
}

}

}

Хотелось бы вынести перебор в отдельное место, или применить ко всем методам сразу.

oneguy 23.08.2012 16:29

Есди я правильно понял, нужно избавиться от лишнего уровня вложенности. Тогда можно так:
topmenu = (function(window) {
var elements = {};
var result={
  functio: function (el) {
    el.parentNode.removeChild(el);
  },

  //...

};
function f(callback) {
    Array.prototype.forEach.call(elements, callback);
    return this;
}
for (var method in result)
  result[method]=f.bind(topmenu, result[method]);
result.Sattr=function(name)
                {
                try{ elements = document.querySelectorAll(name);}catch(e){}
                      
                    return this;
                },
return result;
      
  
}(window));
  
topmenu.Sattr(".eror").functio();

platedz 23.08.2012 20:54

Спасибо, по идее то, что надо, но у меня не работает. А самое обидное, что я его почти не понимаю.

oneguy 24.08.2012 00:15

Цитата:

Сообщение от platedz
А самое обидное, что я его почти не понимаю.

Какую именно строчку вы не понимаете?

platedz 24.08.2012 11:49

Array.prototype.forEach.call(elements, callback);
Вот эта больше всего.


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