Wie kann man in einer URL für eine #hash überprüfen mit Hilfe von JavaScript?
-
08-07-2019 - |
Frage
Ich habe einige jQuery / JavaScript-Code, der ich nur ausgeführt werden soll, wenn es einen Hash (#
) Anker-Link in einer URL ist. Wie kann man für diesen Charakter überprüft mit Hilfe von JavaScript? Ich brauche einen einfachen Catch-all-Test, den URLs wie diese erkennen würde:
-
example.com/page.html#anchor
-
example.com/page.html#anotheranchor
Im Grunde etwas entlang der Linien von:
if (thereIsAHashInTheUrl) {
do this;
} else {
do this;
}
Wenn jemand mich in die richtige Richtung zeigen könnte, wäre, dass sehr geschätzt.
Lösung
Ganz einfach:
if(window.location.hash) {
// Fragment exists
} else {
// Fragment doesn't exist
}
Andere Tipps
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
}
Setzen Sie wie folgt vor:
<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>
Wenn die URI nicht die Position des Dokuments ist das Snippet wird tun, was Sie wollen.
var url = 'example.com/page.html#anchor',
hash = url.split('#')[1];
if (hash) {
alert(hash)
} else {
// do something else
}
Haben Sie versucht das?
if (url.indexOf("#") != -1)
{
}
(Wo url
ist die URL, die Sie überprüfen möchten, natürlich.)
$('#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!
});
Das wird das Problem lösen;)
window.location.hash
wird die Hash-Kennung zurückgeben
... oder gibt es einen jQuery-Selektor:
$('a[href^="#"]')
Hier ist, was Sie tun können, um für eine Änderung der Hash in regelmäßigen Abständen zu überprüfen und dann eine Funktion aufrufen den Hash-Wert zu verarbeiten.
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);
}
Die meisten Leute sind die URL-Eigenschaften in document.location bewusst. Das ist toll, wenn Sie daran interessiert sind nur in der aktuellen Seite sind. Aber die Frage war über die Möglichkeit, Anker auf einer Seite nicht die Seite selbst zu analysieren.
Was die meisten Menschen zu vermissen scheinen, ist, dass die gleiche URL Eigenschaften sind auch Elemente zu verankern:
// 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;
}
}
Rebhuhn und HOPI Kommentare sind vor groß. Sie verdienen eine gesonderte Antwort. Offenbar Hash und Suche Eigenschaften sind auf jedem HTML-Link-Objekt zur Verfügung:
<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>
oder
<a href="bar.html?foo" onclick="alert(this.search)">SAY FOO</a>
Sollten Sie müssen diese auf einer regulären String-Variable und passieren jQuery um sich zu haben, dies sollte funktionieren:
var mylink = "foo.html?bar#quz";
if ($('<a href="'+mylink+'">').get(0).search=='bar')) {
// do stuff
}
(aber es ist vielleicht ein bisschen übertrieben ..)
var requestedHash = ((window.location.hash.substring(1).split("#",1))+"?").split("?",1);
diese als Methode hier Werfen zum Abstrahieren Lage Eigenschaften von beliebigen URI-like-Strings. Obwohl window.location instanceof Location
wahr ist, wird jeder Versuch, rufen Location
wird Ihnen sagen, dass es ein illegales Konstruktor ist. Sie können immer noch um Dinge wie hash
bekommen, query
, protocol
usw. von Ihrem String als href
Eigenschaft eines DOM Ankerelement einstellen, die dann alle Adresseigenschaften mit window.location
teilen werden.
einfachste Weg, dies zu tun, ist:
var a = document.createElement('a');
a.href = string;
string.hash;
Der Einfachheit halber, schrieb ich eine kleine Bibliothek, die diese den nativen Location
Konstruktor zu ersetzen verwendet, die Saiten nehmen und window.location
ähnliche Objekte erzeugen: Location.js
In der Regel geht klickt zunächst als Standort ändert, so nach einem Klick ist eine gute Idee, SetTimeout erhalten aktualisiert window.location.hash
$(".nav").click(function(){
setTimeout(function(){
updatedHash = location.hash
},100);
});
oder Sie können mit dem Standort hören:
window.onhashchange = function(evt){
updatedHash = "#" + evt.newURL.split("#")[1]
};
ich eine jQuery-Plugin , das tut so etwas wie was Sie tun möchten.
Es ist ein einfacher Anker-Router.
Hier ist eine einfache Funktion, die true
oder false
zurückgibt (hat / keinen hashtag hat):
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 diesem Fall.
Basierend auf @ jon-Skeet Kommentar.
Dies ist eine einfache Möglichkeit, dies für die aktuelle Seite URL zu testen:
function checkHash(){
return (location.hash ? true : false);
}
Sie manchmal die vollständige Abfrage-String bekommen wie "#anchorlink? Vorname = Zeichen"
Das ist mein Skript den Hash-Wert zu erhalten:
var hashId = window.location.hash;
hashId = hashId.match(/#[^?&\/]*/g);
returns -> #anchorlink