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.

Philip Morton
sumber

Jawaban:

1406

Sederhana:

if(window.location.hash) {
  // Fragment exists
} else {
  // Fragment doesn't exist
}
Gareth
sumber
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
  }
Mark Notton
sumber
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>
José Leal
sumber
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
}
Marc Diethelm
sumber
+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.)

Jon Skeet
sumber
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;)

Lisan ÜNAL
sumber
Menyukai jawaban ini karena menggabungkan JS + JQ, cross-browser dan solusi sederhana, sudah menerapkan pendekatan ini.
Arthur Kushman
13
window.location.hash 

akan mengembalikan pengidentifikasi hash

pengguna2327502
sumber
Singkat dan bersih, sempurna
Jam
10

... atau ada pemilih jquery:

$('a[href^="#"]')
BaronVonKaneHoffen
sumber
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);
}
Emmanuel
sumber
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
   }
});
Nicholas Davison
sumber
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; 
  }
}
pengguna2465270
sumber
3
Tidakkah seharusnya "hash.length" sebagai kebalikan dari "hash.length ()"? :)
Nathan Pitman
4
var requestedHash = ((window.location.hash.substring(1).split("#",1))+"?").split("?",1);
Graham
sumber
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 ..)

Commonpike
sumber
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

Barney
sumber
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.

Rolando
sumber
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.

dnns
sumber
0

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

  function checkHash(){
      return (location.hash ? true : false);
  }
aabiro
sumber
-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
markg
sumber
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