Script à attendre que la page se charge avant l'exécution de code des techniques?
Je suis en train d'écrire un script utilisateur Greasemonkey, et que vous voulez le code à exécuter lorsque la page est complètement chargé, puisqu'il revient à une div compter que je veux être affiché.
Le problème, c'est que cette page prend parfois un peu tout avant de charges.
J'ai essayé, document $(function() { });
et $(window).load(function(){ });
wrappers. Cependant, aucun ne semble fonctionner pour moi, même si j'ai peut-être l'application du tort.
Mieux que je puisse faire est d'utiliser un setTimeout(function() { }, 600);
qui fonctionne, bien qu'il n'est pas toujours fiable.
Quelle est la meilleure technique à utiliser dans Greasemonkey pour s'assurer que le code s'exécute lors de chargement de la page terminé?
- Vous pouvez utiliser
(function init(){var counter = document.getElementById('id-of-element');if (counter) { /* do something with counter element */ } else { setTimeout(init, 0);}})();
à la permanence sondage pour l'existence de l'élément. C'est plus générique de la solution. - Greasemonkey cousins, Tampermonkey et Scriptish, le soutien de plusieurs
@run-at
les valeurs incluentdocument-idle
etcontext-menu
que l'on peut utiliser. Il apparaît également que Greasemonkey est ajouter pourdocument-idle
même si elle n'a pas été documenté à ce jour. - ce qui a fonctionné pour moi, merci.
Vous devez vous connecter pour publier un commentaire.
Greasemonkey (en général) n'ont pas de jQuery. Donc, l'approche la plus répandue consiste à utiliser
à l'intérieur de votre script
@require http://ajax.googleapis.com/ajax/libs/jquery/1.6.2/jquery.min.js
à votre script. J'ai mis dans le modèle de script trop parce que j'utilise toujours. Aussi mettrethis.$ = this.jQuery = jQuery.noConflict(true);
pour éviter typique des conflits.C'est un problème commun et, comme vous l'avez dit, en attente pour le chargement de la page n'est pas assez -- depuis l'AJAX peut changer les choses de temps après.
Il y a une norme(ish) utilitaire robuste pour ces situations. C'est le
waitForKeyElements()
utilitaire.L'utiliser comme ceci:
Donner les détails exacts de votre page cible pour un exemple plus spécifique.
@grant GM_addStyle
comme indiqué. Qu'est ce que ça existe.De Greasemonkey 3.6 (novembre 20, 2015) les métadonnées clés
@run-at
prend en charge la nouvelle valeurdocument-idle
.Suffit de mettre ceci dans le bloc de métadonnées de votre script Greasemonkey:
La la documentation le décrit comme suit:
waitForKeyElements
ouMutationObserver
.habillage de mes scripts
$(window).load(function(){ })
n'a jamais manqué pour moi.peut-être que votre page est terminée, mais il y a encore quelques ajax contenu chargé.
si c'est le cas, ce beau morceau de code à partir de Brock Adams peut vous aider à:
https://gist.github.com/raw/2625891/waitForKeyElements.js
j'ai l'habitude de l'utiliser pour surveiller les éléments qui s'affiche sur publication.
l'utiliser comme ceci:
waitForKeyElements("elementtowaitfor", functiontocall)
Si vous voulez manipuler les nœuds comme obtenir la valeur de nœuds ou de changer de style, vous pouvez attendre de ces nœuds à l'aide de cette fonction
ensuite utiliser
promise.then
ou de l'utilisation
async&await
Voici un exemple icourse163_enhance
Brock répondre est bon, mais j'aimerais proposer une autre solution à l'AJAX problème, par souci d'exhaustivité. Depuis son script utilise également
setInterval()
de vérifier périodiquement (300ms), il ne peut pas répondre instantanément.Si vous avez besoin de répondre immédiatement, vous pouvez utiliser
MutationObserver()
pour écouter les DOM changements et d'y répondre dès que l'élément est crééBien que depuis
check()
feux sur chaque DOM changement, cela peut être lent si le DOM change très souvent ou votre état prend beaucoup de temps à évaluer.Autre exemple d'utilisation: si vous n'êtes pas à la recherche d'un élément précis, mais juste en attente pour la page de cesser de les changer. Vous pouvez combiner cela avec
setTimeout()
attendre que trop.Cette méthode est tellement polyvalent, vous pouvez écouter l'attribut et le texte aussi bien. Juste mettre
attributes
etcharacterData
àtrue
dans les optionsPour détecter si le XHR la fin du chargement de la page web, puis il déclenche une fonction.
Je reçois ce de Comment puis-je utiliser le JavaScript pour le magasin "XHR fini de charger" des messages dans la console de Chrome? et il de véritables œuvres.
Mais si il n'y êtes nombreux XHRs dans la page, je n'ai aucune idée de comment le filtre défini un XHR.
Une autre méthode est waitForKeyElements() ce qui est agréable.
https://gist.github.com/BrockA/2625891
Il y a de l'échantillon pour Greasemonkey utilisation.
Exécutez le script Greasemonkey sur la même page, plusieurs fois?