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, время: 19:30. |