bindWithEvent mootools 1.3

Мне нужно скрыть этот код с mootools 1.2 до 1.3

var SomeClass = new Class({
 initialize: function (els) {
  for (var i = 0; i < els.length; i++) {
   els[i].addEvent('click',
    this.alert.bindWithEvent(this, [i, els[i].get('text')])
   );
  }
 },

 alert: function (event, index, text) {
  alert(
   index + ' -> ' + text + ' | ' +
   'x:' + event.page.x + ', y:' + event.page.y
  );
 }
});

Вот рабочая версия (1.2) http://jsfiddle.net/9Pn99/
Вот моя версия для 1.3 http //jsfiddle.net/9Pn99/1/

РЕДАКТИРОВАТЬ: Я понял, как это сделать, с закрытием. http://jsfiddle.net/9Pn99/4/

for (var i = 0; i < els.length; i++) {
    (function (j) {
        els[i].addEvent('click',
            function (e) {
                this.alert(e, j);
            }.bind(this)
        );
    }.pass([i], this))();
}

Есть ли лучшее решение?

EDIT2: я нашел еще один простой способ:

els.each(function (el, i) {
    els[i].addEvent('click',
        function (e) {
            this.alert(e, i);
        }.bind(this)
    );
}, this);

Похоже, я говорю один.


person Luistar15    schedule 23.11.2010    source источник
comment
о вашем последнем редактировании: els[i].addEvent должно быть просто el.addEvent, в противном случае - 100% на деньги - я не видел вашего редактирования, прежде чем я решил сделать свой ответ :( удаление в ближайшее время.   -  person Dimitar Christoff    schedule 24.11.2010


Ответы (3)


Самое простое решение - перевернуть аргументы в методе :) поэтому, если у вас есть такой метод

function (e, a){}.bindWithEvent(this, [i, els[i].get('text')])

do

function (a, e){}.bind(this, [i, els[i].get('text')])

потому что событие всегда является последним аргументом.

person hrax    schedule 27.04.2011

как заменить bindwithevent в mootools 1.3

person Savageman    schedule 23.11.2010
comment
На основе этого решения я сделал этот скрипт: jsfiddle.net/9Pn99/3, что мне нужно передает индекс обработчику события. - person Luistar15; 23.11.2010

на основе того, что вы разместили: http://jsfiddle.net/dimitar/9Pn99/5/

var SomeClass = new Class({
    initialize: function (els) {
        els.each(function(el, i) {
            el.addEvent("click", function(e) {
                this.alert(e, i);
            }.bind(this));
        }, this);
    },

    alert: function (event, index) {
        alert(
            index + ' | ' +
            'x:' + event.page.x + ', y:' + event.page.y
        );
    }
});

new SomeClass($$('li'));

каждый цикл дает вам естественный индекс времени выполнения, который вы можете отобразить (в отличие от циклов for, которые ссылаются на одну переменную, которая заканчивается на заданном значении).

Если вы посмотрите на список тегов mootools, то в настоящее время на первой странице есть 3 или 4 вопроса о замене bindWithEvent, а также 2 вопроса о повторении состояния переменных «затем» в элементах с циклом. для последнего вы также можете создавать замыкания и все виды.

повеселись :)

person Dimitar Christoff    schedule 23.11.2010