JavaScript kullanarak bir URL'de #hash değerini nasıl kontrol edebilirsiniz?


783

Yalnızca #bir URL'de bir karma ( ) bağlantı bağlantısı olduğunda çalıştırmak istediğiniz bazı jQuery / JavaScript kodu var . JavaScript kullanarak bu karakteri nasıl kontrol edebilirsiniz? Bunun gibi URL'leri algılayacak basit bir catch-all testine ihtiyacım var:

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

Temelde şu çizgiler boyunca bir şey:

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

Birisi beni doğru yönde gösterebilirse, bu çok takdir edilecektir.

Yanıtlar:


1405

Basit:

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

42
Ek: .location nesnesi yalnızca geçerli pencerenin URL'sinde kullanılabilir, bunu rastgele bir URL için yapamazsınız (örneğin, bir dize değişkeninde depolanan bir URL)
Gareth

64
Ayrıca, .hash ve .query gibi konum özellikleri <a> öğelerinde de mevcuttur
Gareth

19
.searchkullanılabilir <a>, değil .query. Numune jQuery: $("<a/>").attr({ "href": "http://www.somewhere.com/a/b/c.html?qs=1#fragmenttest" })[0]. .hash => "#fragmenttest"ve .search= ?qs=1. Oradan, bir dize dışında bir şey almak için sorgu dizesi çıkarma sorusuna basın.
patridge

1
@hitautodestruct: bu soru, yalnızca sayfa yüklemesinde mevcut olsun ya da olmasın, karma değişikliklerle ilgili değildir.
Gareth

2
@Gareth Evet, haklısın. Sadece gönderdiğim bağlantının hashchangeolay için olduğunu fark ettim window.location.hash. İkincisi IE <8 tarafından desteklenmese de
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

Aşağıdakileri koyun:

<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
Teşekkürler, window.location.hash yalnızca # değerini izleyen bir değer varsa bir değere sahiptir. Örneğin. //www.example.com#, karmayı kontrol ederken '' döndürür.
Jessy

33

URI belgenin konumu değilse bu snippet istediğinizi yapar.

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

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

Javascript için +1 sınırların dışında olduğunu bilmiyor :)
Dunc

2
@Dunc: Peki JS dizileri temelde Nesnelerdir. Endeks onları erişme şöyle bir nesne özelliği erişme gibidir: obj['0']. JS'de bu doğrudur: arr[0] === arr['0']Bu nedenle, dizin / anahtar yoksa, döndürülen değer sınırların dışında yerine tanımsızdır. jsfiddle.net/web5me/Mw376
Marc Diethelm

21

Bunu denedin mi?

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

( urlAçıkça kontrol etmek istediğiniz URL nerede ?)


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!
});

Bu sorunu çözecektir;)


Bu cevap sevdim JS + JQ, çapraz tarayıcı ve basit bir çözüm coz, zaten bu yaklaşımı uyguladı.
Arthur Kushman



6

Aşağıda, karma değişikliğini düzenli olarak denetlemek ve ardından karma değerini işlemek için bir işlev çağırmak için neler yapabilirsiniz.

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
Bu sadece 6 + 7'de gerekli. Diğer tüm tarayıcılar onhashchange etkinliğini
ekledi

@Tokimon - harika! Bunu bilmiyordum. Ama sanırım hala IE'nin eski sürümlerini desteklemeliyiz
Emmanuel

1
Evet ne yazık ki ... IE 9 XP'de desteklenmediği sürece IE 8 bile gitmeyecek :(
Tokimon

1
modernizr.com , hashchange olayını eski tarayıcılara uygular (bir dizi diğer modern özellik ile birlikte)
guigouz

4
Bu, tüm bir tavsiye kodu değil: en azından olmalıdır: setTimeout(checkHash, 400). Ayrıca, modern tarayıcılar hashchangeetkinliğe sahiptir, böylece bir window.addEventListener('hashchange', function(){ … }). Son olarak, küresel hashdeğişkenin sızdırılması, bir örnek için bile tavsiye edilmeyen başka bir uygulamadır.
Tom Amca

5

Çoğu kişi document.location öğesindeki URL özelliklerinin farkındadır. Yalnızca geçerli sayfayla ilgileniyorsanız bu harika bir şey. Ancak soru, sayfanın kendisinde değil, bir sayfada bağlantıların ayrıştırılmasıyla ilgilidir.

Çoğu insanın kaçırdığı şey, aynı URL özelliklerinin bağlantı öğeleri için de kullanılabilir olmasıdır:

// 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
"Hash.length ()" yerine "hash.length" olmamalı mı? :)
Nathan Pitman

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

3

Keklik ve Gareths yukarıdaki yorumlar harika. Ayrı bir cevabı hak ediyorlar. Görünüşe göre, karma ve arama özellikleri herhangi bir html Link nesnesinde kullanılabilir:

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

Veya

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

Bu normal bir dize değişkeni gerekiyorsa ve çevresinde jQuery olması durumunda, bu çalışması gerekir:

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

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

(ama belki biraz abartılı ..)


3

Bunu, keyfi URI benzeri dizelerden konum özelliklerini soyutlama yöntemi olarak buraya atmak. Her ne kadar window.location instanceof Locationdoğru olsa da, herhangi bir çağrı denemesi Location, bunun yasadışı bir kurucu olduğunu söyleyecektir. Hala gibi şeyler alabilirsiniz hash, query, protocolgibi dize ayarlayarak vb hrefsonra tüm adres özelliklerini paylaşacak DOM çapa elemanı, mülkiyet window.location.

Bunu yapmanın en basit yolu:

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

string.hash;

Kolaylık sağlamak için, yerel yapıcıyı Locationdizeleri alıp window.locationbenzeri nesneler üretecek bir kütüphaneyle değiştirmek için bunu kullanan küçük bir kütüphane yazdım : Location.js


1

Genellikle tıklamalar konum değişikliklerinden önce gelir, bu nedenle bir tıklamanın güncellenmiş window.location.hash dosyasını ayarlamak için setTimeOut'u ayarlamak iyi bir fikirdir

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

veya şu konumla dinleyebilirsiniz:

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

Yapmak istediğin gibi bir şey yapan bir jQuery eklentisi yazdım .

Basit bir çapa yönlendiricisi.


1

İşte dönen trueveya false(bir hashtag'e sahip olan / olmayan) basit bir işlev :

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
}

İade truebu durumda.

@ Jon-skeet yorumuna dayanarak.


0

Bunu geçerli sayfa URL'si için test etmenin basit bir yoludur:

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

-2

bazen "#anchorlink? firstname = mark" gibi tam sorgu dizesini alırsınız

bu karma değerini almak için benim komut dosyasıdır:

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

returns -> #anchorlink

6
Karma, sorgu dizesinden sonra eklenir ve hiçbir zaman sunucuya gönderilmez. Sorgu dizesinden önce URL'yi el ile değiştirdiğinizde yalnızca zaman karması görünür.

1
Evet, ancak bazen insanlar bu biçimde URL gönderir. bu sadece hash değerini alabilir ve diğerlerini ihmal edebilirsiniz. :)
markg
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.