Javascript-форум (https://javascript.ru/forum/)
-   Элементы интерфейса (https://javascript.ru/forum/dom-window/)
-   -   Как записать все елементы в массив, чтобы потом применить ко всем сразу событие? (https://javascript.ru/forum/dom-window/30960-kak-zapisat-vse-elementy-v-massiv-chtoby-potom-primenit-ko-vsem-srazu-sobytie.html)

platedz 27.08.2012 21:48

Спасибо за пояснение.

Вышеуказанный код заработал, но я так и не смог разобраться чтоже в нем все-таки происходит.

Особенно интересуют следующая часть кода
function f(callback) {
    Array.prototype.forEach.call(elements, callback);
    return this;
  }
  for (var method in result)
    result[method]=f.bind(result, result[method]);



Больше всего мне непонятно, что же происходит здесь, и как после всего этого выглядит result в итоге
for (var method in result)
    result[method]=f.bind(result, result[method]);

melky 27.08.2012 21:50

мы не телепаты. Учитесь пользоваться консолью.

platedz 27.08.2012 21:54

Да нет все работает. Просто я не понимаю принцип работы кода.

bes 27.08.2012 21:57

http://es5.javascript.ru/x15.3.html#x15.3.4.5

platedz 27.08.2012 21:57

Да и от bind не мешало бы избавиться, т.к. тогда весь код не будет работать в ie8

platedz 28.08.2012 13:03

Немного переделал так
var topmenu= (function(window) {
  var elements = [];
  var result={
    functio: function () {
      alert(arguments[0].innerHTML);
    }
  };
  function f(callback) {
   
    elements.forEach(callback);
	
    return this;
  }
  
  for (var method in result)
    result[method]=f.bind(result, result[method]);
	
  result.Sattr=function(name)
                {
                try{ elements = Array.prototype.slice.apply(document.querySelectorAll(name));}catch(e){}
                   
                    return this;
                };
  return result;
}(window));
topmenu.Sattr("div").functio().functio();


Сложнее всего до моего понимания доходит эта строка

for (var method in result) result[method]=f.bind(result, result[method]);

Насколько я понимаю,
1) мы передаем текущий объект в функцию f
2) в ней через foreach применяем к каждому отдельному элементу массива callback, которым является каждый метод текущего объекта т.е. result[method]

При этом мне вовсе не яcно, как функция вообще получает elements. Т.к. попытка вызвать его вне метода не дает результата.

Т.е. если перед циклом for поставить alert(elements.length); толку не будет.

Что как бы говорит о том, что все указанные действия вне методов вызываются либо сразу, либо при каждом обращении к объекту через его метод.

Кроме прочего насколько я понимаю bind - это своего рода внутренняя функция, которую можно повторить и в устаревших браузерах.

В общем, второй день сижу, пытаясь разобраться, что да как, запутался уже. Помогите, пожалуйста, разобраться, и заодно симулировать bind.

melky 28.08.2012 15:59

Цитата:

Сообщение от platedz
1) мы передаем текущий объект в функцию f

текущий объект - это this. а в коде передаётся result.

Цитата:

Сообщение от platedz
При этом мне вовсе не яcно, как функция вообще получает elements. Т.к. попытка вызвать его вне метода не дает результата.

посредством замыкания.

Цитата:

Сообщение от platedz
Кроме прочего насколько я понимаю bind - это своего рода внутренняя функция, которую можно повторить и в устаревших браузерах.

функция, которая имеет примерно такой код (словами объяснять долго):

кроме того, bind имеет некоторые особенности, которые не реализуемы посредством JavaScript (другими словами, полного костыля не получится создать.).. об особенностях посмотрите в интернете.
/*  ----------  ОПИСАНИЕ  ---------- */

Function.prototype._bind = function (context /*, arg0, arg1, ... argN */) {
    
    // сохраним переданные аргументы в замыкании. Именно "1", потому что нулевой элемент - контекст.
    var args = Array.prototype.slice.call(arguments, 1);

    // сохраним текущую функцию в замыкании, ибо ...
    var func = this; 

    // ... в этой функции this уже будет window (по-умолчанию, во всех функциях так).    
    return function () {

        // преобразуем объект текущих аргументов в массив
        var newArgs = Array.prototype.slice.call(arguments);

        // добавим к переданным вначале аргументам переданные сейчас.
        newArgs = args.concat(newArgs);

        // и вызовем apply, передав контекст, и аргументы.
        func.apply( context, newArgs );

    };
};

/*  ----------  ТЕСТИРОВАНИЕ  ---------- */

// функция просто выведет алертом свойство "FOO" своего контекста, добавив к нему первый аргумент, и второй.
// this сейчас равен window (по-умолчанию).
var test = function (first, second) {  alert( this.FOO + first + second );  };

// объект со свойством "FOO"
var obj = {  "FOO": "Hello" };

// применим связывание.
// this в test_binded будет равен obj.
// а первый аргумент ( first в функции "test" ) будет равен строке ", "
var test_binded = test._bind( obj, ", " );

// вызовем связанную функцию, передав ей ещё один аргумент ( это уже будет "second" )
test_binded( "World!" );

// Связывание и вызов связанной функции аналогичны этой строке :
test.call( obj, ", ", "World!" );

oneguy 28.08.2012 20:47

melky,
спасибо. Здесь https://developer.mozilla.org/en-US/.../Function/bind есть ещё костыль для bind (в разделе Compatibility).

platedz 28.08.2012 22:04

Большое всем спасибо, буду разбираться.

platedz 02.09.2012 21:56

Интерестно, а foreach какие версии браузеров поддерживают?


Часовой пояс GMT +3, время: 14:12.