2012-02-17 38 views
10

Tôi đang sử dụng event.stopPropagation() trong đơn đăng ký của mình. Đã xuất hiện, tuy nhiên, một kịch bản mà tôi muốn tuyên truyền tiếp tục như thể các chức năng nói trên chưa bao giờ được gọi. Vì vậy, tôi tự hỏi; có cách nào để "tiếp tục" tuyên truyền sau khi nó được dừng lại? Sẽ thật là tẻ nhạt khi di chuyển một cuộc gọi đến event.stopPropagation đến một chục câu lệnh có điều kiện riêng biệt.Làm cách nào để hoàn tác event.stopPropagation trong jQuery?

+0

Mmmm ... http: //stackoverflow.com/questions/4735006/javascript-how-to-enable-stoppropagation – elclanrs

+0

Nếu có cơ sở như vậy, bạn sẽ không cần hàng tá câu lệnh có điều kiện để quyết định xem bạn có nên gọi nó? – Jon

+0

Họ đã ở đó. Sẽ có một cuộc gọi đến 'event.stopPropagation()' và (hiếm khi) một cuộc gọi đến 'event.resumePropagation() giả định'. Điều đó sẽ thích hợp hơn khi gọi 'event.stopPropagation()' trong tất cả các điều kiện ngoại trừ một số – Hubro

Trả lời

14

Sau khi tuyên truyền đã được dừng lại, nó không thể được tiếp tục. Là một workaround, những gì bạn có thể làm là thiết lập một biến, và sau đó chỉ dừng lại nếu biến này là đúng:

var stop = false; 
// do your logic here 
if(stop){ 
    event.stopPropagation(); 
} 
+3

Tôi không nghĩ về điều đó. Đó là cách sạch hơn so với giải pháp sao lưu của tôi. Nó sẽ là tối ưu nếu bạn có thể chỉnh sửa câu trả lời của bạn và bao gồm một thực tế là "một khi tuyên truyền đã được dừng lại, nó ** không thể ** được tiếp tục" – Hubro

+0

Chỉ cần chỉnh sửa nó! – Schiavini

2

Đặt cuộc gọi event.stopPropagation() bên trong điều kiện của bạn. Ví dụ:

$el.click(function(event) { 
    if (some_condition) { 
     event.stopPropagation() 
     // do stuff 
    } 
    else { 
     // do other stuff, without stopping propagation 
    } 
}); 

Tẻ nhạt nó có thể xảy ra, nhưng tiếc là dừngPropagation là công tắc một chiều. Khi đã dừng, bạn không thể bật lại cho cùng một sự kiện.

+0

Nó không phải là "a" điều kiện. Đó là ** rất nhiều điều kiện. Tự xưng mình: "Sẽ rất khủng khiếp khi di chuyển một cuộc gọi đến event.stopPropagation đến một chục câu lệnh điều kiện riêng biệt" – Hubro

+0

Tẻ nhạt nó có thể xảy ra, nhưng tiếc là 'stopPropagation' là một công tắc một chiều. Khi đã dừng, bạn không thể bật lại cho cùng một sự kiện. –

+0

Bây giờ ** rằng ** là câu trả lời tôi đang tìm kiếm. Vì điều đó thực sự trả lời câu hỏi của tôi, tôi sẽ chấp nhận câu hỏi đó nếu bạn chỉnh sửa – Hubro

2

Chỉ cần cấu trúc lại sự kiện ban đầu của bạn như thế này:

var refEvent = event.originalEvent; 
refEvent.cancelBubble = false; 
refEvent.defaultPrevented = false; 
refEvent.returnValue = true; 
refEvent.timeStamp = (new Date()).getTime(); 

if (event.target.dispatchEvent){ 
    event.target.dispatchEvent(refEvent); 
} else if (event.target.fireEvent) { 
    event.target.fireEvent(refEvent); 
} 
+4

Bạn có thể cung cấp ví dụ làm việc về sự kiện bị dừng với e.stopPropagation() và sau đó khởi động lại với ví dụ trên không? Tôi không thể làm cho nó hoạt động được, nhưng có vẻ đúng theo lý thuyết. – gfullam

0

Dưới đây là một giải pháp hoạt động:

$('#mydiv').on('click.new', function(e){ 

    e.stopImmediatePropagation(); 

alert('this will happen only once'); 

$('#mydiv').unbind('click.new'); 

}); 

Nó sử dụng thực tế sự kiện có thể có không gian tên tùy chỉnh và có thể hủy liên kết. Nó cũng hoạt động cho e.stopPropagation. Đối với vấn đề đó, nó có thể hoàn tác mọi thứ liên quan đến sự kiện nhấp chuột tùy chỉnh đó.

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