Bagaimana Anda memeriksa # haso di URL menggunakan JavaScript?


783

Saya memiliki beberapa kode jQuery / JavaScript yang ingin saya jalankan hanya ketika ada #tautan anchor ( ) anchor di URL. Bagaimana Anda bisa memeriksa karakter ini menggunakan JavaScript? Saya perlu uji tangkap sederhana yang akan mendeteksi URL seperti ini:

  • example.com/page.html#anchor
  • example.com/page.html#anotheranchor

Pada dasarnya sesuatu seperti:

if (thereIsAHashInTheUrl) {        
    do this;
} else {
    do this;
}

Jika ada yang bisa mengarahkan saya ke arah yang benar, itu akan sangat dihargai.

Jawaban:


1406

Sederhana:

if(window.location.hash) {
  // Fragment exists
} else {
  // Fragment doesn't exist
}

43
Tambahan: objek .location hanya tersedia di URL jendela saat ini, Anda tidak dapat melakukan ini untuk URL yang sewenang-wenang (misalnya yang disimpan dalam variabel string)
Gareth

64
Selain itu, properti lokasi seperti. Hash dan .query juga tersedia di <a> elemen
Gareth

19
.searchtersedia pada <a>, bukan .query. JQuery sampel: $("<a/>").attr({ "href": "http://www.somewhere.com/a/b/c.html?qs=1#fragmenttest" })[0]. .hash => "#fragmenttest"dan .search= ?qs=1. Dari sana, tanyakan pertanyaan ekstraksi querystring untuk mendapatkan sesuatu selain string.
patridge

1
@hitautodestruct: pertanyaan ini bukan tentang perubahan hash, hanya apakah ada di halaman yang dimuat atau tidak.
Gareth

2
@ Gareth Ya, Anda benar. Baru menyadari bahwa tautan yang saya poskan adalah untuk hashchangeacara tersebut dan bukan window.location.hash. Meskipun yang terakhir tidak didukung oleh IE <8.
hitautodestruct

334
  if(window.location.hash) {
      var hash = window.location.hash.substring(1); //Puts hash in variable, and removes the # character
      alert (hash);
      // hash found
  } else {
      // No hash found
  }

54

Masukkan yang berikut ini:

<script type="text/javascript">
    if (location.href.indexOf("#") != -1) {
        // Your code in here accessing the string like this
        // location.href.substr(location.href.indexOf("#"))
    }
</script>

1
Terima kasih, window.location.hash hanya memiliki nilai jika ada nilai yang mengikuti #. sebagai contoh. //www.example.com# mengembalikan '' saat memeriksa hash.
Jessy

33

Jika URI bukan lokasi dokumen, cuplikan ini akan melakukan apa yang Anda inginkan.

var url = 'example.com/page.html#anchor',
    hash = url.split('#')[1];

if (hash) {
    alert(hash)
} else {
    // do something else
}

+1 untuk Javascript tidak tahu apa yang di luar batas :)
Dunc

2
@Dunc: Array JS pada dasarnya adalah Objects. Mengakses mereka dengan indeks adalah seperti mengakses properti Object seperti: obj['0']. Dalam JS ini benar: arr[0] === arr['0']Oleh karena itu jika indeks / kunci tidak ada nilai yang dikembalikan tidak terdefinisi bukannya di luar batas. jsfiddle.net/web5me/Mw376
Marc Diethelm

21

Sudahkah Anda mencoba ini?

if (url.indexOf('#') !== -1) {
    // Url contains a #
}

(Di mana urlURL yang ingin Anda periksa, tentu saja.)


17
$('#myanchor').click(function(){
    window.location.hash = "myanchor"; //set hash
    return false; //disables browser anchor jump behavior
});
$(window).bind('hashchange', function () { //detect hash change
    var hash = window.location.hash.slice(1); //hash to string (= "myanchor")
    //do sth here, hell yeah!
});

Ini akan menyelesaikan masalah;)


Menyukai jawaban ini karena menggabungkan JS + JQ, cross-browser dan solusi sederhana, sudah menerapkan pendekatan ini.
Arthur Kushman



6

Inilah yang dapat Anda lakukan untuk secara berkala memeriksa perubahan hash, dan kemudian memanggil fungsi untuk memproses nilai hash.

var hash = false; 
checkHash();

function checkHash(){ 
    if(window.location.hash != hash) { 
        hash = window.location.hash; 
        processHash(hash); 
    } t=setTimeout("checkHash()",400); 
}

function processHash(hash){
    alert(hash);
}

11
itu hanya perlu di 6 + 7. Al browser lain telah memasukkan acara
onhashchange

@ Tokimon - hebat! Saya tidak tahu itu. Tapi saya kira kita masih harus mendukung versi lama IE
Emmanuel

