admin管理员组文章数量:1125933
I have some jQuery/JavaScript code that I want to run only when there is a hash (#
) anchor link in a URL. How can you check for this character using JavaScript? I need a simple catch-all test that would detect URLs like these:
example/page.html#anchor
example/page.html#anotheranchor
Basically something along the lines of:
if (thereIsAHashInTheUrl) {
do this;
} else {
do this;
}
I have some jQuery/JavaScript code that I want to run only when there is a hash (#
) anchor link in a URL. How can you check for this character using JavaScript? I need a simple catch-all test that would detect URLs like these:
example.com/page.html#anchor
example.com/page.html#anotheranchor
Basically something along the lines of:
if (thereIsAHashInTheUrl) {
do this;
} else {
do this;
}
Share
Improve this question
edited Jun 22, 2022 at 23:32
Stephen Ostermiller♦
25.5k16 gold badges94 silver badges115 bronze badges
asked Nov 18, 2008 at 11:35
Philip MortonPhilip Morton
132k38 gold badges90 silver badges97 bronze badges
0
21 Answers
Reset to default 1650Simple use of location hash:
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
}
Put the following:
<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>
If the URI is not the document's location this snippet will do what you want.
var url = 'example.com/page.html#anchor',
hash = url.split('#')[1];
if (hash) {
alert(hash)
} else {
// do something else
}
Have you tried this?
if (url.indexOf('#') !== -1) {
// Url contains a #
}
(Where url
is the URL you want to check, obviously.)
$('#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!
});
This will solve the problem ;)
window.location.hash
will return the hash identifier
...or there's a jquery selector:
$('a[href^="#"]')
You can parse urls using modern 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"
urls with no hash will return empty string.
Here's what you can do to periodically check for a change of hash, and then call a function to process the hash value.
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);
}
var requestedHash = ((window.location.hash.substring(1).split("#",1))+"?").split("?",1);
Most people are aware of the URL properties in document.location. That's great if you're only interested in the current page. But the question was about being able to parse anchors on a page not the page itself.
What most people seem to miss is that those same URL properties are also available to anchor elements:
// 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 and Gareths comments above are great. They deserve a separate answer. Apparently, hash and search properties are available on any html Link object:
<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>
Should you need this on a regular string variable and happen to have jQuery around, this should work:
var mylink = "foo.html?bar#quz";
if ($('<a href="'+mylink+'">').get(0).search=='bar')) {
// do stuff
}
(but its maybe a bit overdone .. )
Throwing this in here as a method for abstracting location properties from arbitrary URI-like strings. Although window.location instanceof Location
is true, any attempt to invoke Location
will tell you that it's an illegal constructor. You can still get to things like hash
, query
, protocol
etc by setting your string as the href
property of a DOM anchor element, which will then share all the address properties with window.location
.
Simplest way of doing this is:
var a = document.createElement('a');
a.href = string;
string.hash;
For convenience, I wrote a little library that utilises this to replace the native Location
constructor with one that will take strings and produce window.location
-like objects: Location.js
I noticed that all of these answers mostly check window.location.hash and make it difficult to write tests.
const hasHash = string => string.includes('#')
You can also remove the hash from a url like so:
const removeHash = string => {
const [url] = string.split('#')
return url
}
And finally you can combine the logic together:
if(hasHash(url)) {
url = removeHash(url)
}
Usually clicks go first than location changes, so after a click is a good idea to setTimeOut to get updated window.location.hash
$(".nav").click(function(){
setTimeout(function(){
updatedHash = location.hash
},100);
});
or you can listen location with:
window.onhashchange = function(evt){
updatedHash = "#" + evt.newURL.split("#")[1]
};
I wrote a jQuery plugin that does something like what you want to do.
It's a simple anchor router.
Here is a simple function that returns true
or false
(has / doesn't have a hashtag):
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
}
Returns true
in this case.
Based on @jon-skeet's comment.
This is a simple way to test this for the current page URL:
function checkHash(){
return (location.hash ? true : false);
}
Modern way, we can now safely in 2024 use the browser built-in URL api, who provides many tools for URL parsing.
Inspect the URL Object:
console.log( new URL(location) )
Get the URL hash:
new URL(location).hash
https://caniuse.com/url
sometimes you get the full query string such as "#anchorlink?firstname=mark"
this is my script to get the hash value:
var hashId = window.location.hash;
hashId = hashId.match(/#[^?&\/]*/g);
returns -> #anchorlink
本文标签: jqueryHow can you check for a hash in a URL using JavaScriptStack Overflow
版权声明:本文标题:jquery - How can you check for a #hash in a URL using JavaScript? - Stack Overflow 内容由网友自发贡献,该文观点仅代表作者本人, 转载请联系作者并注明出处:http://www.betaflare.com/web/1736669925a1946865.html, 本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容,一经查实,本站将立刻删除。
发表评论