2009-04-17 6 views

Trả lời

10

Bạn có thể khai thác vào các PageRequestManager endRequestEvent:

Sys.WebForms.PageRequestManager.getInstance().add_endRequest(function(){}); 

Hoặc nếu nó là kiểm soát các sự kiện bạn đang cố đính kèm, bạn có thể sử dụng jQuery live events.

Tùy chọn khác là thực hiện ủy nhiệm sự kiện theo cách thủ công. Đó là những gì các sự kiện "sống" đang làm dưới sự che chở. Đính kèm trình xử lý sự kiện vào chính tài liệu, sau đó điều kiện thực thi phương thức của bạn nếu người gửi của sự kiện là phần tử bạn mong đợi.

$(document).click(function(e){ 
    if($(e.target).is(".collapseButton")){ 
     $(this).find(".collapsePanel").slideToggle(500); 
    } 
}) 
+0

cảm ơn rằng làm việc, đoán nó không phải là effecient nhưng nó chỉ cho một trang này. – Blankman

+0

Nó thực sự rất hiệu quả. Nếu bạn có trình xử lý sự kiện trên mỗi hàng của lưới, điều này sẽ chỉ có một trình xử lý sự kiện cho toàn bộ lưới. Nó thậm chí còn tốt hơn nếu bạn có nhiều trình xử lý sự kiện cho mỗi hàng. Bạn có thể nhận được chỉ với một .... và không có gì để đính kèm vào hồ sơ mới được tạo thủ công hoặc thông qua một phần postbacks. – Mark

6

Tôi đoán từ 'một phần trang đăng lại' bạn đang làm việc trong vùng Asp.net.

Hãy thử sử dụng

Sys.Application.add_load(function() { }); 

Bạn vẫn có thể sử dụng tất cả những thứ jQuery bình thường bên trong func đó.

+0

Chính xác. Đó chính xác là lý do tại sao MS phát minh ra sự kiện tải đó: họ biết họ sẽ thổi đi các phần tử DOM sau khi postback một phần, và họ cần cung cấp cho devs một cách đơn giản để làm việc khi trang sẵn sàng, bất kể AJAX UpdatePanels ưa thích có được sử dụng hay không không phải. – JPot

+0

Hoàn hảo. Điều này đã làm các trick. Chỉ cần gọi các phương thức thiết lập tương tự của tôi trực tiếp và thông qua sự kiện này và bây giờ nó hoạt động hoàn hảo. Chúc mừng! –

0

Một số phần tử DOM được thay thế khi bạn thực hiện một phần postback, và tất nhiên, các phần tử mới sẽ làm mất các ràng buộc jQuery. Bạn có thể sử dụng lớp ScriptManager đăng ký một kịch bản mà sẽ được thực hiện sau khi kết thúc postback một phần (có một cái nhìn here)

2

Kiểm tra tính năng "trực tiếp" của jQuery 1.3 here. Bạn có thể thêm sự kiện vào các yếu tố trong tương lai cũng như các yếu tố hiện tại trên trang. Điều này có thể đơn giản hóa mã bạn cần phải viết.

+0

chúng tôi không sử dụng 1,3 để cnt 'sử dụng trực tiếp. – Blankman

+1

Chúng tôi sử dụng các sự kiện "trực tiếp" nhiều, nhưng đôi khi chúng không đáp ứng được nhu cầu. Nếu bạn đang sử dụng jQuery để thao tác DOM, bạn sẽ cần phải thao tác lại nó sau khi nó được cập nhật thông qua một phần postback. – Mark

+1

Bạn có thể đạt được hiệu quả tương tự của trực tiếp bằng cách thực hiện ủy nhiệm sự kiện theo cách thủ công. – Mark

0

Giải pháp thanh lịch nhất (sử dụng jQuery 2.x) là thế này:

Sử dụng "trên" sự kiện. Đảm bảo bạn ràng buộc sự kiện với tài liệu chứ không phải chính yếu tố đó!

Mã dụ:

$(document).on('click', 'div.messages', function() { 
    console.log('click on div.messages'); 
    return false; 
}); 

Đặt mã này vào document.ready ví dụ.

Điều này hoạt động ngay cả khi div.messages được thay đổi hoặc được tạo bên trong UpdatePanel. Và nó không bao giờ bị bắn hai lần hoặc nhiều lần cùng một lúc.