2009-11-17 29 views
8

Tôi đang cố gắng để ràng buộc một sự kiện với một textbox có chứa các tham số. Sau đây giữ vẻ như nó sẽ làm điều đó, nhưng mỗi lần tải trang, nó sẽ được thực thi.jQuery ràng buộc và unbind sự kiện với các tham số

jQuery(function(){ 
    jQuery('#textbox').bind('click', EventWithParam('param')); 
}); 

Sự kiện được gọi với thông số đó mỗi lần tải trang. Điều này có thể không hoạt động vì các sự kiện có tham số không được hỗ trợ. Nếu có, có tuyến đường nào khác không?

Trả lời

10

Để ràng buộc hàm có tham số, hãy sử dụng hàm ẩn danh để đóng vai trò như một đóng trên các tham số.

jQuery(function($) { 
    var param = 'text'; 
    $('#textbox').click(function() { 
     EventWithParam(param); 
     // or just use it without calling out to another function 
     $(this).text(param); 
    }); 
}); 

Ví dụ của bạn đang thực hiện chức năng EventWithParam và sau đó cố gắng liên kết với kết quả của cuộc gọi chức năng đó.

Gọi unbind mà không chỉ định hàm sẽ hủy liên kết tất cả các trình xử lý cho loại sự kiện được chỉ định (bao gồm cả chức năng ẩn danh). Nếu bạn muốn unbind chức năng mà cụ thể, bạn sẽ cần phải cung cấp cho nó với một cái tên, như thế này:

jQuery(function($) { 
    var param = 'text', 
     clickCallback = function() { 
      EventWithParam(param); 
      // or just use it without calling out to another function 
      $(this).text(param); 
     }; 
    $('#textbox').click(clickCallback); 
}); 
1

Lý do là EventWithParam đang được gọi là một chức năng ngay trong ràng buộc của bạn. Phrased theo một cách khác, bạn đang ràng buộc sự kiện nhấp chuột vào kết quả gọi số EventWithParam('param'). Điều này nên làm việc:

jQuery('#textbox').bind('click',function(){EventWithParam('param')}); 

Bây giờ bạn đã bị ràng buộc thậm chí đến một chức năng đó, khi sự kiện cháy, sẽ gọi EventWithParam('param')

+0

nếu tôi sau đó làm một unbind, nó sẽ unbind các chức năng ẩn danh? jQuery ('# textbox'). Unbind ('click') ;? –

+0

Có. Xem [http://docs.jquery.com/Events/unbind#typefn] – Dan

+0

Điều này không phù hợp với tôi? –

0
jQuery(function() { 
    jQuery('#textbox').click(function() { 
     EventWithParam(param1,param2,...,paramN); 
    }); 
}); 

function EventWithParam(param1,param2,...,paramN) { 
    doSomething...; 
    ...; 
} 
4

bdukes là hoàn toàn đúng. Tôi đang thêm phản ứng của tôi vì gần đây tôi đã tìm thấy một cái gì đó thú vị phải làm với chức năng bind/unbind của jQuery và các chức năng ẩn danh, không gian tên sự kiện của nó. Trước đây được hiển thị phía trên sự kiện liên kết được gọi như sau.

jQuery('#textbox').bind('click',function(){EventWithParam('param')});

Để unbind này ngay cả người dùng phải gọi ... jQuery('#textbox').unbind('click');

Trong thực tế, loại bỏ tất cả các sự kiện onClick.

Bây giờ đến không gian tên jQuery. Nếu bạn có một hàm ẩn danh, bạn muốn đính kèm vào sự kiện nhấp chuột và sau đó bỏ liên kết làm điều đó như sau.

jQuery('#textbox').bind('click.yourNameSpace',function(){EventWithParam('param')});

Sau đó, để hủy đơn giản, hãy gọi chức năng unbind như sau.

jQuery('#textbox').unbind('click.yourNameSpace');

Phần còn lại của sự kiện onClick của bạn sẽ vẫn còn.

11

Bạn có thể chuyển tham số sự kiện làm đối số thứ hai cho bind().Nó không phải là đạo parametes gọi lại nhưng có lẽ bạn muốn sử dụng nó:

Từ tài liệu jQuery: bind

function handler(event) { 
    alert(event.data.foo); 
} 
$("p").bind("click", {foo: "bar"}, handler) 
+0

definatly một cái gì đó tôi sẽ sử dụng –

+0

Trong hàm handler(), đối tượng có thể được truy cập thông qua trường dữ liệu "event": function handler (evt) {var fooValue = evt.data.foo; } – SCO

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