Как с помощью JavaScript проверить наличие хэша в URL-адресе?

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

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

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

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

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


person Philip Morton    schedule 18.11.2008    source источник


Ответы (18)


Простой:

if(window.location.hash) {
  // Fragment exists
} else {
  // Fragment doesn't exist
}
person Gareth    schedule 18.11.2008
comment
Дополнительно: объект .location доступен только в URL-адресе текущего окна, вы не можете сделать это для произвольного URL-адреса (например, который хранится в строковой переменной) - person Gareth; 18.11.2008
comment
Кроме того, свойства местоположения, такие как .hash и .query, также доступны в элементах ‹a›. - person Gareth; 30.07.2010
comment
.search доступен на <a>, а не на .query. Пример jQuery: $("<a/>").attr({ "href": "http://www.somewhere.com/a/b/c.html?qs=1#fragmenttest" })[0]. .hash => "#fragmenttest" и .search = ?qs=1. Оттуда нажмите вопрос об извлечении строки запроса, чтобы получить что-то, кроме строки . - person patridge; 29.07.2011
comment
@hitautodestruct: этот вопрос не об изменениях хеша, а только о том, присутствует он при загрузке страницы или нет. - person Gareth; 18.05.2013
comment
@ Гарет Да, ты прав. Просто понял, что ссылка, которую я опубликовал, была для события hashchange, а не window.location.hash. Хотя последнее не поддерживается IE ‹8. - person hitautodestruct; 19.05.2013
comment
@Gareth, а что, если <a> ссылается на недопустимый URL со странным синтаксисом? - person Pacerier; 11.10.2014
comment
У меня это не сработало для URL-адресов, у которых есть #anchor после дополнительного / (например, example.com/page/#anchor). Вот как Wordpress обрабатывает хеши. Вместо этого я использовал одно из других решений на этой странице, которое сработало: location.href.indexOf("#") != -1. У меня не было возможности тщательно протестировать это, но я предполагаю, что лишнее / перед #anchor, поэтому решение, использующее window.location.hash, не сработало для меня. Я пробовал это только с помощью Chrome 47. - person Mark Rummel; 12.01.2016
comment
Один из способов его использования - проверить, находится ли пользователь в корне домена. if(window.location.hash) { // Fragment exists } else { // Fragment doesn't exist console.log('Welcome to ROOT'); } - person lowtechsun; 28.05.2016
comment
Если вы проверяете, что хеш равен значению, обязательно используйте что-то вроде if(window.location.hash == '#hashnamehere'). Я совершил ошибку, проверив его без физического хеша #. - person Liam McArthur; 10.03.2017
comment
Есть ли здесь риск внедрения кода? Или автоматически обрабатывает javascript, избегая всего в хэше - person Albert Renshaw; 26.03.2019

Ставим следующее:

<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>
person José Leal    schedule 18.11.2008
comment
Спасибо, window.location.hash имеет значение, только если после # стоит значение. Например. //www.example.com# возвращает '' при проверке хеша. - person Jessy; 16.02.2017

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

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

if (hash) {
    alert(hash)
} else {
    // do something else
}
person Marc Diethelm    schedule 08.03.2012
comment
+1 за Javascript, не зная, что выходит за границы :) - person Dunc; 20.08.2014
comment
@Dunc: Ну, массивы JS - это в основном объекты. Доступ к ним по индексу похож на доступ к свойству Object, например: obj['0']. В JS это верно: arr[0] === arr['0'] Следовательно, если индекс / ключ не существует, возвращаемое значение не определено, а не выходит за границы. jsfiddle.net/web5me/Mw376 - person Marc Diethelm; 30.10.2014

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

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

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

person Jon Skeet    schedule 18.11.2008

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

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

person Oral ÜNAL    schedule 31.08.2011
comment
Понравился этот ответ, потому что смешивание JS + JQ, кроссбраузерность и простое решение уже реализовали этот подход. - person Arthur Kushman; 07.08.2016

window.location.hash 

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

person user2327502    schedule 27.04.2013
comment
Коротко и чисто, идеально - person Jam; 06.12.2017

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

$('a[href^="#"]')
person BaronVonKaneHoffen    schedule 19.04.2012

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

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);
}
person Emmanuel    schedule 05.07.2010
comment
это необходимо только в 6 + 7. Все остальные браузеры включили событие onhashchange. - person Tokimon; 25.03.2011
comment
@Tokimon - отлично! Я этого не знал. Но я думаю, нам все еще нужно поддерживать эти старые версии IE. - person Emmanuel; 26.03.2011
comment
Да, к сожалению ... Даже IE 8 не скоро исчезнет, ​​так как IE 9 не поддерживается в XP :( - person Tokimon; 06.04.2011
comment
modernizr.com реализует событие hashchange в старых браузерах (наряду с множеством других современных функций). - person guigouz; 27.11.2011
comment
Это совсем не рекомендуемый код: он должен быть как минимум: setTimeout(checkHash, 400). Кроме того, в современных браузерах есть событие hashchange, поэтому вы можете сделать window.addEventListener('hashchange', function(){ … }). Наконец, утечка глобальной переменной hash - еще одна нерекомендуемая практика, даже для примера. - person Oncle Tom; 11.12.2013

Большинство людей знают о свойствах URL в document.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
   }
});
person Nicholas Davison    schedule 05.09.2013

Вышеупомянутые комментарии Партриджа и Гарета великолепны. Они заслуживают отдельного ответа. Судя по всему, свойства хеширования и поиска доступны для любого объекта 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>

Or

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

(но, может быть, немного переборщили ..)

person commonpike    schedule 20.02.2012

Вбрасываем это здесь как метод абстрагирования свойств местоположения от произвольных строк, подобных 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: Location.js

person Barney    schedule 10.09.2013

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

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

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

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

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

Это простой якорный маршрутизатор.

person Rolando    schedule 20.06.2012

Вот простая функция, которая возвращает 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.

person dnns    schedule 29.11.2015

Вы можете анализировать URL-адреса, используя современный JS:

var my_url = new URL('http://www.google.sk/foo?boo=123#baz');

my_url.hash; // outputs "#baz"
my_url.pathname; // outputs "/moo"
​my_url.protocol; // "http:"
​my_url.search; // outputs "?doo=123"

URL-адреса без хеша вернут пустую строку.

person Fusion    schedule 13.10.2020

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

  function checkHash(){
      return (location.hash ? true : false);
  }
person aabiro    schedule 18.07.2018

Я заметил, что все эти ответы в основном проверяют window.location.hash и затрудняют написание тестов.

 const hasHash = string => string.includes('#')

Вы также можете удалить хеш из URL-адреса следующим образом:

const removeHash = string => {
 const [url] = string.split('#')
 return url
}

И, наконец, вы можете объединить логику вместе:

if(hasHash(url)) {
 url = removeHash(url)
}
person Uzair Ashraf    schedule 15.04.2021

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

это мой скрипт для получения хеш-значения:

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

returns -> #anchorlink
person markg    schedule 27.10.2014
comment
Невозможно, поскольку хеш добавляется после строки запроса и никогда не отправляется на сервер. Единственный раз, когда хеш появляется перед строкой запроса, - это когда вы вручную изменяли URL-адрес. - person ; 06.12.2014
comment
да, но иногда люди отправляют URL-адреса в этом формате. это просто для того, чтобы вы могли получить только хеш-значение и пренебречь остальными. :) - person markg; 27.07.2015

person    schedule
comment
Разве это не должно быть hash.length в отличие от hash.length ()? :) - person Nathan Pitman; 19.12.2013