Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #11 (permalink)  
Старый 23.08.2012, 01:23
без статуса
Отправить личное сообщение для Deff Посмотреть профиль Найти все сообщения от Deff
 
Регистрация: 25.05.2012
Сообщений: 8,219

platedz,
лучше делегировать с ближайшей обертки всех этих элементов (или создатьеё спецом
Ответить с цитированием
  #12 (permalink)  
Старый 23.08.2012, 01:46
Профессор
Отправить личное сообщение для platedz Посмотреть профиль Найти все сообщения от platedz
 
Регистрация: 15.08.2012
Сообщений: 285

Смысл в том, чтобы к массиву элементов применить какое-нибудь одно действие.
Т.е. чтобы при нажатии на 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();

Сейчас получается так, что к в каждом методе мне необходимо сделать цикл, что как-то очень неудобно. Может есть какой-то способ сделать так, чтобы применяемый метод вызывался для каждого элемента массива. Может через функцию внутри метода, или какой-нибудь калбек. Или еще как?
Ответить с цитированием
  #13 (permalink)  
Старый 23.08.2012, 02:22
Профессор
Отправить личное сообщение для oneguy Посмотреть профиль Найти все сообщения от oneguy
 
Регистрация: 31.05.2012
Сообщений: 396

Можно сделать через встроенный метод 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();

Последний раз редактировалось oneguy, 23.08.2012 в 02:28.
Ответить с цитированием
  #14 (permalink)  
Старый 23.08.2012, 02:41
Профессор
Отправить личное сообщение для platedz Посмотреть профиль Найти все сообщения от platedz
 
Регистрация: 15.08.2012
Сообщений: 285

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

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

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

или так

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

или так

for() return{

......

}

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

Может Sattr вынести куда-то и как-то по другому обратиться к объекту.
Ответить с цитированием
  #15 (permalink)  
Старый 23.08.2012, 02:52
Профессор
Отправить личное сообщение для oneguy Посмотреть профиль Найти все сообщения от oneguy
 
Регистрация: 31.05.2012
Сообщений: 396

В моём примере ведь не используется цикл, только функция в качестве аргумента к 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;
            }
Ответить с цитированием
  #16 (permalink)  
Старый 23.08.2012, 13:05
Профессор
Отправить личное сообщение для platedz Посмотреть профиль Найти все сообщения от platedz
 
Регистрация: 15.08.2012
Сообщений: 285

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

method: function(){

try{

for(){

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

}

}

Хотелось бы вынести перебор в отдельное место, или применить ко всем методам сразу.
Ответить с цитированием
  #17 (permalink)  
Старый 23.08.2012, 16:29
Профессор
Отправить личное сообщение для oneguy Посмотреть профиль Найти все сообщения от oneguy
 
Регистрация: 31.05.2012
Сообщений: 396

Есди я правильно понял, нужно избавиться от лишнего уровня вложенности. Тогда можно так:
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();
Ответить с цитированием
  #18 (permalink)  
Старый 23.08.2012, 20:54
Профессор
Отправить личное сообщение для platedz Посмотреть профиль Найти все сообщения от platedz
 
Регистрация: 15.08.2012
Сообщений: 285

Спасибо, по идее то, что надо, но у меня не работает. А самое обидное, что я его почти не понимаю.
Ответить с цитированием
  #19 (permalink)  
Старый 24.08.2012, 00:15
Профессор
Отправить личное сообщение для oneguy Посмотреть профиль Найти все сообщения от oneguy
 
Регистрация: 31.05.2012
Сообщений: 396

Сообщение от platedz
А самое обидное, что я его почти не понимаю.
Какую именно строчку вы не понимаете?
Ответить с цитированием
  #20 (permalink)  
Старый 24.08.2012, 11:49
Профессор
Отправить личное сообщение для platedz Посмотреть профиль Найти все сообщения от platedz
 
Регистрация: 15.08.2012
Сообщений: 285

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



Опции темы Искать в теме
Искать в теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Записать в массив все id дочерних эжементов Alexxiss Общие вопросы Javascript 1 18.08.2012 14:03
Название ячейки таблицы Questioner Общие вопросы Javascript 6 16.02.2011 09:58
Как применить css ко всем элементам внутри блока MaxB jQuery 12 28.05.2010 07:56
как записать id всех элементов в массив? SunYang Общие вопросы Javascript 21 06.02.2010 22:50
глюк форума Gvozd Сайт Javascript.ru 11 18.03.2009 14:37