Как вы можете проверить #hash в URL с помощью JavaScript?

У меня есть некоторый код jQuery/JavaScript, который я хочу запускать, только когда в URL есть ссылка на хэш (#). Как вы можете проверить наличие этого символа с помощью JavaScript? Мне нужен простой всеобъемлющий тест, который бы обнаруживал URL-адреса, подобные этим:

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

В основном что-то вроде:

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

Если бы кто-нибудь мог указать мне правильное направление, это было бы очень ценно.

Ответ 1

Простой:

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

Ответ 2

  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
  }

Ответ 3

Введите следующее:

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

Ответ 4

Если URI не является местоположением документа, этот фрагмент будет делать то, что вы хотите.

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

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

Ответ 5

Вы пробовали это?

if (url.indexOf("#") != -1)
{
}

(Где url - это URL, который вы хотите проверить, очевидно.)

Ответ 6

$('#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!
});

Это решит проблему;)

Ответ 7

window.location.hash 

вернет хэш-идентификатор

Ответ 8

... или есть селектор jquery:

$('a[href^="#"]')

Ответ 9

Здесь вы можете периодически проверять изменение хэша, а затем вызывать функцию для обработки хэш-значения.

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

Ответ 10

Большинство людей знают о свойствах URL в документе .location. Это здорово, если вас интересует только текущая страница. Но вопрос состоял в том, что он мог разбирать привязки на странице, а не на самой странице.

То, что большинство людей, похоже, пропустит, это то, что те же свойства URL также доступны для элементов привязки:

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

Ответ 11

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

Ответ 12

Замечания Partridge и Gareths выше замечательны. Они заслуживают отдельного ответа. По-видимому, свойства хэша и поиска доступны для любого объекта html Link:

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

или

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

Если вам нужно это на регулярной строковой переменной и, случается, с jQuery, это должно работать:

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

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

(но его, возможно, немного переборщило..)

Ответ 13

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

Ответ 14

Бросьте это здесь как метод абстрагирования свойств местоположения от произвольных строк, подобных URI. Хотя window.location instanceof Location истинно, любая попытка вызвать Location сообщит вам, что это незаконный конструктор. Вы можете добираться до таких вещей, как hash, query, protocol и т.д., Установив свою строку как свойство href элемента привязки DOM, который затем передаст все свойства адреса с помощью window.location.

Самый простой способ сделать это:

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

string.hash;

Для удобства я написал небольшую библиотеку, которая использует это, чтобы заменить собственный конструктор Location тем, который будет принимать строки и создавать объекты window.location -like: Location.js

Ответ 15

Обычно клики идут сначала, чем изменения местоположения, поэтому после щелчка это хорошая идея setTimeOut обновить window.location.hash

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

или вы можете прослушать местоположение с помощью:

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

Я написал плагин jQuery, который делает что-то вроде что вы хотите сделать.

Это простой якорный роутер.

Ответ 16

Вот простая функция, которая возвращает true или false (имеет/не имеет хэштегов):

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
}

Возвращает true в этом случае.

Основываясь на комментарии @jon-skeet.

Ответ 17

Это простой способ проверить это для URL текущей страницы:

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

Ответ 18

иногда вы получаете полную строку запроса, такую ​​как "#anchorlink? firstname = mark"

это мой script, чтобы получить значение хеша:

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

returns -> #anchorlink