2013-02-25 6 views
0

У меня возникли проблемы с некоторыми событиями, которые я делаю.Событие .on и .off

на моем document.ready у меня есть

jQuery(document).ready(function() { 


//deal with clicks 

jQuery(".touchslider-prev").click(function() { 

    jQuery(window).trigger('swipeForward'); 
}); 

jQuery(".touchslider-next").click(function() { 

    jQuery(window).trigger('swipeBackward'); 
}); 

//deal with swipe 

var maxTime = 1000, 
    // allow movement if < 1000 ms (1 sec) 
    maxDistance = 50, 
    // swipe movement of 50 pixels triggers the swipe 
    target = jQuery('.pageSize'), 
    startX = 0, 
    startTime = 0, 
    touch = "ontouchend" in document, 
    startEvent = (touch) ? 'touchstart' : 'mousedown', 
    moveEvent = (touch) ? 'touchmove' : 'mousemove', 
    endEvent = (touch) ? 'touchend' : 'mouseup'; 

target.bind(startEvent, function(e) { 
    // prevent image drag (Firefox) 
    // e.preventDefault(); 
    startTime = e.timeStamp; 
    startX = e.originalEvent.touches ? e.originalEvent.touches[0].pageX : e.pageX; 
}).bind(endEvent, function(e) { 
    startTime = 0; 
    startX = 0; 
}).bind(moveEvent, function(e) { 
    // e.preventDefault(); 
    var currentX = e.originalEvent.touches ? e.originalEvent.touches[0].pageX : e.pageX, 
     currentDistance = (startX === 0) ? 0 : Math.abs(currentX - startX), 
     // allow if movement < 1 sec 
     currentTime = e.timeStamp; 
    if (startTime !== 0 && currentTime - startTime < maxTime && currentDistance > maxDistance) { 
     if (currentX < startX) { 
      // swipe left code here 

      console.log("page forward trigger"); 
      jQuery(window).trigger('swipeForward'); 

     } 
     if (currentX > startX) { 
      // swipe right code here 
      console.log("page back trigger"); 
      //slide("back", pageSize); 
      jQuery(window).trigger('swipeBackward'); 
     } 
     startTime = 0; 
     startX = 0; 
    } 
}); 


//handle triggers from click and slide 

jQuery(window).on('swipeForward', clickHandlerNext); 
jQuery(window).on('swipeBackward', clickHandlerPrev); 

}); 

Если я затем нажмите вперед или проведите пальцем вперед, это должно вызвать swipeForward, который приносит этот кусок кода в игру jQuery(window).on('swipeForward', clickHandlerNext);

поэтому функция clickHandlerNext должен быть запущен

function clickHandlerPrev(event) { 

if(event.handled !== true) { 

     // Kill event handler, preventing any more clicks 
     jQuery(window).off("click", clickHandlerPrev); 
     jQuery(window).off("click", clickHandlerNext); 
     console.log("switch off handlers"); 

     // Do your stuff here 
     slide("back"); 

     // Mark event as handled 
     event.handled = true; 
    } 

    return false; 
} 

function clickHandlerNext(event) { 

    // If event isn't already marked as handled, handle it 

    if(event.handled !== true) { 

     // Kill event handler, preventing any more clicks 
     jQuery(window).off("click", clickHandlerPrev); 
     jQuery(window).off("click", clickHandlerNext); 
     console.log("switch off handlers"); 

     // Do your stuff here 
     slide("forward"); 

     // Mark event as handled 
     event.handled = true; 
    } 
    return false; 
} 

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

function slide(data) { 


     jQuery('#pageHolder').animate({ 
      left: 950 

      }, 400, function() { 
      console.log("animation started"); 
      console.log("switch on handles"); 
jQuery(window).on("click", clickHandlerPrev); 
      jQuery(window).on("click", clickHandlerNext); 

      console.log("animation complete"); 

     }); 


} 

Это затем возвращается к обработчику. Если я, однако, удаляю строку jQuery(window).on("click", clickHandlerPrev); в следующий раз, когда я нажимаю кнопку, она все еще запускает обработчик - но она не должна быть такой, как она должна быть установлена ​​.off

может кто-нибудь помочь?

благодаря

+4

Не могли бы вы отказаться от кода, который вы отправили в соответствующие части? –

+0

Или еще лучше, разместите его в скрипке (http://jsfiddle.net), чтобы мы могли увидеть его в действии? – JakeParis

+0

http://jsfiddle.net/P7DqL/, но это выглядит так, как будто оно работает. У меня проблема на ipad. и действительно просто хочу понять, что я делаю неправильно с моим событием – Dan

ответ

0

ли jQuery.one вариант? Он применяет обработчик только один раз.

+0

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

+0

извините. я не понимаю, почему .one - это вариант – Dan

+0

Мне нужно было увидеть ваш пример, чтобы узнать, для чего вы собираетесь. Да, в твоем случае я не верю. Один из них был бы тем, что тебе нужно. Но я рад, что вы решили свою проблему. –

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