Cela a été posté comme commentaire mais a ensuite été retiré , vous pouvez essayer d'attendre l'événement de chargement de la fenêtre:
$(window).on('load hashchange', function(){
$(':target').css('color', 'red');
});
Ceci pour moi a produit des résultats mitigés sur Ch rome, il a travaillé lors d'une actualisation de la page (F5) mais pas lors de la frappe entrer dans la barre d'adresse.
Je ne sais pas s'il y a un moyen de gérer cela correctement à la page charge à l'aide du sélecteur :target
mais vous pouvez toujours obtenir la valeur de hachage et de l'utiliser comme sélecteur:
$(window).on('load hashchange', function(){
var target = window.location.hash;
$(target).css('color', 'red');
});
MISE À JOUR
que je suis en train de faire des recherches sur la question ainsi que des tests et moi avons quelques idées à partager:
Tout d'abord, nous devons comprendre que lorsque vous appelez $(':target')
jQuery utilise en interne querySelectorAll(':target')
ce qui signifie qu'il est directement lié à la spécification CSS de la pseudo-classe, mais pourquoi ne fonctionne pas à l'intérieur document.ready()
?
Eh bien, je trouve que enveloppant le code à l'intérieur setTimeout(fn,0)
fait réellement le sélecteur disponible:
$(document).ready(function(){
setTimeout(function(){
$(':target').css('color', 'red'); //THIS WORKS
},0);
});
Vous pouvez lire this answer une explication sur la façon dont l'ajout d'un délai d'attente zéro ms fait réellement une différence, mais au fond, ce permet au navigateur de compléter d'autres tâches non-javascript (dans lesquelles nous trouverions la vraie pseudo-classe CSS disponible pour la requête). Je crois que Firefox gère ses processus internes d'une manière ou d'une autre et c'est pourquoi le code fonctionne là-bas sans avoir besoin d'un timeout.
Maintenant, j'ai aussi découvert que le moteur de sélecteur de grésillement interne de jQuery fournit une solution de repli pour les navigateurs qui ne prennent pas en charge CSS :target
pseudo-classe, que vous pouvez utiliser à l'intérieur document.ready()
sans problème:
$(document).ready(function(){
$(':target()').css('color', 'red');
});
Cela fonctionne parce qu'au lieu de compter sur la classe CSS, il est une implémentation javascript qui utilise la propriété de hachage sur l'objet window.location, il est interne défini comme suit:
"target": function(elem) {
var hash = window.location && window.location.hash;
return hash && hash.slice(1) === elem.id;
}
le seul que vous pensez devrait noter que cette fonction passera par tous les éléments de la page si elle n'est pas passé un sélecteur comme :target(div)
, donc je crois que l'utilisation de la solution de contournement que j'ai fournie plus tôt serait encore une meilleure option que cela.
Fait intéressant, 'window.location.hash' semble être disponible pendant document.ready(), même si: target ne correspond à rien à ce stade. Cela suffit pour une solution de contournement, mais ne répond pas à la question de savoir s'il s'agit d'un bug de navigateur. –
... et alors que '$ (": target ")' ne trouve rien pendant 'document.ready()', '$ (window.location.hash)' trouve l'élément approprié. Curieux et plus curieux ... –
@StephenBaillie J'ai mis à jour ma réponse avec quelques idées sur la question –