Soru Window.location.hash kodlaması


does window.location.hash url parçasının kodlanmış veya kodu çözülmüş temsilini içerir?

Aynı URL'yi açtığımda (http://localhost/something/#%C3%BC nerede %C3%BCÇevirir üFirefox 3.5 ve Internet Explorer 8’de farklı değerler aldım. document.location.hash:

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

Her iki tarayıcıda da bir varyant almanın bir yolu var mı?


37
2017-11-09 20:27


Menşei




Cevaplar:


Ne yazık ki, bu Firefox'ta çözdüğü bir hatadır. location.hash erişildiğinde fazladan bir zaman. Örneğin, bunu Firefox'ta deneyin:

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

Sadece çapraz tarayıcı çözümü sadece kullanmaktır (location.href.split("#")[1] || "") bunun yerine hash elde etmek için. Kullanarak hash ayarlama location.hash destekleyen tüm tarayıcılar için düzgün çalışıyor gibi görünüyor location.hash gerçi.


38
2017-11-10 00:15



Evet, bu en makul çözüm gibi görünüyor. - Michael
Bu test geri döndü false en az Firefox 10.0.1 altında. Ne zaman değiştiğinden emin değilim ama tabii ki eski sürümleri desteklemek istiyorsanız, bu hala en iyi tavsiye. - hippietrail
Karma parçası kendisi bir # varsa ne? Bu durumda bölünme yöntemi çalışmaz. - Christophe
Çözümünüz için teşekkürler! sadece location.hash çıktısı bir lider "#" ama location.href.split değil olduğunu unutmayın. - Tapper
@Christophe: Olasının kendisinde '#' olması '% 23' olarak kodlanmalıdır. Fazladan emin olmak için, açıkça kullanabilirsiniz location.href.split('#').splice(1).join('#'). Bu durumda eklemek bile gerek yok || "" çünkü sonuçta ilk etapta karma yok ise boş bir dizedir. - Pekka Klärck


Kendi sorumu cevaplayan mevcut çözümüm ayrıştırmak window.location.href kullanmak yerine window.location.hashÇünkü, her zaman (her tarayıcıda) url kodludur. Bu yüzden decodeURIComponent fonksiyon CMS Önerilen her zaman güvenle kullanılabilir. YUI aynısını yapar, bu yüzden o yanlış olamaz ...


4
2017-11-09 23:03





Kullanabilirsiniz decodeURIComponent, geri dönecek  her durumda:

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

Denemek İşte.


3
2017-11-09 20:37



Çözüm değil çünkü: decodeURIComponent('%2540'); // %40 (IE) fakat decodeURIComponent('%40'); // @ (FF) - Michael
Ne demek istediğine emin değilim,% 2540 % karakter kodlu (%25) ve kodlanmamış 40 dize, decodeURIComponent('%40'); IE veya Firefox'ta ... jsbin.com/esafe - CMS
Bir arama fonksiyonu için hash kullanmak istediğimi ve birisinin aramak istediğini varsayalım. %40 (ama değil @). Tarayıcısına bağlı olarak, #%2540 (IE) veya #%40 (FF) olarak location.hash. Bunu çözersem, farklı tarayıcılarda farklı sonuçlar elde ederim. - Michael


Aslında Firefox'umda (Linux'ta 3.5), URL'de "#% C3% BC" yazıyorsam, URL aslında dönüşümler "# ü" ile unicode için. Ancak, kendi sorunuzu yanıtladığınız görülmüştür - Firefox'ta tarayıcı, URL'deki varlık çıkış kodlarını dönüştürürken, IE'de değil.

Tavsiyem aslında bu: URL'ye "#% C3% BC" koyma yerine, yalnızca karma ve URL'lerinizdeki tam unicode'u kullanın. Bu bir seçenek mi? Herhangi bir modern tarayıcıda iyi çalışmalıdır.


0
2017-11-09 20:31



Hayır, değil :(. Firefox'unuz (ve benimki de) sadece bir ükarakter. HTTP'de her zaman yüzde kodlamasını kullanır. Farenizi şu bağlantı üzerinden taşıyın: Test /% C3% BC. Firefox durum çubuğu bir ü bazı sebeplerden dolayı. Fakat bir HTTP dinleyicisi kullanırsanız, göndereceğini öğreneceksiniz. %C3%BC. Ve temel olarak, bunu bir HTTP yönlendirmesinde kullandığım için, yine de unicode karakterlerini doğrudan kullanamıyorum. - Michael
ASCII v bir unicode kodlaması olan kodlamaya bağlı olmadığından emin misiniz? - Ken Kinder
AFAIK, HTTP'de unicode karakterleri yüzde kodlama gibi özel bir hazırlık olmadan aktarmanın bir yolu yoktur (çünkü HTTP ASCII aralığının dışındaki karakterlere izin vermez). - Michael