2013-08-14 26 views
5

js cũng hỗ trợ cử chỉ cảm ứng. Tôi đang đóng vai trò của tôi về ngăn chặn hành động mặc định. khi tôi đặt event.preventDefault hoặc event.gesture.preventDefault() hoặc thậm chí áp dụng tham số {prevent_defaults: true } trên búa, nó chỉ kích hoạt hành động mặc định trên neo. Làm thế nào tôi có thể ngăn chặn điều đó và/hoặc tôi đang làm gì sai?hammer.js và preventDefault();

Đoạn mã;

function initializeNavigation() { 
    $("nav").hammer({prevent_defaults: true }).on("tap", "a", function(event) { 
     event.preventDefault(); 
     event.gesture.preventDefault(); 
     var target = $(this.hash); 
     scrollToTarget(target, 1200); 
     // if there is an open detailItem then close it. 
     if (detailItemOpen) { 
      $("div." + detailItemOpen).slideUp(); 
     } 
    }) 

    if (Modernizr.mq('only screen and (max-width: 767px)')) { 
     initializeMobileMenuAndSetButton(); 
    } 
} 
+0

Mặc dù không hoàn toàn là một bản sao, câu trả lời này có thể giúp: http://stackoverflow.com/questions/10714868/how-to-disable-the-default-behavior-of-an-anchor-in-jquery-mobile-ios – CodingIntrigue

+0

Tôi không nhận được câu trả lời của bạn vì nó cũng xảy ra trong Firefox. Nó có liên quan đến Hammer.js và các sự kiện. Khi tôi chỉ sử dụng các sự kiện nhấp chuột, mọi thứ hoạt động chính xác trên các thiết bị bằng chuột. – myradon

+0

Đúng, cuộc thảo luận dài về nó ở đây. Đó là về stopPropagation(), nhưng cũng áp dụng để ngăn chặnDefault(): https://github.com/EightMedia/hammer.js/issues/237 – CodingIntrigue

Trả lời

0

Tôi nghĩ bạn cũng có thể thử event.stopPropagation()event.gesture.stopPropagation(). Nhưng có vẻ như Hammer đưa ra phương pháp đó: event.gesture.stopDetect() cho một trường hợp tương tự.

nguồn: https://github.com/hammerjs/hammer.js/wiki/Event-delegation-and-how-to-stopPropagation---preventDefaults

+0

Đó là cũ nhưng nghĩ stopPropagation không giải quyết bất cứ điều gì. Nhấp và nhấn vào sự kiện sẽ bong bóng đến cùng một phần tử DOM mà trình xử lý đã được liên kết. Nếu bạn sử dụng lệnh ngừng hoạt động, nó sẽ không phát sinh thêm DOM. – myradon

1

Xét Hammer 2.0+ event.gesture không còn và tổ chức sự kiện, nhưng một đối tượng đơn giản.

event.gesture.srcEvent sẽ không phải là sự kiện thích hợp để dừngPropagation, vì vậy nó sẽ không hoạt động.

Nếu bạn đang sử dụng sự kiện tap và muốn ngăn nhấp chuột/nhấn vào tài liệu, bạn có thể làm điều gì đó như thế này. Chúng ta cần phải tạo ra một vòi xử lý toàn cầu sẽ dần thay thế các phương pháp gốc stopPropagationpreventDefault

function createHandler(event) { 
 
    return { 
 
    isHandled: false, 
 
    _shouldStopPropagation: false, 
 
    _shoulePreventDefault: false, 
 
    stopPropagation: event.stopPropagation.bind(event), 
 
    preventDefault: event.preventDefault.bind(event), 
 
    } 
 
} 
 

 

 
function handleEvent(handler, node) { 
 
    let clickHandler; 
 

 

 
    if (!handler.isHandled) { 
 
    handler.isHandled = true; 
 
    document.addEventListener('click', clickHandler = (event)=> { 
 
     if (handler._shouldStopPropagation) { 
 
     handler.stopPropagation(); 
 
     event.stopPropagation(); 
 
     } 
 
     
 
     if (handler._shoulePreventDefault) { 
 
     handler.preventDefault(); 
 
     event.preventDefault(); 
 
     } 
 
     document.removeEventListener('click', clickHandler, true); 
 
    }, true); 
 
    } 
 
} 
 

 

 
// Create a global tap Event so we can replace the original functions 
 
document.addEventListener('tap', (event)=> { 
 
    let handler = createHandler(event); 
 

 
    event.stopPropagation = function() { 
 
    handler._shouldStopPropagation = true; 
 
    handleEvent(handler); 
 
    }; 
 
    event.preventDefault = function() { 
 
    handler._shoulePreventDefault = true; 
 
    handleEvent(handler); 
 
    } 
 
}, true); 
 

 
// Now we can use it. 
 
document.addEventListener('tap', (event)=> { 
 
    /* If you want to prevent Default */ 
 
    event.preventDefault(); 
 

 
    /* If you want to stop propagation */ 
 
    event.stopPropagation(); 
 

 
    /* If you want to do both */ 
 
    event.preventDefault(); 
 
    event.stopPropagation(); 
 
});

+0

Tất cả các sự kiện có thể có mà tôi có thể/nên thêm người nghe và ngừng truyền bá là gì? "nhấn" thậm chí không có vẻ là sự kiện thực tế mà tài liệu có thể nghe ... – Michael

Các vấn đề liên quan