2009-11-09 53 views
36

window.location.hash có mã hóa hoặc giải mã đại diện của phần url không?Mã hóa window.location.hash

Khi tôi mở url cùng (http://localhost/something/#%C3%BC nơi %C3%BC dịch để ü) trong Firefox 3.5 và Internet Explorer 8, tôi nhận được các giá trị khác nhau cho document.location.hash:

  • IE8: #%C3%BC
  • FF3.5:

Có cách nào để tải một biến thể trong cả hai trình duyệt không?

Trả lời

37

Thật không may, đây là lỗi trong Firefox khi giải mã location.hash thêm thời gian khi truy cập. Ví dụ, hãy thử điều này trong Firefox:

location.hash = "#%30"; 
location.hash === "#0"; // This is wrong, it should be "#%30" 

Giải pháp duy nhất qua trình duyệt là chỉ cần sử dụng (location.href.split("#")[1] || "") thay vì để nhận được băm. Đặt giá trị băm bằng cách sử dụng location.hash có vẻ hoạt động chính xác cho tất cả các trình duyệt hỗ trợ location.hash.

+0

Vâng, đó có vẻ là giải pháp hợp lý nhất. – Michael

+0

Bài kiểm tra này trả về 'false' dưới Firefox 10.0.1 ít nhất. Tôi không chắc chắn khi nó thay đổi nhưng tất nhiên nếu bạn muốn hỗ trợ các phiên bản cũ thì đây vẫn là lời khuyên tốt nhất. – hippietrail

+1

Điều gì sẽ xảy ra nếu phần băm có chứa #? Trong trường hợp này, phương thức chia sẽ không hoạt động. – Christophe

0

Thực tế trong phiên bản Firefox (3.5 trên Linux), nếu tôi nhập "#% C3% BC" dưới dạng băm trong URL, chính URL đó thực sự là chuyển đổi thành unicode với "# ü". Nhưng bạn đã xuất hiện để trả lời câu hỏi của riêng bạn - trong Firefox, trình duyệt biến đổi mã thoát thực thể trong URL, trong khi trong IE, nó không có.

Lời khuyên của tôi thực sự là: Thay vì đặt "#% C3% BC" vào URL, chỉ cần sử dụng unicode đầy đủ trong băm và URL của bạn. Đó có phải là một lựa chọn không? Nó sẽ hoạt động tốt trong mọi trình duyệt hiện đại.

+3

Không, không phải: (Firefox của bạn (và của tôi cũng vậy) chỉ giả vờ sử dụng ký tự 'ü'. Trong HTTP nó luôn sử dụng mã hóa phần trăm. Di chuột qua liên kết đó: http: // test /% C3% BC Thanh trạng thái của Firefox hiển thị một 'ü' vì một lý do nào đó, nhưng nếu bạn sử dụng trình thám thính HTTP, bạn sẽ tìm ra rằng nó đang gửi'% C3% BC'. bằng cách sử dụng một trong một chuyển hướng HTTP, tôi có thể không trực tiếp sử dụng các ký tự unicode anyway – Michael

+0

Bạn có chắc chắn rằng không phụ thuộc vào mã hóa là mã hóa ASCII và unicode? –

+0

AFAIK không có cách nào để chuyển các ký tự unicode trong HTTP mà không cần chuẩn bị đặc biệt giống như mã hóa phần trăm (vì HTTP không cho phép các ký tự nằm ngoài phạm vi ASCII). – Michael

1

Bạn có thể sử dụng decodeURIComponent, nó sẽ trở lại trong mọi trường hợp:

decodeURIComponent('#%C3%BC'); // #ü 
decodeURIComponent('#ü'); // #ü 

Hãy thử nó ra here.

+2

Không phải là giải pháp vì: 'decodeURIComponent ('% 2540'); //% 40 (IE) ' nhưng ' decodeURIComponent ('% 40'); // @ (FF) ' – Michael

+0

Không thực sự chắc chắn về ý của bạn,% 2540 là ký tự'% 'được mã hóa ('% 25') và chuỗi ký tự '40' không được mã hóa, 'decodeURIComponent ('% 40 ');' là @ trong IE hoặc Firefox ... http://jsbin.com/esafe – CMS

+4

Giả sử tôi muốn sử dụng hàm băm cho hàm tìm kiếm và ai đó muốn tìm kiếm '% 40' (nhưng không phải cho' @ '). Tùy thuộc vào trình duyệt của mình, tôi sẽ nhận được '#% 2540' (IE) hoặc' #% 40' (FF) là 'location.hash'. Nếu tôi giải mã nó sau đó, tôi nhận được kết quả khác nhau trong các trình duyệt khác nhau. – Michael

4

Trả lời câu hỏi của riêng tôi, giải pháp hiện tại của tôi là phân tích window.location.href thay vì sử dụng window.location.hash, vì trước đây luôn là mã hóa url (tức là trong mọi trình duyệt). Do đó, chức năng decodeURIComponentCMS luôn có thể được sử dụng một cách an toàn. YUI cũng vậy, do đó không thể sai được ...