2013-02-19 3 views
0

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

var dragStart = $('#ruler').mousedown(function(e){ 
    position = container.offset(); 
    mousePosition = { 
     x: e.pageX, 
     y: e.pageY 
    }; 

    var dragging = $(document).mousemove(function(e){ 
     var x = e.pageX - mousePosition.x; 
     var y = e.pageY - mousePosition.y; 

     container.offset({ 
      left: position.left + x, 
      top: position.top + y 
     }); 
    }); 

    var dragStop = $(document).mouseup(function(){ 
     dragStart.unbind(); 
     dragging.unbind(); 
     dragStop.unbind(); 
    }); 
}); 

я обнаружил, что не работает, потому что функции обработчика событий JQuery в возвращать ссылки на элемент в селекторе, и поэтому все в настоящее время unbinded от $ (документ), который является проблемой в моем окружении.

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

var foo; 
$(<selector>).<eventType>(foo = function(){ 
    // DO SOMETHING 
    $(<unbind button>).click(function(){ 
     // foo.unbind(); 
     // OR 
     // $(<selector>).unbind(foo); 
     // ??????? 
    }); 
}); 

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

+1

вы должны использовать 'off', а не' bind', и вы должны использовать пространство имен событий: http://docs.jquery.com/Namespaced_Events – vsync

+0

Если вы сделаете это в ответ, я проголосую для этого. Если нет, я сделаю сам пост за один день. – Vap0r

ответ

2

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

$(document).on('click','a', doSomething); 

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

лучше:

$(document).on('click.someName','a', doSomething); // bind 
$(document).off('click.someName','a'); // unbind 

представить себе также там может быть больше кода на странице, которая может быть с помощью делегирования событий вплоть до докумен, т или какой-либо другой элемент, так и не разделяет пространства имен не было бы сговор при связывании/разворачивании событий

+0

Отлично, спасибо. – Vap0r

+0

рад, что это помогло, потому что вопрос был немного расплывчатым :) – vsync