Передача параметров функции щелчка jQuery - PullRequest
1 голос
/ 01 августа 2011

Я хотел бы назначить функцию щелчка jQuery для всех элементов в массиве. Но кроме того, мне нужно получить доступ к массиву из функции щелчка. Надеюсь, источник прояснит это:

for (var i=0; i<mybox.myarray.length; i++) {
    mybox.myarray[i].jqelem.click(function(event, mybox) {  
        event.preventDefault();
        doStuffWithParameter(mybox);    
    });
}   

// mybox is a JavaScript object (not jQuery-element!), myarray is an array, jqelem is a jQueryelement ala $("div.myclass");

Проблема, похоже, связана с function(event, mybox), очевидно, она не работает, т.е. mybox - это unknown внутри функции Я думаю, что «вроде» понимаю, почему это не может работать таким образом, но как этого достичь?

PS: я просто делаю это, чтобы избавить меня от необходимости набирать его вручную для всех элементов массива.

Ответы [ 3 ]

3 голосов
/ 01 августа 2011

Просто удалите (бесполезный) второй параметр функции обратного вызова с именем mybox.

Если mybox находится в области видимости во внешнем блоке, он также будет в области видимости во внутренней функции обратного вызова!

Если вам необходимо знать соответствующее значение i в обратном вызове, тогда вы можете привязка времени регистрации события :

for (var i=0; i<mybox.myarray.length; i++) {
    mybox.myarray[i].jqelem.click({i: i}, function(event) {  
        // use "event.data.i" to access i's value
        var my_i = event.data.i;
    });
}   

Карта {i : i}соответствует параметру eventData в документации jQuery .click().

1 голос
/ 01 августа 2011

Вы можете воспользоваться помощью атрибутов данных jquery

for (var i=0; i<mybox.myarray.length; i++) {
    mybox.myarray[i].jqelem.data("arrayIndex", i).click(function(event) {  
        event.preventDefault();
        doStuffWithParameter(mybox.myarray[$(this).data("arrayIndex")]);    
    });
}   
1 голос
/ 01 августа 2011

Когда вызывается ваш обработчик кликов, первым аргументом являются данные события.JQuery не передает второй аргумент.

Обновление: Использование замыкания для получения объекта mybox (обратите внимание, я удалил 2-й аргумент)

for (var i=0; i<mybox.myarray.length; i++) {
    mybox.myarray[i].jqelem.click(function(event) { 
        event.preventDefault();
        // here's the trick to get the correct i
        (function(item) {
               return function() {
                         doStuffWithParameter(mybox.myarray[item]);
               };
         })(i);

        // you can access any object from parent scope here 
        // (except i, to get to right i, you need another trick), 
        // effectively creating a closure   
        // e.g. doOtherStuff(myarray)
    });
}

Узнайте больше о замыканиях здесь: http://jibbering.com/faq/notes/closures/
и здесь: Как работают замыкания JavaScript?

...