2009-09-10 18 views
16

Gmail sử dụng # khi bạn nhấp vào một thư để phân biệt trang (+ hành động Ajax). http://mail.google.com/mail/#inbox/1238e709e37a1394Cách Gmail làm cho IE Back hoạt động mà không làm mới?

tôi thấy: Google using # instead of search? in URL. Why?

Trong FF hay Chrome bạn có thể sử dụng Forward và Back mà không cần refresh giữa những url: http://X.com/MyPage.aspx#1 http://X.com/MyPage.aspx#2 http://X.com/MyPage.aspx#3

Nhưng trên IE làm mới trang và nó doesn không tính các thông số sau # khi một hành động ngược được thực hiện.

Gmail làm cho điều kỳ diệu xảy ra như thế nào?

+1

1 nhiều người nên biết về thiết kế ứng dụng web trong mô hình này! – jrharshath

Trả lời

13

Tôi có thể cung cấp cho bạn câu trả lời cho điều này, bởi vì tôi đã đối mặt và giải quyết vấn đề này.

Có một vài khái niệm để hiểu ở đây đầu tiên:

  1. javascript không thể làm thay đổi lịch sử trình duyệt trực tiếp.
  2. bất cứ khi nào URL cơ sở của khung nội tuyến trong trang thay đổi, lịch sử được cập nhật. (nhưng điều này có một số quirks với các trình duyệt khác nhau).
  3. url có phần "được băm": ví dụ: trong URL http://mail.google.com/mail#inbox, #inbox là phần được băm. Cho phép gọi nó là "băm". vì vậy http://mail.google.com/mail sẽ là "URL cơ sở" của chúng tôi.

Lịch sử theo dõi của GMail chủ yếu được thực hiện bằng cách sử dụng các thủ thuật dựa trên "băm" này.

Vì vậy, một vài khái niệm hơn:

  1. khi URL trong những thay đổi thanh địa chỉ, lịch sử được cập nhật (URL trước đi vào lịch sử)
  2. khi URL cơ sở được thay đổi, trang được tải lại.
  3. khi phần băm của URL thay đổi mà không thay đổi URL cơ sở, trang không được tải lại.

Vì vậy, khi bạn đi http://mail.google.com/mail#inbox-http://mail.google.com/mail#sent, trang không được làm mới.

Bây giờ, nếu GMail nhận được thông báo sự kiện khi băm thay đổi, thì gmail có thể thực hiện hành động dựa trên điều đó. Thật không may, không có sự kiện DOM nào có thể giúp chúng tôi nắm bắt các hành động lịch sử. Vì vậy, thay vào đó (đây là phần cho thấy cách tôi vượt qua vấn đề), chúng tôi chạy một vòng lặp vô hạn để kiểm tra các thay đổi đối với hàm băm. Nếu nó quan sát một thay đổi, thì chúng tôi phát hiện một nhấp chuột vào nút "quay lại" hoặc "chuyển tiếp" của trình duyệt.

Khi giải quyết điều này, tôi đã tạo ra một công cụ hữu ích: URL parser. Nó có thể phân tích cú pháp các tham số GET trong URL, cũng như các tham số được mã hóa trong Hash. Cung cấp cho các bản demo một đi!

Chúc mừng!


Về vấn đề này trong IE: Tôi không nhận ra rằng giải pháp dựa trên 'băm' này không hoạt động trên IE (nhà phát triển Linux cũ kém).

Nhưng đối với IE, bạn có thể sử dụng iframe ẩn và sử dụng thuộc tính "url ảnh hưởng đến lịch sử" để triển khai lịch sử. Tôi biết tuyên bố này thiếu chi tiết, nhưng điều đó bắt nguồn từ sự thiếu kinh nghiệm của riêng tôi với IE.

tôi sẽ cố gắng giải pháp này, và theo dõi :)

Tôi tìm thấy một loạt các liên kết trên internet, mà làm việc triển khai đúng đắn về lịch sử sử dụng iframe/vị trí băm. Tôi không có đủ kiên nhẫn để tìm hiểu sự khác biệt giữa giao diện iframe trên các trình duyệt khác nhau.

Tôi đoán tôi thích số jquery plugin. YUI cũng có một người quản lý lịch sử.

Chúc mừng!

+0

+1 cho thông tin thú vị, nhưng tôi không hiểu cách nó liên quan đến vấn đề cụ thể khi quay lại/chuyển tiếp trong IE. – Kamarey

+0

Cảm ơn bạn đã trả lời. Nhưng trên IE Nếu url là: 1. [X.aspx] 2. [X.aspx # A] 3. [X.aspx # B] Sau đó nhấn Back: nó sẽ đi đến 1 [X.aspx] & Page Refreshes , không phải 2. Làm thế nào tôi có thể làm cho Back on IE chuyển sang 2 [X.aspx # A] và không cần làm mới trang? như trên Gmail. – SirMoreno

+0

okay, đó là một lĩnh vực mà tôi chưa nghiên cứu hoàn toàn. Nhưng có một số mẹo bạn có thể sử dụng. Đang thêm chúng vào câu trả lời ... – jrharshath

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