Javascript-форум (https://javascript.ru/forum/)
-   jQuery (https://javascript.ru/forum/jquery/)
-   -   Как временно отключить обработчик событий? (https://javascript.ru/forum/jquery/38481-kak-vremenno-otklyuchit-obrabotchik-sobytijj.html)

Dimaz 03.06.2013 19:19

Как временно отключить обработчик событий?
 
Всем привет! Как решить такую задачу? При клике на параграф нужно отключить обработчик событий, чтобы элементы зафиксировались в текущем положении.
Допустим навели курсор на второй параграф. Теперь его свойство margin-left равно 10 пикселям(ушел немного вправо). Кликаем по нему мышкой и он должен зафиксироваться в этом положении. Остальные параграфы должны также, "заморозиться" и не реагировать на события мышки. http://jsfiddle.net/jy6TK/
$('p').on("mouseenter mouseleave click",function(event){
    var elem = $(this), evt = {
        mouseenter:function(){
            $(elem).css("margin-left","10px");
        }, mouseleave:function(){
            $(elem).css("margin-left",0);
        }, click:function(){
            $('p').not(elem).css("color","green");
            alert("Как отключить обрабочик?");
        }
    }
    evt[event.type]();
});

BaVa 03.06.2013 20:56

в jQuery есть метод .unbind(). unbind - отвязать (событие). если передадим имя события, или несколько, то отключаются указанные события. вот я чуть переделал, а дальше я думаю Вы сами поймете, а если не поймете то обращайтесь я расскажу подробней как оно работает
$('p').on("mouseenter mouseleave click",function(event){
    var elem = $(this), evt = {
        mouseenter:function(){
            $(elem).css("margin-left","10px");
        }, mouseleave:function(){
            $(elem).css("margin-left",0);
        }, click:function(){
            $('p').not(elem).css("color","green");
            $('p').unbind(); // отключает все события у всех элементов p
        }
    }
    evt[event.type]();
});

BaVa 03.06.2013 21:12

также есть метод .off()
в документации jQuery написано, что первые версии bind и unbind появились с jQuery 1.0. А с 1.7 появились on и off.
Пишут что предпочтительнее использовать on & off.

Цитата:

As of jQuery 1.7, the .on() method is the preferred method for attaching event handlers to a document. For earlier versions, the .bind() method is used for attaching an event handler directly to elements.

Dimaz 03.06.2013 21:39

Спасибо. Уже сам разобрался) Прочитал как раз про метод off(). А обработчик поместил в функцию, чтобы в дальнейшем его можно было восстановить.
До этого я ставил атрибут 'data' на div в котором находятся параграфы. И во всех трех событиях ставил проверку, определен ли этот атрибут. Если определен, то return. Только при большом количестве открытых вкладок в браузере, подтормаживала анимация при наведении из-за постоянной проверки.

BaVa 03.06.2013 22:01

Цитата:

А обработчик поместил в функцию, чтобы в дальнейшем его можно было восстановить.
не очень понял, покажите) интересно

Dimaz 03.06.2013 22:14

function handler(){
$('p').on("mouseenter mouseleave click",function(event){
    var elem = $(this), evt = {
        mouseenter:function(){
            $(elem).css("margin-left","10px");
        }, mouseleave:function(){
            $(elem).css("margin-left",0);
        }, click:function(){
            $('p').not(elem).css("color","green");
            alert("Как отключить обрабочик?");
        }
    }
    evt[event.type]();
});
}
handler()

Поместил обработчик в функцию handler. Чтобы восстановить удаленный обработчик, просто вызываем эту функцию там где нам нужно.
$('button').click(function(){
handler(); //восстановили удаленный обработчик
});

BaVa 03.06.2013 22:17

понял


Часовой пояс GMT +3, время: 13:59.