for (var method in result)
result[method]=f.bind(topmenu, result[method]); И эта тоже не очень понятна |
Вообще я сделал так
topmenu= (function(window) { var elements = {}; var result={ functio: function () { alert(elements); } }; 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("div").functio(); Т.е. получается нужно сделать так чтобы functio вывела столько alert(элемент), сколько элементов. Если бы код работал, то было бы проще его разобрать, а так я даже не понимаю где ошибка? |
Нужно писать вместо
functio: function () { alert(elements); } так: functio: function (el) { alert(el); } |
Спасибо за ответ.
но Так тоже не работает topmenu = (function(window) { var elements = {}; var result={ functio: function (elements) { alert(elements); } }; 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("div").functio(); |
Извиняюсь, я не раньше не тестировал этот код, а сейчас сделал это и оказались 2 ошибки:
1) запятая вместо точки запятой в 20-й строчке; 2) обращение к переменной topmenu идёт перед тем, как её определили (если вы её в другом месте не определили). Так уже работает: <!DOCTYPE html> <html><head> <meta http-equiv="Content-Type" content="application/xhtml+xml;charset=UTF-8" /><title></title> </head> <body> <div></div> <div></div> <script> var topmenu = (function(window) { var elements = {}; var result={ functio: function (elements) { alert(elements); } }; function f(callback) { Array.prototype.forEach.call(elements, callback); return this; } for (var method in result) result[method]=f.bind(result, result[method]); result.Sattr=function(name) { try{ elements = document.querySelectorAll(name);}catch(e){} return this; }; return result; }(window)); topmenu.Sattr("div").functio(); </script> </body> </html> |
Спасибо большое. Буду разбираться. Еще бы от bind избавиться, раз он только под ie9. Читал, что его можно эмулировать, но пока не пробовал.
|
Объясните пожалуйста, чем отличается эта запись
Array.prototype.forEach.call(elements, function(item){ alert(item); }); от этой elements.forEach(function(item){ alert(item); }); Последняя возвращает Object #<NodeList> has no method 'forEach' |
потому что это разные типы.
Array и NodeList. они имеют сходства внешне, но внутренне они различны. |
Спасибо за пояснение, но можно как-то поподробнее.
Насколько я понимаю forEach работает только с массивами. При этом используя конструкцию Array.prototype мы преобразуем объект NodeList в массив. При этом не очень понятно, что же происходит на самом деле, и вообще очень плохо понимаю прототипы и как они работают. И есть ли какая-нибудь разница между NodeList объектом и массивом состоящим из тех же элементов? |
Цитата:
в forEach примерно такой код: for (var i = 0; i < this.length; i++) { callback( this[i], i, this ); } Цитата:
http://habrahabr.ru/post/121803/#comment_3985850 |
Часовой пояс GMT +3, время: 10:58. |