2013-03-10 34 views
29

Truy cập stackoverflow.com/#_=_window.location.hash đánh giá là #_=_. Khỏe.Xóa hàm băm URL

Bây giờ, hãy thực hiện window.location.hash = '' để xóa hàm băm và URL trở thành stackoverflow.com/#. (Chú ý dấu sau #.)

Tại sao # trong window.location.hash không được bao gồm hoặc loại trừ không nhất quán? Làm cách nào để xóa # khỏi URL mà không cần tải lại trang?

(MDN nói

[băm là] một phần của URL sau ký hiệu #, bao gồm các ký hiệu #.

nhưng điều đó là không đúng đối với trong trường hợp một băm trống)

+0

Bạn đã quan sát hành vi này của trình duyệt nào? – Gumbo

+0

truy cập 'stackoverflow.com/#' cũng dẫn đến 'window.location.hash === ''' do đó nó là hành vi nhất quán. –

+0

Bạn đang nói rằng thao tác 'băm' với JavaScript dẫn đến' # 'trong URL và thuộc tính' băm' trống. Bây giờ, truy cập trang chỉ với '#' trong URL cũng dẫn đến thuộc tính 'hash' trống. Thuộc tính 'hash' chỉ được điền khi có các ký tự khác sau' # 'trong URL và nó là hành vi nhất quán trong tất cả các trình duyệt. –

Trả lời

53

Để trả lời câu hỏi thứ hai (loại bỏ các # mà không cần phải refresh lại trang):

history.pushState('', document.title, window.location.pathname); 
+3

Lưu ý: pushState là IE10 trở lên. –

+4

Tôi thích 'replaceState' để đạt được điều này. – Banago

+2

Có giải pháp nào cho IE9 không? Tôi đã thử 'window.location.href.replace (/#.*/," ");' nhưng nó tải lại trang. –

0

có 2 điều mang lại hành vi này:.

  • "Đặt thuộc tính băm điều hướng đến neo được đặt tên mà không cần tải lại tài liệu." (here)
  • "Khi bạn đặt đối tượng vị trí hoặc bất kỳ thuộc tính nào của nó ngoại trừ băm [...] Trong JavaScript 1.1 trở lên, hiệu quả của việc đặt vị trí phụ thuộc vào cài đặt của người dùng để so sánh tài liệu với tài liệu gốc mạng. " (here)

Vì vậy, về cơ bản, thiết lập thuộc tính băm không bao giờ nên dẫn đến một tải lại, thiết lập bất kỳ tài sản khác nên dẫn đến một tải lại (hoặc có lẽ một E-Tag/Modified-Since kiểm tra tiêu đề, tùy thuộc vào cài đặt trình duyệt).

Tôi giả định rằng vì mục đích nhất quán, trình tạo trình duyệt chuyển đổi cài đặt băm rỗng, để đặt '#' làm băm. Bằng cách này, url trong thanh vị trí không dẫn đến tải lại. Nhưng phần sau này là đầu cơ thuần túy.

4

trả lời cho câu hỏi đầu tiên của bạn:

Theo window.location doc trong Mozilla.org: "một phần của URL sau biểu tượng #, nếu có, bao gồm biểu tượng #, Chuỗi trống nếu url không chứa # hoặc không có gì sau số #. "

Thật kỳ lạ, tài liệu đó vừa được cập nhật vào ngày 4/8/2013. Bạn không chắc chắn nếu điều đó đã được thêm vào sau khi bạn đã kiểm tra tài liệu.

Bằng cách này (và tham chiếu đến câu trả lời), window.location.hash và pushState là các khái niệm khác nhau mặc dù có liên quan chặt chẽ.

-1

Tôi đã xử lý cùng một vấn đề khoảng hai tuần trước và kết luận của tôi là không có giải pháp tốt. Không có giải pháp trực tiếp, loại bỏ băm từ URL luôn buộc trình duyệt tải lại trang và thậm chí nếu có một giải pháp không giống như hack, tôi thà có băm ở cuối url hơn là sử dụng các giải pháp tối nghĩa.