platedz,
лучше делегировать с ближайшей обертки всех этих элементов (или создатьеё спецом |
Смысл в том, чтобы к массиву элементов применить какое-нибудь одно действие.
Т.е. чтобы при нажатии на 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(); Сейчас получается так, что к в каждом методе мне необходимо сделать цикл, что как-то очень неудобно. Может есть какой-то способ сделать так, чтобы применяемый метод вызывался для каждого элемента массива. Может через функцию внутри метода, или какой-нибудь калбек. Или еще как? |
Можно сделать через встроенный метод 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(); |
Спасибо за ответ. Но я так понимаю, разницы особой нет. Array.prototype.forEach нужно добавлять в каждый объект.
Хотелось чтобы это было както так element(element).parentNode.removeChild(element(el ement)); или так element.functio : function(){....} или так for() return{ ...... } Или я не знаю как. Как-то чтобы не писать цикл в каждом методе. Может Sattr вынести куда-то и как-то по другому обратиться к объекту. |
В моём примере ведь не используется цикл, только функция в качестве аргумента к 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; } |
Спасибо за пример. Я в основном писал на jquery, сейчас стараюсь отходить и больше писать на чистом javascript.
К сожалению опп у меня хромает, а с прототипами и вовсе плохо. Поэтому Ваш пример мне не до конца понятен, из-за плохого понимания прототипов. В любом случае, в нем используется перебор, хоть и в виде метода, forEach - это ведь по большому счету то же цикл. В общем-то это не главное. Главное, что этот перебор необходимо вставлять в каждый метод. Т.е. в каждом методе делать обертку ....какой_то_перебор {а тут уже сама функция}. Я хочу избавиться непосредственно от вложенности, т.к. везде приходится делать примерно так method: function(){ try{ for(){ и только тут уже сама функция. } } } Хотелось бы вынести перебор в отдельное место, или применить ко всем методам сразу. |
Есди я правильно понял, нужно избавиться от лишнего уровня вложенности. Тогда можно так:
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(); |
Спасибо, по идее то, что надо, но у меня не работает. А самое обидное, что я его почти не понимаю.
|
Цитата:
|
Array.prototype.forEach.call(elements, callback);
Вот эта больше всего. |
Часовой пояс GMT +3, время: 10:58. |