1
Ya sayangnya ... Bahkan IE 8 tidak akan pergi segera karena IE 9 tidak didukung pada XP :(
Tokimon

1
modernizr.com mengimplementasikan acara hashchange di browser lama (bersama dengan banyak fitur modern lainnya)
guigouz

4
Ini bukan kode direkomendasikan sama sekali: itu setidaknya harus: setTimeout(checkHash, 400). Plus, browser modern memiliki hashchangeacara sehingga Anda dapat melakukannya window.addEventListener('hashchange', function(){ … }). Akhirnya, membocorkan hashvariabel global adalah praktik lain yang tidak direkomendasikan, bahkan untuk contoh.
Oncle Tom

5

Kebanyakan orang mengetahui properti URL di document.location. Itu bagus jika Anda hanya tertarik pada halaman saat ini. Tetapi pertanyaannya adalah tentang bagaimana cara mengurai jangkar pada halaman, bukan halaman itu sendiri.

Apa yang kebanyakan orang lewatkan adalah bahwa properti URL yang sama juga tersedia untuk elemen jangkar:

// To process anchors on click    
jQuery('a').click(function () {
   if (this.hash) {
      // Clicked anchor has a hash
   } else {
      // Clicked anchor does not have a hash
   }
});

// To process anchors without waiting for an event
jQuery('a').each(function () {
   if (this.hash) {
      // Current anchor has a hash
   } else {
      // Current anchor does not have a hash
   }
});

5
function getHash() {
  if (window.location.hash) {
    var hash = window.location.hash.substring(1);

    if (hash.length === 0) { 
      return false;
    } else { 
      return hash; 
    }
  } else { 
    return false; 
  }
}

3
Tidakkah seharusnya "hash.length" sebagai kebalikan dari "hash.length ()"? :)
Nathan Pitman

4
var requestedHash = ((window.location.hash.substring(1).split("#",1))+"?").split("?",1);

3

Komentar Partridge dan Gareths di atas sangat bagus. Mereka pantas mendapat jawaban terpisah. Rupanya, hash dan properti pencarian tersedia di objek html Link apa saja:

<a id="test" href="foo.html?bar#quz">test</a>
<script type="text/javascript">
   alert(document.getElementById('test').search); //bar
   alert(document.getElementById('test').hash); //quz
</script>

Atau

<a href="bar.html?foo" onclick="alert(this.search)">SAY FOO</a>

Jika Anda memerlukan ini pada variabel string biasa dan kebetulan memiliki jQuery, ini seharusnya berfungsi:

var mylink = "foo.html?bar#quz";

if ($('<a href="'+mylink+'">').get(0).search=='bar')) {
    // do stuff
}

(tapi mungkin sedikit berlebihan ..)


3

Melempar ini ke sini sebagai metode untuk mengabstraksi properti lokasi dari string mirip URI. Meskipun window.location instanceof Locationbenar, setiap upaya untuk memohon Locationakan memberi tahu Anda bahwa itu adalah konstruktor ilegal. Anda masih bisa mendapatkan hal-hal seperti hash, query, protocoldll dengan menetapkan string Anda sebagai hrefmilik elemen DOM jangkar, yang kemudian akan berbagi semua properti alamat dengan window.location.

Cara paling sederhana untuk melakukan ini adalah:

var a = document.createElement('a');
a.href = string;

string.hash;

Untuk kenyamanan, saya menulis perpustakaan kecil yang memanfaatkan ini untuk mengganti Locationkonstruktor asli dengan yang akan mengambil string dan menghasilkan window.locationobjek seperti: Location.js


1

Biasanya klik lebih dulu daripada perubahan lokasi, jadi setelah klik adalah ide yang baik untuk mengaturTimeOut untuk mendapatkan pembaruan window.location.hash

$(".nav").click(function(){
    setTimeout(function(){
        updatedHash = location.hash
    },100);
});

atau Anda dapat mendengarkan lokasi dengan:

window.onhashchange = function(evt){
   updatedHash = "#" + evt.newURL.split("#")[1]
};

Saya menulis plugin jQuery yang melakukan sesuatu seperti apa yang ingin Anda lakukan.

Ini adalah jangkar router sederhana.


1

Berikut adalah fungsi sederhana yang mengembalikan trueatau false(memiliki / tidak memiliki tagar):

var urlToCheck = 'http://www.domain.com/#hashtag';

function hasHashtag(url) {
    return (url.indexOf("#") != -1) ? true : false;
}

// Condition
if(hasHashtag(urlToCheck)) {
    // Do something if has
}
else {
    // Do something if doesn't
}

Pengembalian truedalam hal ini.

Berdasarkan komentar @ jon-skeet.


0

Ini adalah cara sederhana untuk menguji ini untuk URL halaman saat ini:

  function checkHash(){
      return (location.hash ? true : false);
  }

-2

terkadang Anda mendapatkan string kueri lengkap seperti "#anchorlink? firstname = mark"

ini skrip saya untuk mendapatkan nilai hash:

var hashId = window.location.hash;
hashId = hashId.match(/#[^?&\/]*/g);

returns -> #anchorlink

6
Tidak mungkin karena hash ditambahkan setelah string kueri dan tidak pernah dikirim ke server. Satu-satunya waktu hash akan muncul sebelum string kueri adalah ketika Anda memodifikasi url dengan tangan.

1
ya, tetapi terkadang orang mengirim url pada format ini. ini hanya agar Anda bisa mendapatkan nilai hash saja dan mengabaikan yang lain. :)
markg
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.