URLハッシュの場所を取得し、jQueryで使用する


135

現在のページのURLのハッシュの後に値を取得し、これを新しい関数に適用できるようにしたい...例

URLは

www.example.com/index.html#foo

そして、これを次のコードと組み合わせて使用​​したいと思います

$('ul#foo:first').show();

これを取得し、変数に変換して2番目のコードで使用できるようにする方法があることを前提としています。


8
私にはコードはありませんが、コードインジェクションには熟しているように見えるので、入力をサニタイズしてください。
ネイトB

'ul#foo:first'ID 一意である必要があるため、この質問はほぼ10年前のものであると理解しても意味がありません:first。無効なIDを複製しない限り、セレクターへの追加は冗長です。10年前でさえ、IDの繰り返しは依然として無効であったことに注意してください。
j08691

10年前もなお間違っていました
ダグラス

回答:


280

編集者注:以下のアプローチはセキュリティ重大な影響を及ぼし、使用しているjQueryのバージョンによっては、ユーザーをXSS攻撃にさらす可能性があります。詳細については、この回答のコメントまたはSecurity Stack Exchangeに関するこの説明の中で、起こり得る攻撃の説明を参照してください。

location.hashプロパティを使用して、現在のページのハッシュを取得できます。

var hash = window.location.hash;
$('ul'+hash+':first').show();

このプロパティにはすでに#シンボルが最初に含まれていることに注意してください。

IDセレクター:firstを使用しているため、実際には疑似セレクターは必要ありません。IDはDOM内で一意であると想定されています。

URL文字列からハッシュを取得する場合は、次のString.substringメソッドを使用できます。

var url = "http://example.com/file.htm#foo";
var hash = url.substring(url.indexOf('#')); // '#foo'

アドバイス:ユーザーハッシュを好きなように変更できることに注意してください。セレクターに何かを注入するので、ハッシュを使用する前に確認する必要があります。


30
jQueryセレクターを使用してカスタムJavaScriptコードを実行できるため、無害化されていないハッシュを使用することは、恐ろしく、恐ろしく安全ではないことに注意してください。挿入されたコードの前に#を含むセレクターの最近のjQueryバージョンでは、これについて中途半端な修正がありますが、location.hashの先頭から#マークを削除すると、依然として危険にさらされます。例:var hash = location.hash.slice(1); $('ul.item'+hash).show().append($('#content'));これはハッシュに入れられたスクリプトタグを実行します。の$('body').find('ul'+hash+':first')代わりに使用するのは良い習慣です$('ul'+hash+':first')
Tgr

40
一部たブラウザは、ハッシュ記号を返し、それを使用する方が安全ですので、いくつかは、しないでください:var hash = location.hash.replace('#', '');
ティム

12
アリスはウェブサイトを運営し、ボブはそれを訪問し、認証してセッションクッキーを受け取ります。(時間が経つと、ボブがブラウザを閉じることもあります。)チャーリーはボブに「このクールなリンクをチェックしてください!」というメールを送信します。ボブがリンクを開くと、チャーリーが管理するサイトにつながります。このページは、ボブのブラウザをハッシュの攻撃ペイロードを持つアリスのサイトのページにリダイレクトします。ペイロードが実行され、ブラウザーはまだCookieを記憶しているので、チャーリーに送信するだけです。
Tgr

2
@Tgr、ドットを詳しく説明して接続していただきありがとうございます。この具体的な例によって、私(そして願わくば他の人)は、物事を安全に保つために警戒心を強めることができます。
snapfractalpop 2012

2
@buffer:$(userInput)$オーバーロードされ、文字列に文字が含まれているかどうかに応じて既存のノードを検索するか、新しいノードを作成する可能性があるため、一般に安全ではありません<>$(document).find(userInput)は常に既存のノードを検索するため、安全性は低下しません。つまり、ベストプラクティスは常にユーザー入力を無害化することです。たとえば、英数字のIDを使用する場合は、英数字であることを確認してください。
Tgr

35

location.hashはIEにとって安全ではありません。IE(IE9を含む)の場合、ページにiframeが含まれている場合、iframeコンテンツ内で手動で更新した後、location.hashの値はold(最初のページのロードの値)になります。手動で取得した値はlocation.hashとは異なるため、常にdocument.URLから取得してください

var hash = document.URL.substr(document.URL.indexOf('#')+1) 

7
更新:document.URLにはFirefox 3.6のハッシュ値が含まれていないため、location.hrefは安全ですvar hash = location.href.substr(location.href.indexOf( '#')+ 1)
Deepak Patil

4

純粋なJavaScriptソリューションをお探しの方

 document.getElementById(location.hash.substring(1)).style.display = 'block'

これにより時間を節約できることを願っています。


3

jQuery 1.9以降、:targetセレクターはURLハッシュと一致します。だからあなたはできる:

$(":target").show(); // or $("ul:target").show();

ハッシュに一致するIDを持つ要素を選択して表示します。


一致IDの代わりにハッシュを文字列として抽出する方法はありますか?
INA

@ina jQueryからハッシュを:target文字列として取得することを意味しますか?もしそうなら、私はそうは思わない。
j08691

1

現在のページにハッシュがある場合、最初にcekをお勧めします。それ以外の場合はundefined

$(window).on('load', function(){        
    if( location.hash && location.hash.length ) {
       var hash = decodeURIComponent(location.hash.substr(1));
       $('ul'+hash+':first').show();;
    }       
});

1

これを使用して、@ CMSの回答に記載されているセキュリティの影響に対処しています。

// example 1: www.example.com/index.html#foo

// load correct subpage from URL hash if it exists
$(window).on('load', function () {
    var hash = window.location.hash;
    if (hash) {
        hash = hash.replace('#',''); // strip the # at the beginning of the string
        hash = hash.replace(/([^a-z0-9]+)/gi, '-'); // strip all non-alphanumeric characters
        hash = '#' + hash; // hash now equals #foo with example 1

        // do stuff with hash
        $( 'ul' + hash + ':first' ).show();
        // etc...
    }
});
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.