2014-02-04 3 views
0

Я хочу назначить события переменным, потому что я не могу удалить событие $('body').on('keyup') с разными обратными вызовами (извините за мой английский). Это невозможно?Как назначить события переменной

function test_1() 
{ 
    $('body').on('keyup', function(e) 
    { 
     //do stuff 1 
    } 
} 

function test_2() 
{ 
    $('body').on('keyup', function(e) 
    { 
     //do stuff 2 
    } 
} 
test_1(); 
test_2(); 

И теперь я хочу удалить слушателя событий, который выполняет «do stuff 2» при нажатии клавиши.

Я хочу что-то вроде этого:

var handler_1; 
var handler_2; 
function test_1() 
{ 
    handler_1 = $('body').on('keyup', function(e) 
    { 
     //do stuff 1 
    } 
} 

function test_2() 
{ 
    handler_2 = $('body').on('keyup', function(e) 
    { 
     //do stuff 2 
    } 
} 
function delete() 
{ 
    handler_2.off(); 
} 
test_1(); 
test_2(); 

А потом я исполняю удалить() Я хочу, чтобы handler_2 выключит событие. Но когда я нажимаю любую клавишу, «делай материал 1» должен работать.

ответ

3

Я хотел бы использовать имя разнесены события. Это позволяет вам назначить имя для события, чтобы вы могли его легко удалить позже. Кроме того, когда вы назначаете результат handler_1, вы на самом деле просто возвращаете объект jquery, представляющий элемент body, поэтому он будет эквивалентен $('body'), поэтому я не думаю, что это необходимо.

function test_1() 
{ 
    $('body').on('keyup.fn1', function(e) 
    { 
     //do stuff 1 
    } 
} 

function test_2() 
{ 
    $('body').on('keyup.fn2', function(e) 
    { 
     //do stuff 2 
    } 
} 
function delete() 
{ 
    $('body').off('keyup.fn2'); 
} 
test_1(); 
test_2(); 
+1

Спасибо за ваш ответ –

3

Похоже, что вы хотите:

function keyup1(e) 
{ 
    //do stuff 1 
} 
function test_1() 
{ 
    $('body').on('keyup', keyup1); 
} 
function delete() 
{ 
    $('body').off('keyup', keyup1); 
} 

Смотрите первый пример в documentation page for off().

+0

Да, спасибо! –

+0

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

1

Вы должны быть в состоянии использовать bind так, например:

var e1 = function() { ... }, 
    e2 = function() { ... }; 

$('#target').bind('keyup', e1); 
$('#target').bind('keyup', e2); 
$('#target').unbind('keyup', e1); 
$('#target').unbind('keyup', e2); 
1

Использование on/off

function handler1() { 
    alert("I will fire!"); 
} 

function handler2() { 
    alert("I won't fire!"); 
} 

$(document).on('keyup', handler1); 

$(document).on('keyup', handler2); 

$(document).off('keyup', handler2); 

Fiddle

Смежные вопросы