2009-03-02 36 views

Trả lời

40

Một vài điều cần lưu ý trước tiên. MS đã phát minh ra một loại "đối tượng thời gian chạy clientside" được gọi là Sys.Application. Nó xử lý nâng cao init, load, và unload sự kiện trong suốt [clientside] tuổi thọ của trang, như sau:

  1. Sys.Application.initialize() bắt đầu các init một phần của chu kỳ sống. Đây initialize() s tất cả các điều khiển AJAX clientside, sau đó họ đã sẵn sàng để được tương tác với programatically
  2. Sys.Application bắt đầu các load phần của vòng đời, kêu gọi tất cả các bộ xử lý mà đã đăng ký sự kiện này
  3. Cuối cùng, nó gọi là toàn cầu chức năng pageLoad (nếu một được xác định)

Bước 2) và 3) được lặp lại cho mỗi phần (tức là AJAX + UpdatePanel) postback.

Vì vậy, cuối cùng, câu trả lời: pageLoad chỉ là một phím tắt tiện dụng để Sys.Application.add_load().

Tuy nhiên, liên quan đến mối quan hệ của nó với window.onload, mọi thứ bắt đầu trở nên thú vị. Về cơ bản, MS cần window.onload để chỉ kích hoạt sau khi giai đoạn init hoàn tất. Nhưng bạn không thể kiểm soát thời điểm trình duyệt sẽ kích hoạt onload vì nó được gắn với "nội dung đã tải". Đây được gọi là "the window.onload problem":

cháy sự kiện onload sau khi tất cả trang nội dung đã nạp (bao gồm hình ảnh và nội dung nhị phân khác). Nếu trang của bạn bao gồm nhiều hình ảnh thì bạn có thể thấy độ trễ đáng chú ý trước khi trang hoạt động.

Vì vậy, họ chỉ phát minh ra chức năng "đặc biệt" của riêng chúng để kích hoạt đúng thời điểm trong vòng đời sự kiện và gọi nó là "pageLoad". Và mẹo mà họ đã sử dụng để khởi động vòng đời sự kiện tùy chỉnh này là place the call to Sys.Application.initialize() just before the closing </form> tag. Thời gian chạy serverside thực hiện điều này. Người đọc tuyệt vời sẽ lưu ý rằng mẹo này cho phép MS giải quyết vấn đề window.onload, vì bất kỳ mã nào bạn đưa vào pageLoad sẽ kích hoạt độc lập với nội dung nhị phân (w/ one rare catch for IE).

> Chúng có hoạt động giống nhau không?

Về mặt khái niệm có, trong thực tế không hề do vấn đề window.onload nói. Quy tắc duy nhất là bạn nên đặt mã tương tác với các điều khiển AJAX của bạn chỉ trong pageLoad, kể từ window.onload theo quỹ đạo sự kiện của riêng nó.

> Hoặc được gọi trước người kia?

Chúng hoàn toàn độc lập 100%.

> Hoặc sẽ tự động được gọi hay không?

Cả hai sẽ được gọi nếu bạn đã xác định.

+1

câu trả lời của bạn đã hoàn tất, nhưng tôi có vấn đề khác với pageLoad, khi tôi đăng nhập vào trang của mình, tôi nhận thấy rằng nó được gọi và gọi tự động, lưu ý: tôi có telerik: RadAjaxManager trên trang, vì vậy là do lỗi xảy ra hoặc bình thường của nó để giữ được gọi là như vậy "như được gọi bởi một bộ đếm thời gian"? –

+1

đẹp viết +1 - giải pháp là rất vui cười microsoft – annakata

+0

@amrelgarhy: xem câu trả lời cập nhật của tôi: Bước 2) và 3) được gọi trên mỗi phần (tức là AJAX + UpdatePanel) postback. –

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