13

を使用しlocation.hashてクライアント アプリの状態をエンコードし、ユーザーが URL を使用してアプリを完全な状態で簡単にブックマークおよび/または共有できるようにしたいと考えています。

URL の最大長、特に Internet Explorer での制限に関する (時代遅れの) トピックが多数あります。ただし、 の最大サイズは明確ではありませんlocation.hash。ハッシュはクライアントにのみ存在するため、http またはサーバーの制限は関係ありません。

これをテストするために簡単な jsfiddle を作成しました: http://jsfiddle.net/Jz3ZA/。Chrome と Firefox (Ubuntu 12.04) の両方で、最大 50K のハッシュが機能するようです。これは、状態を保存するためにそれらを使用できるということですか、それとも他の制限を見落としているのでしょうか?

4

3 に答える 3

11

JS Fiddle (その修正版http://jsfiddle.net/Jz3ZA/18/ (以下のコード例を参照)) に基づいて、多くのブラウザーをテストして効果的なベースラインを取得できます。

  • クロム: 50K+
  • Firefox: 50K+
  • サファリ (iOS): 50K+
  • Internet Explorer 11: 2,025 ~ 2,050 の間で失敗する
  • Microsoft Edge: 2,025 ~ 2,050 の間で失敗する

したがって、他のブラウザーが何をサポートしているかに関係なく、Microsoft Edge または IE11 をサポートする必要がある場合は、2,025 文字ハッシュ未満に保つ必要があります。IE (および Edge と推測しています) には歴史的に URL の長さに制限があったため、これはベース URL の長さにも依存する場合があります。

function testall(){
  var sizes = [10,100,1000,2000,2025,2050,2100,2250,2500,2750,3000,4000,5000,10000, 50000];
  for(var i=0;i<sizes.length;i++){
    var n = sizes[i];
    if(!testhash(n)){
        alert("test failed at hash of length: " + n);
        return;
    }
  }
  alert("all tests passed");  
}

function testhash(n){
    var somestring = "#" + makestring(n);
    window.location.hash = somestring; 
    var success = (window.location.hash == somestring); 
    return success
}    

function makestring(n){
    var text = "";
    var possible = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789";

    for(var i=0;i<n;i++){
        text += possible.charAt(Math.floor(Math.random() * possible.length));
    }
    return text;
}
$("button").on("click", testall);
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.8.3/jquery.min.js"></script>
<button>Test!</button>

于 2017-06-13T22:44:30.060 に答える
-5

さまざまなブラウザーでの URL の最大長は?

ただし、これには通常、ハッシュ部分が含まれていないため、標準はないと思います。

フラグメント識別子は通常、ドキュメントのフラグメントを識別するために使用され、アプリの状態全体を保存するために使用すべきではないことを指摘したいと思います。代わりにlocalstorageを使用する必要があります。

共有またはブックマークする機能が必要な場合は、アプリの状態をサーバー側に保存し、フラグメント識別子を使用して保存された状態の ID を保存することを検討してください。

于 2013-04-27T01:35:40.290 に答える