Событие jQuery bind and unbind с параметрами - PullRequest
8 голосов
/ 17 ноября 2009

Я пытаюсь привязать событие к textbox, содержащему параметры. Следующий код выглядит так, как будто он должен это делать, но каждый раз, когда страница загружается, он выполняется.

jQuery(function(){
    jQuery('#textbox').bind('click', EventWithParam('param'));
});

Событие вызывается с этим параметром при каждой загрузке страницы. Это может не работать, потому что события с параметрами не поддерживаются. Если да, есть ли другой маршрут?

Ответы [ 5 ]

11 голосов
/ 11 января 2010

Вы можете передать параметры события в качестве второго аргумента в bind (). Это не параметры прямого обратного вызова, но, возможно, вы хотели бы использовать его:

Из документации jQuery: привязывать

function handler(event) {
    alert(event.data.foo);
}  
$("p").bind("click", {foo: "bar"}, handler)
10 голосов
/ 17 ноября 2009

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

jQuery(function($) {
    var param = 'text';
    $('#textbox').click(function() {
        EventWithParam(param);
        // or just use it without calling out to another function
        $(this).text(param);
    });
});

В вашем примере выполняется функция EventWithParam, а затем выполняется попытка привязки к результату вызова этой функции.

Вызов unbind без указания функции приведет к отмене привязки всех обработчиков для указанного типа события (включая анонимную функцию). Если вы хотите отсоединить эту функцию специально, вам нужно предоставить ей имя, например:

jQuery(function($) {
    var param = 'text',
        clickCallback = function() {
            EventWithParam(param);
            // or just use it without calling out to another function
            $(this).text(param);
        };
    $('#textbox').click(clickCallback);
});
4 голосов
/ 11 января 2010

bdukes совершенно верно. Я добавляю свой ответ, так как недавно обнаружил кое-что интересное, связанное с функцией jQuery bind / unbind и анонимными функциями, пространствами имен событий. Ранее показанное выше событие связывания вызывается следующим образом.

jQuery('#textbox').bind('click',function(){EventWithParam('param')});

Чтобы отменить это, даже пользователь должен позвонить ... jQuery('#textbox').unbind('click');

По сути, удаление всех событий onClick.

Теперь входит в пространства имен jQuery. Если у вас есть анонимная функция, которую вы хотите прикрепить к событию click, а затем отменить привязку, сделайте это следующим образом.

jQuery('#textbox').bind('click.yourNameSpace',function(){EventWithParam('param')});

Затем для простого отсоединения вызовите функцию unbind следующим образом.

jQuery('#textbox').unbind('click.yourNameSpace');

Остальные события onClick останутся.

1 голос
/ 17 ноября 2009

Причина в том, что EventWithParam вызывается как функция прямо в вашей привязке. Другими словами, вы связываете событие click с результатом вызова EventWithParam('param'). Это должно работать:

jQuery('#textbox').bind('click',function(){EventWithParam('param')});

Теперь вы привязали функцию Even к функции, которая при возникновении события будет вызывать EventWithParam('param')

0 голосов
/ 17 ноября 2009
jQuery(function() {
    jQuery('#textbox').click(function() {
        EventWithParam(param1,param2,...,paramN);
    });
});

function EventWithParam(param1,param2,...,paramN) {
    doSomething...;
    ...;
}
...