La réponse de Brock c'est bien, mais j'aimerais proposer une autre solution au problème AJAX qui est plus moderne et plus élégante.
Puisque son script, comme la plupart des autres, utilise aussi setInterval()
pour vérifier périodiquement (300ms), il ne peut pas répondre instantanément et il y a toujours un délai. D'autres solutions utilisent les événements onload, qui se déclenchent souvent plus tôt que prévu sur les pages dynamiques.
Vous pouvez utiliser MutationObserver()
pour écouter les changements du DOM et y répondre dès que l'élément est créé
(new MutationObserver(check)).observe(document, {childList: true, subtree: true});
function check(changes, observer) {
if(document.querySelector('#mySelector')) {
observer.disconnect();
// code
}
}
Bien que depuis check()
se déclenche à chaque changement du DOM, ce qui peut être lent si le DOM change très souvent ou si votre condition prend beaucoup de temps à être évaluée, donc au lieu d'observer document
Dans le cas de l'utilisation d'un DOM, on essaie de limiter la portée en observant un sous-arbre DOM aussi petit que possible.
Cette méthode est très générale et peut être appliquée à de nombreuses situations. Pour répondre plusieurs fois, il suffit de ne pas déconnecter l'observateur lorsqu'il est déclenché.
Un autre cas d'utilisation est que si vous ne recherchez pas un élément spécifique, mais attendez simplement que la page cesse de changer, vous pouvez combiner cela avec une minuterie.
var observer = new MutationObserver(resetTimer);
var timer = setTimeout(action, 3000, observer); // wait for the page to stay still for 3 seconds
observer.observe(document, {childList: true, subtree: true});
// reset timer every time something changes
function resetTimer(changes, observer) {
clearTimeout(timer);
timer = setTimeout(action, 3000, observer);
}
function action(observer) {
observer.disconnect();
// code
}
Cette méthode est si polyvalente que vous pouvez également écouter les changements d'attributs et de texte. Il suffit de définir attributes
y characterData
a true
dans les options
observer.observe(document, {childList: true, attributes: true, characterData: true, subtree: true});