2011-01-29 18 views
14

FirefoxとIEの間に不満があります.JavaScriptで作業する前に、自動的にハッシュのパラメータをデコードします。 IEは自動的にURLをデコードしないので、読解エラーを出すことはありません。私は「!の%40%23%24%25 ^%に対しexample.com/#question=!%40%23%24%25^%26*(Firefoxで自動的にエンコードされたパラメータをURL内でデコードします。

のようなURLを取る場合、私はASP.NET ASP.NET MVC automatically decoding JSON-encoded parameters from AJAXので

を使用していない以外

私の問題は、これと同じです26 *( "encodeURIComponentを使ってエンコードされましたが、IEにはハッシュにアクセスすると"!%40%23%24%25 ^%26 * "のように残されますが、Firefoxでは自動的にハッシュにアクセスします"!@#$%^ & *("

この問題は、私のスクリプトでは、decodeURIComponentを使用してエンコードされた値をデコードすることに問題があります。文字列が実際にエンコードされていれば問題ありません。 Firefoxで既にデコードされているので、不正な形式のURIシーケンスエラーが発生し、IEでエラーが発生することはありません。

どうすればこの問題を解決できますか?

答えて

19

検索した後、私は、これは、クロスブラウザの問題であることが判明し、あなたが使用したいものを実際に代わりwindow.location.hash

+0

ありがとうございます。私はちょうどFx(Chromeは問題ありません)とlocation.href.split( "#!")[1]で同じ問題に遭遇しました。 – meloncholy

+1

Firefoxはこれもすぐにこれを修正するようには思われません。彼らは2002年以来バグについて議論してきました:(https://bugzilla.mozilla.org/show_bug.cgi?id = 135309とhttps://bugzilla.mozilla.org/show_bug.cgi?id=483304 – gregers

+0

Firefoxはハッシュ文字列の中で "#"を許可しているので、より防壁になる可能性がありますので、 'window.location.hash.split( "#")。splice(1).join( "#") '。 – fourthnen

1

location.href.split("#")[1]を使用することをお勧めし:確かに

decodeURI(window.location.hash.substr(1)) 

ウィンドウ。 location.href.split( "#!")[1]はFFによって自動的に(少なくとも今日は)デコードされません。

+0

'window.location.hash'は実際には問題の根源なので、これはうまくいきません。しかし、それはどうやって*すべきか... – gregers

0

上記の答えは、あなたのURLに複数の#が含まれている場合を除き、機能します。これはすべてのケースを処理する必要があります:

var hash = ""; 
var indexOfHash = location.href.indexOf("#"); 
if (indexOfHash > -1) { 
    hash = location.href.substring(indexOfHash); 
} 

また、すぐにFirefoxで修正する必要があるようです。ただ、ナイトリーを打つ:

https://bugzilla.mozilla.org/show_bug.cgi?id=378962

0

私はこの問題を抱えていました。私はこの解決策でそれを解決しました:

var currentLocation = document.location.hash; 
var decodedLocation = decodeURI(currentLocation); 
0

これは本当に古い質問ですが、根本的な問題はまだ解決されていません。 Firefoxは、他のブラウザではエンコードしないものをエンコードします。

私は全く別のアプローチを作成し、実際には、文字列がエンコードされているかどうかにかかわらずアルゴリズムを独立させる必要がありました。

私はこのソリューションは、それを必要とする人を見つける願ってい

function encodeOnce(text) { 
    var doubleEncoded = encodeURIComponent(text); 
    // only dive into it if there are any encoded strings... 
    if (doubleEncoded.indexOf('%') != -1) { 
    // reverse replace all % signs 
    doubleEncoded = doubleEncoded.replace(/%25/g, '%'); 
    // if this is not equal to the original string, ... 
    if (doubleEncoded != text) { 
     // ... that means there was something to encode 
     text = doubleEncoded; 
    } 
    } 
    return text; 
} 

それでは、あなたがこれを行うことができます。

solution = encodeOnce(window.location.hash.slice(1)); 

あなたはどう思いますか?

関連する問題