2010-03-08 33 views
5

Giả sử tôi có một kịch bản mà tôi có một plugin toàn cầu (hoặc ít nhất là một plugin liên kết với một mảng rộng hơn các sự kiện).jquery .live() sự kiện tương tác

Plugin này có công cụ chọn và liên kết nhấp chuột trực tiếp với plugin đó. Một cái gì đó trong pseudo-jquery rằng có thể trông như thế này:

$.fn.changeSomething = function(){ 
    $(this).live("change", function(){ alert("yo");}); 
} 

Trên trang khác, tôi có thêm một cái gì đó ràng buộc sống như thế này:

$("input[type='checkbox']").live("click", function(){alert("ho");}); 

Trong kịch bản này, các hộp kiểm sẽ lý tưởng kết thúc được ràng buộc với cả hai sự kiện trực tiếp.

Điều tôi thấy là sự kiện thay đổi sẽ kích hoạt như nó cần và tôi được cảnh báo "yo". Tuy nhiên, bằng cách sử dụng sự kiện nhấp chuột trực tiếp này, tôi không bao giờ kích hoạt sự kiện đó. Tuy nhiên, bằng cách sử dụng một ràng buộc nhấp chuột rõ ràng, tôi DO nhấn nó.

Cách giải quyết dễ dàng là kích hoạt sự kiện nhấp chuột ở cuối trình xử lý thay đổi trực tiếp, nhưng điều này có vẻ khó xử với tôi. Bất kỳ ý tưởng?

Lưu ý rằng đây là sử dụng jquery 1.4.2 và chỉ xảy ra trong IE8 (tôi cho là 6/7 cũng vậy, nhưng tôi chưa thử nghiệm chúng).

một ví dụ (bạn sẽ cần jquery-1.4.2.min.js):

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" 
    "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> 
<html> 
<head> 
<script src="jquery-1.4.2.min.js" type="text/javascript"></script> 
<script type="text/javascript"> 
    $.fn.changeSomething = function(){ 
     var t = $(this); 
     t.live("change", function(){ 
      alert("yo"); 
     }); 
    }; 

    $(document).ready(function(){ 
    $("input[type='checkbox']").changeSomething(); 
    $("#special").live("click", function(){ 
     alert("ho"); 
    }); 
    }); 
</script> 
</head> 
<body> 
<form> 
    <input type="checkbox" id="cbx" /> 
    <input type="checkbox" id="special" /> 
    </form> 
</body> 
</html> 
+0

Bạn có thể gửi mã xung quanh ví dụ không làm việc? ví dụ. là nó được bọc trong một sẵn sàng chưa? –

+0

Chắc chắn, hãy xem chỉnh sửa gần đây nhất của tôi. Ví dụ khá đơn giản, nhưng về cơ bản là dòng chảy. – ddango

+0

Tôi nhận được cả hai bắn ở đây mỗi lần, sự thay đổi cháy sau đó nhấp vào ... bạn đang sử dụng trình duyệt nào đang gặp sự cố? –

Trả lời

5

Bạn biết rằng IE sẽ không sa thải "thay đổi" sự kiện cho đến khi hộp kiểm mất tập trung, phải không?

chỉnh sửa trong khi tôi nghĩ điều đó là đúng, hiệu quả từ trang thử nghiệm đó khá kỳ quái. Tôi vẫn chơi với nó. Cơ chế “sống” làm tôi bối rối và khiến tôi hơi lo lắng, mặc dù tôi đã hiểu rõ giá trị của nó.

Tôi đã đặt trang kiểm tra (chút thay đổi và làm rõ) lên: http://gutfullofbeer.net/clicks.html và tôi sẽ bắt đầu thực hiện một số jQuery gỡ lỗi

khu hoàng hôn: Như đã nêu trong các ý kiến, khi tôi gắn một hình nộm "thay đổi" trình xử lý cho phần tử nội dung:

$('body').bind('change', function() { return true; }); 

thì mọi thứ bắt đầu hoạt động bình thường. Tôi chắc chắn rằng @ Alex là đúng, rằng có một cái gì đó đang xảy ra với cách jQuery đang cố gắng giả mạo bong bóng của sự kiện "thay đổi". Tuy nhiên ma quái tuy nhiên. Trang thử nghiệm là http://gutfullofbeer.net/clicks-body.html và bạn có thể thấy sự kỳ quặc bằng cách nhấp vào "Thiết lập với trình xử lý thay đổi trước", sau đó nhấp vào hộp kiểm và lưu ý rằng trình xử lý "nhấp" trên trình xử lý thứ hai chỉ kích hoạt một lần, sau đó nhấp vào "Bind a handler cho cơ thể "và xem cách các hộp kiểm hoạt động sau đó.

+0

khám phá thú vị, nhưng chỉ cần tiếp tục làm cho tôi nghĩ rằng đó là một lỗi được giới thiệu trong 1.4.x – ddango

+1

Rất có thể! Tôi sẽ đăng nó tại diễn đàn jQuery và xem có ai có thể giải thích nó không. – Pointy

1

Hãy thử sử dụng $.delegate với một tổ tiên chung thay vì $.live

Chìa khóa để nhớ với live là sự kiện này là không ràng buộc để các yếu tố mà bạn chọn. Nó được liên kết với document và sau đó khi sự kiện bong bóng vào tài liệu, nó sẽ kiểm tra bộ chọn bạn đã truyền vào trong mục tiêu sự kiện.

Chìa khóa để học hỏi từ đó là trong IE - sự kiện thay đổi không tự nhiên bong bóng, giống như trong hầu hết các trình duyệt.Trong IE sự kiện "bong bóng" dựa trên một heuristic hoạt động giống nhau trong tất cả các bài kiểm tra jquery như sự kiện thực tế trong các trình duyệt khác. Có khả năng một cái gì đó trong chức năng khác của bạn đang ngăn chặn điều này heuristic từ làm việc. Vì vậy, nó có ý nghĩa rằng đó là IE cụ thể. Không phải là đó là một điều tốt ...

+0

Xin chào Alex! Đôi khi tôi đeo cà vạt. Dù sao, điều này là khá lạ. Những gì tôi đã tìm thấy trên thực tế là hành vi thay đổi dựa trên thứ tự của đăng ký trình xử lý, nó cũng thay đổi nếu tôi trực tiếp liên kết một trình xử lý "click" với $ ('body'). Trình xử lý đó chạy, nhưng sau đó cả trình xử lý "nhấp" và "thay đổi" luôn chạy cho hộp kiểm "đặc biệt". Tôi sẽ thử "đại biểu". – Pointy

+0

chỉnh sửa - Tôi phải liên kết sự kiện "thay đổi" với nội dung chứ không phải "nhấp". – Pointy

+0

gợi ý tốt, nhưng tôi đã thử sử dụng $ .delegate thay vì ($ ("body"). Delegate ("# special", "click", function() {...});) nhưng điều này không giải quyết được vấn đề. tuy nhiên, lưu ý rằng việc thay đổi thứ tự vẫn hoạt động với đại biểu như đã thực hiện với trực tiếp. – ddango

0

Bạn có thể sử dụng jquery.livequery plugin

$("select[name='majorsList']").livequery("change",function() 
{ 
alert('in'); 
}); 
Các vấn đề liên quan