2012-01-24 36 views
17

tôi dường như không thể có được điều này để ngăn chặn tuyên truyền ..jQuery on() stopPropagation không hoạt động?

$(document).ready(function(){ 
     $("body").on("click","img.theater",function(event){ 
      event.stopPropagation();  
      $('.theater-wrapper').show(); 
     }); 

     // This shouldn't fire if I click inside of the div that's inside of the 
     // `.theater-wrapper`, which is called `.theater-container`, anything else it should. 
     $(".theater-wrapper").click(function(event){ 
      $('.theater-wrapper').hide(); 
     }); 
    }); 

Refer this jsfiddle

Trả lời

23

Vì bạn đang sử dụng on trên các yếu tố body và không trực tiếp trên img.theater sự kiện đang xảy ra để bong bóng lên đến body và đó là cách nó hoạt động.

Trong quá trình sự kiện bubbling .theater-wrapper yếu tố click sự kiện sẽ được kích hoạt để bạn thấy nó.

Nếu bạn không tạo bất kỳ yếu tố động nào thì hãy đính kèm trình xử lý sự kiện nhấp chuột trực tiếp trên img.theater phần tử.

$("img.theater").click(function(event){ 
    event.stopPropagation();  
    $('.theater-wrapper').show(); 
}); 

Hoặc bạn có thể kiểm tra các mục tiêu của sự kiện click bên .theater-wrapper yếu tố click xử lý và không làm gì cả.

$(".theater-wrapper").click(function(event){ 
    if ($(event.target).is('img.theater')){ 
     event.stopPropagation(); 
     return; 
    } 
    $('.theater-wrapper').hide(); 
}); 
+0

Tất cả nội dung của tôi được nạp vào trang thông qua ajax –

+0

@DylanCross - Trong trường hợp đó bạn nên sử dụng cách tiếp cận khác mà tôi đã đề cập trong câu trả lời của tôi. Giữ sự kiện xử lý sự kiện 'on'. – ShankarSangoli

+0

Vâng, nó vẫn đóng khi tôi nhấp vào bên trong nơi nó không nên đóng khi tôi nhấp vào. –

3

Cách tốt nhất để làm điều đó là:

$(".theater-wrapper").click(function(event){ 
    if (!$(event.target).is('img.theater')){ 
     $('.theater-wrapper').hide(); 
    } 
}); 

Nó làm việc cho tôi với một accordion và hộp kiểm

0

Trong respone để jsfiddle bạn @Dylan

đây: Khi bạn nhấp vào điểm trắng, nó không nên đóng. jsfiddle.net/Cs8Kq - Dylan

Thay đổi

if ($(event.target).is('img.theater')){ 

để

if ($(event.target).is('.theater-container')){ 

và nó sẽ làm việc.

Tôi đã giải quyết vấn đề này bằng cách sử dụng console.log (event.target) trong trình xử lý sự kiện và chỉ sử dụng công cụ chọn đã đăng xuất khi tôi nhấp vào khu vực màu trắng mà bạn đang nói đến.

Tôi đã nhận xét thay vào đó, nhưng tôi không có đủ SO stardust và tiền xu.

EDIT: Như thế này jsfiddle.net/heNP4/

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