¿Cómo puedes verificar un #hash en una URL usando JavaScript?
-
08-07-2019 - |
Pregunta
Tengo un código jQuery / JavaScript que quiero ejecutar solo cuando hay un enlace de anclaje hash ( #
) en una URL. ¿Cómo puedes verificar este personaje usando JavaScript? Necesito una prueba general que detecte URL como estas:
example.com/page.html#anchor
example.com/page.html#anotheranchor
Básicamente algo en la línea de:
if (thereIsAHashInTheUrl) {
do this;
} else {
do this;
}
Si alguien pudiera señalarme en la dirección correcta, eso sería muy apreciado.
Solución
Simple:
if(window.location.hash) {
// Fragment exists
} else {
// Fragment doesn't exist
}
Otros consejos
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
}
Ponga lo siguiente:
<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>
Si el URI no es la ubicación del documento, este fragmento hará lo que desee.
var url = 'example.com/page.html#anchor',
hash = url.split('#')[1];
if (hash) {
alert(hash)
} else {
// do something else
}
¿Has probado esto?
if (url.indexOf("#") != -1)
{
}
(donde url
es la URL que desea verificar, obviamente.)
$('#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!
});
Esto resolverá el problema;)
window.location.hash
devolverá el identificador hash
... o hay un selector de jquery:
$('a[href^="#"]')
Esto es lo que puede hacer para verificar periódicamente un cambio de hash y luego llamar a una función para procesar el valor de hash.
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);
}
La mayoría de las personas conocen las propiedades de URL en document.location. Eso es genial si solo estás interesado en la página actual. Pero la pregunta era sobre poder analizar anclas en una página, no en la página en sí.
Lo que la mayoría de las personas parecen perderse es que esas mismas propiedades de URL también están disponibles para anclar elementos:
// 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;
}
}
Los comentarios de Perdiz y Gareth anteriores son geniales. Se merecen una respuesta por separado. Aparentemente, las propiedades de hash y búsqueda están disponibles en cualquier objeto de enlace html:
<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>
O
<a href="bar.html?foo" onclick="alert(this.search)">SAY FOO</a>
Si necesita esto en una variable de cadena normal y tiene jQuery, esto debería funcionar:
var mylink = "foo.html?bar#quz";
if ($('<a href="'+mylink+'">').get(0).search=='bar')) {
// do stuff
}
(pero quizás está un poco exagerado ...)
var requestedHash = ((window.location.hash.substring(1).split("#",1))+"?").split("?",1);
Lanzar esto aquí como un método para abstraer propiedades de ubicación de cadenas arbitrarias similares a URI. Aunque window.location instanceof Location
es verdadero, cualquier intento de invocar Location
le dirá que es un constructor ilegal. Todavía puede acceder a cosas como hash
, query
, protocol
etc. estableciendo su cadena como la propiedad href
de un elemento de anclaje DOM, que luego compartirá todas las propiedades de dirección con window.location
.
La forma más simple de hacer esto es:
var a = document.createElement('a');
a.href = string;
string.hash;
Por conveniencia, escribí una pequeña biblioteca que utiliza esto para reemplazar el constructor Location
nativo con uno que tomará cadenas y producirá objetos similares a window.location
: < a href = "https://gist.github.com/barneycarroll/5310151" rel = "nofollow"> Location.js
Por lo general, los clics van primero que los cambios de ubicación, así que después de un clic es una buena idea configurar TimeTout para actualizar window.location.hash
$(".nav").click(function(){
setTimeout(function(){
updatedHash = location.hash
},100);
});
o puede escuchar la ubicación con:
window.onhashchange = function(evt){
updatedHash = "#" + evt.newURL.split("#")[1]
};
Escribí un jQuery plugin que hace algo como lo que quieres hacer.
Es un enrutador de anclaje simple.
Aquí hay una función simple que devuelve true
o false
(tiene / no tiene un 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
}
Devuelve true
en este caso.
Basado en el comentario de @ jon-skeet.
Esta es una manera simple de probar esto para la URL de la página actual:
function checkHash(){
return (location.hash ? true : false);
}
a veces se obtiene la cadena de consulta completa como " #anchorlink? firstname = mark & ??quot;
este es mi script para obtener el valor hash:
var hashId = window.location.hash;
hashId = hashId.match(/#[^?&\/]*/g);
returns -> #anchorlink