2009-03-16 37 views
43

Tôi có hai hàm được liên kết với một sự kiện nhấp chuột tại hai thời điểm khác nhau (sử dụng jQuery). Thứ tự mà chúng bị sa thải là đáng kể. Họ đang bắn theo đúng thứ tự. Vấn đề là, khi hàm đầu tiên trả về false, hàm thứ hai vẫn đang bắn!jQuery nhiều trình xử lý sự kiện - Cách hủy?

Làm cách nào để hủy sự kiện?

Ví dụ mã:

$(document).click(function() { 
    alert('a'); 
    return false; 
}); 

$(document).click(function() { 
    alert('b'); 
}); 

Bạn vẫn sẽ thấy những "b" thông điệp cảnh báo khi nhấp trang. Điều này là không thể chấp nhận!

Trả lời

82

Sử dụng chức năng stopImmediatePropagation của đối tượng sự kiện jQuery.

Giữ phần còn lại của trình xử lý không được thực thi. Phương pháp này cũng dừng bọt bằng cách gọi event.stopPropagation().

$(document).click(function(event) { 
    alert('a'); 
    event.stopImmediatePropagation(); 
    return false; 
}); 

$(document).click(function() { 
    alert('b'); 
}); 
+1

Bạn có thể muốn lưu ý rằng bạn cần sử dụng jQuery phiên bản 1.3 trở lên để làm việc này. –

+0

những gì về $ (tài liệu) .on ("touchstart click", ".myelement", function (e) {e.stopImmediatePropagtion(); // run function here}) ... Nếu touchstart cháy đầu tiên trên thiết bị máy tính bảng liệu nó có bị hủy bỏ cú nhấp không nếu tôi giữ ngón tay của tôi bị giữ? – Alex

1

Có sử dụng trợ giúp không liên quan không?

$(document).click(function() { 
    alert('a'); 
    $(this).unbind('click'); 
    return false; 
}); 
+3

Tôi vẫn cần sự kiện thứ hai của mình kích hoạt khi hàm đầu tiên KHÔNG trả về false. Sẽ không bẻ khóa theo nghĩa đen là "unbind it"? –

+0

vâng. nó có thể không phải là một giải pháp tuyệt vời tổng thể ... – nickf

+0

bạn có thể kết hợp giải pháp của tôi với giải pháp nickf và bạn sẽ nhận được hành vi của bạn :) – fmsf

0

Nếu những gì nickf nói không làm việc, bạn có thể sử dụng một máy nhà nước nhỏ:

var trigger = 0; 

$(document).click(function() { 

    alert('a'); 
    if(you_want_to_return_false) { 
    trigger = 1; 
    return false; 
    } 
}); 

$(document).click(function() { 
    if(trigger !== 0) { 
    alert('b'); 
    } 
    trigger = 0; 
}); 

Không phải là giải pháp đẹp nhất, nhưng nó sẽ làm việc.

+0

tốt, ý tưởng của tôi * hoạt động * nó chỉ là nó phá vỡ nó cùng một lúc. 1 cho ý tưởng này mặc dù. – nickf

+0

Phương pháp này vi phạm chính xác giống như cách khác, ngoại trừ với nhiều mã hơn. Đúng nếu tôi đã sai lầm. –

+0

xin lỗi, hãy để tôi làm lại nó – fmsf

2

Điều đầu tiên tôi hỏi là: tại sao bạn có hai chức năng được liên kết với cùng một sự kiện nhấp chuột? Có quyền truy cập vào mã, tại sao bạn không chỉ thực hiện một cuộc gọi đó?

$(function(){ 
    var callbackOne = function(e){ 
     alert("I'm the first callback... Warning, I might return false!"); 
     return false; 
    }; 

    var callbackTwo = function(e){ 
     alert("I'm the second callback"); 
    }; 

    $(document).click(function (e){ 
     if(callbackOne(e)){ 
      callbackTwo(e); 
     } 
    }); 
}); 
+4

Tổ chức. Có một tấn mã Javascript trong ứng dụng này và được chia thành các tệp SEVERAL. Bằng cách này, mỗi trang chỉ tải xuống những gì cần thiết, dẫn đến thời gian tải nhanh. Tôi có một trình xử lý HTTP kết hợp, nén và lưu trữ chúng, vì vậy tất cả chúng đều được tìm nạp trong một yêu cầu. –

+0

Ok. Vì vậy, có thực sự cần cho -1? Chỉ cần cố gắng giúp đỡ ... Lời giải thích của bạn là đủ để cho chúng tôi biết đó không phải là giải pháp * cho bạn *. – Seb

+1

Tôi không -1, dude! –

2

Cảm ơn, unbind công trình cho xác định lại chức năng.

$(document).ready(function(){ 
     $("#buscar_mercaderia").click(function(){ alert('Seleccione Tipo de mercaderia'); 
    }); 
$(".tipo").live('click',function(){ 
      if($(this).attr('checked')!=''){ 
       if($(this).val()=='libro'){ 
        $("#buscar_mercaderia").unbind('click'); 
        $("#buscar_mercaderia").click(function(){ window.open('buscar_libro.php','Buscar Libros', 'width=800,height=500'); }); 
       }else if($(this).val()=='otra'){ 
        $("#buscar_mercaderia").unbind('click'); 
        $("#buscar_mercaderia").click(function(){ window.open('buscar_mercaderia.php','Buscar Mercaderias', 'width=800,height=500'); }); 
       } 
      } 
     }) 
Các vấn đề liên quan