Ответ 1
Простой:
if(window.location.hash) {
// Fragment exists
} else {
// Fragment doesn't exist
}
У меня есть некоторый код jQuery/JavaScript, который я хочу запускать, только когда в URL есть ссылка на хэш (#
). Как вы можете проверить наличие этого символа с помощью JavaScript? Мне нужен простой всеобъемлющий тест, который бы обнаруживал URL-адреса, подобные этим:
example.com/page.html#anchor
example.com/page.html#anotheranchor
В основном что-то вроде:
if (thereIsAHashInTheUrl) {
do this;
} else {
do this;
}
Если бы кто-нибудь мог указать мне правильное направление, это было бы очень ценно.
Простой:
if(window.location.hash) {
// Fragment exists
} else {
// Fragment doesn't exist
}
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
}
Введите следующее:
<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>
Если URI не является местоположением документа, этот фрагмент будет делать то, что вы хотите.
var url = 'example.com/page.html#anchor',
hash = url.split('#')[1];
if (hash) {
alert(hash)
} else {
// do something else
}
Вы пробовали это?
if (url.indexOf("#") != -1)
{
}
(Где url
- это URL, который вы хотите проверить, очевидно.)
$('#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!
});
Это решит проблему;)
window.location.hash
вернет хэш-идентификатор
... или есть селектор jquery:
$('a[href^="#"]')
Здесь вы можете периодически проверять изменение хэша, а затем вызывать функцию для обработки хэш-значения.
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);
}
Большинство людей знают о свойствах 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
}
});
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;
}
}
Замечания 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
}
(но его, возможно, немного переборщило..)
var requestedHash = ((window.location.hash.substring(1).split("#",1))+"?").split("?",1);
Бросьте это здесь как метод абстрагирования свойств местоположения от произвольных строк, подобных 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
Обычно клики идут сначала, чем изменения местоположения, поэтому после щелчка это хорошая идея setTimeOut обновить window.location.hash
$(".nav").click(function(){
setTimeout(function(){
updatedHash = location.hash
},100);
});
или вы можете прослушать местоположение с помощью:
window.onhashchange = function(evt){
updatedHash = "#" + evt.newURL.split("#")[1]
};
Я написал плагин jQuery, который делает что-то вроде что вы хотите сделать.
Это простой якорный роутер.
Вот простая функция, которая возвращает 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.
Это простой способ проверить это для URL текущей страницы:
function checkHash(){
return (location.hash ? true : false);
}
иногда вы получаете полную строку запроса, такую как "#anchorlink? firstname = mark"
это мой script, чтобы получить значение хеша:
var hashId = window.location.hash;
hashId = hashId.match(/#[^?&\/]*/g);
returns -> #anchorlink