Javascript.RU

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

for (var method in result)
result[method]=f.bind(topmenu, result[method]);
И эта тоже не очень понятна
Ответить с цитированием
  #22 (permalink)  
Старый 24.08.2012, 12:02
Профессор
Отправить личное сообщение для platedz Посмотреть профиль Найти все сообщения от platedz
 
Регистрация: 15.08.2012
Сообщений: 285

Вообще я сделал так

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(элемент), сколько элементов.

Если бы код работал, то было бы проще его разобрать, а так я даже не понимаю где ошибка?

Последний раз редактировалось platedz, 24.08.2012 в 12:06.
Ответить с цитированием
  #23 (permalink)  
Старый 24.08.2012, 17:00
Профессор
Отправить личное сообщение для oneguy Посмотреть профиль Найти все сообщения от oneguy
 
Регистрация: 31.05.2012
Сообщений: 396

Нужно писать вместо
functio: function () {
    alert(elements);
  }

так:
functio: function (el) {
    alert(el);
  }
Ответить с цитированием
  #24 (permalink)  
Старый 24.08.2012, 22:19
Профессор
Отправить личное сообщение для platedz Посмотреть профиль Найти все сообщения от platedz
 
Регистрация: 15.08.2012
Сообщений: 285

Спасибо за ответ.
но
Так тоже не работает
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();
Ответить с цитированием
  #25 (permalink)  
Старый 26.08.2012, 19:38
Профессор
Отправить личное сообщение для oneguy Посмотреть профиль Найти все сообщения от oneguy
 
Регистрация: 31.05.2012
Сообщений: 396

Извиняюсь, я не раньше не тестировал этот код, а сейчас сделал это и оказались 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>

Последний раз редактировалось oneguy, 26.08.2012 в 19:58.
Ответить с цитированием
  #26 (permalink)  
Старый 27.08.2012, 13:48
Профессор
Отправить личное сообщение для platedz Посмотреть профиль Найти все сообщения от platedz
 
Регистрация: 15.08.2012
Сообщений: 285

Спасибо большое. Буду разбираться. Еще бы от bind избавиться, раз он только под ie9. Читал, что его можно эмулировать, но пока не пробовал.
Ответить с цитированием
  #27 (permalink)  
Старый 27.08.2012, 16:12
Профессор
Отправить личное сообщение для platedz Посмотреть профиль Найти все сообщения от platedz
 
Регистрация: 15.08.2012
Сообщений: 285

Объясните пожалуйста, чем отличается эта запись
Array.prototype.forEach.call(elements, function(item){ alert(item); });


от этой
elements.forEach(function(item){ alert(item); });


Последняя возвращает

Object #<NodeList> has no method 'forEach'
Ответить с цитированием
  #28 (permalink)  
Старый 27.08.2012, 17:58
sinistral
Посмотреть профиль Найти все сообщения от melky
 
Регистрация: 28.03.2011
Сообщений: 5,418

потому что это разные типы.

Array и NodeList.

они имеют сходства внешне, но внутренне они различны.
Ответить с цитированием
  #29 (permalink)  
Старый 27.08.2012, 18:39
Профессор
Отправить личное сообщение для platedz Посмотреть профиль Найти все сообщения от platedz
 
Регистрация: 15.08.2012
Сообщений: 285

Спасибо за пояснение, но можно как-то поподробнее.
Насколько я понимаю forEach работает только с массивами.
При этом используя конструкцию Array.prototype мы преобразуем объект NodeList в массив. При этом не очень понятно, что же происходит на самом деле, и вообще очень плохо понимаю прототипы и как они работают.
И есть ли какая-нибудь разница между NodeList объектом и массивом состоящим из тех же элементов?
Ответить с цитированием
  #30 (permalink)  
Старый 27.08.2012, 20:35
sinistral
Посмотреть профиль Найти все сообщения от melky
 
Регистрация: 28.03.2011
Сообщений: 5,418

Сообщение от platedz
Array.prototype мы преобразуем объект NodeList в массив
нет. мы просто заимствуем метод у массива. А т.к. у NodeList есть свойство length, да и свойства пронумерованы от нуля, то forEach схавает его, как массив.

в forEach примерно такой код:
for (var i = 0; i < this.length; i++) {
    callback( this[i], i, this );
}


Сообщение от platedz
И есть ли какая-нибудь разница между NodeList объектом и массивом состоящим из тех же элементов
да - nodeList живой.
http://habrahabr.ru/post/121803/#comment_3985850
Ответить с цитированием
Ответ



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

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


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Записать в массив все 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