Faire fonctionner pushstate avec href et javascript
-
21-12-2019 - |
Question
J'utilise javascript pushstate pour modifier l'URL de la page actuelle, lorsqu'un lien sur lequel j'ai cliqué :
<a href="/some-page/" onclick="url_go('/some-page/'); return false;">
Je souhaite autoriser le clic droit sur le lien et l'ouverture dans une nouvelle fenêtre - ainsi que CTRL + clic devraient s'ouvrir dans un nouveau robinet.Mais ce n’est pas le cas.
Comment puis-je faire fonctionner à la fois le clic normal (pushstate) et CTRL+clic (nouveau tapotement) ?
(Facebook le fait, mais je ne vois pas comment).
La solution
Je suppose que vous voulez votre propre gestionnaire d'événements pour Click, mais laissez le comportement par défaut pour Ctrl+Click ou Scroll Button Click.Je n'ai pas trouvé exactement où Facebook le fait (il gère toujours les clics et les ctrl+clics de la même manière), mais cela peut être réalisé par code.
Vous devriez supprimer le onclick
attribut de l'élément HTML et déplacez-le vers javascript.Vérifiez ensuite le event
paramètre pour le ctrlKey
propriété.Vous pouvez le faire en utilisant le code comme if (e.which > 1 || e.ctrlKey)
ou utilisez une fonction plus complexe d'un site Web similaire à Facebook :
function shouldUseDefault(e) {
return ((e = (e || window.event)) && (e.type == 'click' || e.type == 'mousedown' || e.type == 'mouseup') && (e.which > 1 || e.button > 1 || e.ctrlKey || e.shiftKey || browser.mac && e.metaKey)) || false;
}
Ensuite, utilisez-le en javascript simple :
<a id="some-link-id" href="http://google.com">Test link</a>
<script type="text/javascript">
window.addEventListener("load", function() {
var link = document.getElementById("some-link-id");
link.addEventListener("click", function(clickEvent) {
if (shouldUseDefault(clickEvent) === false) {
url_go(link.href);
clickEvent.preventDefault();
}
});
});
</script>
Ou dans jQuery si vous souhaitez prendre en charge les anciens navigateurs comme Internet Explorer 8 :
$(function() {
$("#some-link-id").on("click", function(clickEvent) {
if (shouldUseDefault(clickEvent) === false) {
url_go(clickEvent.currentTarget.href);
clickEvent.preventDefault();
}
});
});