Faire fonction d'attendre jusqu'à ce que l'élément existe
J'essaye d'ajouter une toile sur une autre toile – comment puis-je faire de cette fonction d'attendre pour commencer jusqu'à ce que la première toile est créé?
function PaintObject(brush) {
this.started = false;
//get handle of the main canvas, as a DOM object, not as a jQuery Object. Context is unfortunately not yet
//available in jquery canvas wrapper object.
var mainCanvas = $("#" + brush).get(0);
//Check if everything is ok
if (!mainCanvas) {alert("canvas undefined, does not seem to be supported by your browser");}
if (!mainCanvas.getContext) {alert('Error: canvas.getContext() undefined !');}
//Get the context for drawing in the canvas
var mainContext = mainCanvas.getContext('2d');
if (!mainContext) {alert("could not get the context for the main canvas");}
this.getMainCanvas = function () {
return mainCanvas;
}
this.getMainContext = function () {
return mainContext;
}
//Prepare a second canvas on top of the previous one, kind of second "layer" that we will use
//in order to draw elastic objects like a line, a rectangle or an ellipse we adjust using the mouse
//and that follows mouse movements
var frontCanvas = document.createElement('canvas');
frontCanvas.id = 'canvasFront';
//Add the temporary canvas as a second child of the mainCanvas parent.
mainCanvas.parentNode.appendChild(frontCanvas);
if (!frontCanvas) {
alert("frontCanvas null");
}
if (!frontCanvas.getContext) {
alert('Error: no frontCanvas.getContext!');
}
var frontContext = frontCanvas.getContext('2d');
if (!frontContext) {
alert("no TempContext null");
}
this.getFrontCanvas = function () {
return frontCanvas;
}
this.getFrontContext = function () {
return frontContext;
}
- Lorsque vous créez la toile sur un clic, l'exécution de la fonction ou du déclenchement d'un événement qui s'exécute dans un gestionnaire qui exécute la fonction. il n'est pas intégré dans le cross-browser événement qui se produit lorsqu'un élément est disponible.
- double possible de Comment faire pour attendre jusqu'à ce qu'un élément existe?
Vous devez vous connecter pour publier un commentaire.
Si vous avez accès au code qui crée la toile, il suffit d'appeler la fonction à droite après que la toile est créé.
Si vous n'avez pas accès à ce code (par exemple. Si c'est une 3ème partie du code tel que google maps) alors ce que vous pourriez faire est de tester l'existence dans un intervalle:
Mais remarque - de nombreuses fois 3ème partie du code a une option pour activer votre code (par rappel ou d'un événement de déclenchement) quand il a fini de charger. Que peut-être où vous pouvez placer votre fonction. L'intervalle solution est vraiment une mauvaise solution et doit être utilisé uniquement si rien d'autre ne fonctionne.
Selon le navigateur que vous avez besoin de soutien, il y a l'option de MutationObserver.
Quelque chose le long des lignes de ce qui devrait faire l'affaire:
N. B. je n'ai pas testé ce code moi-même, mais c'est l'idée générale.
Vous pouvez facilement étendre cette mesure à rechercher seulement la partie du DOM qui a changé. Pour cela, utilisez le
mutations
argument, c'est un tableau deMutationRecord
objets.Cela ne fonctionne qu'avec les navigateurs modernes, mais je le trouve plus facile de simplement utiliser un
then
veuillez donc le test de la première, mais:Code
Ou en utilisant le générateur de fonctions
Utilisation
Une approche plus moderne d'attente pour les éléments:
Noter que ce code n'est besoin d'être enveloppé dans un fonction async.
Ici que d'une petite amélioration par rapport à Jamie Hutber la réponse de
Est mieux pour le relais dans
requestAnimationFrame
que dans unsetTimeout
. c'est ma solution dans l'es6 modules et à l'aide dePromises
.es6, des modules et des promesses:
plain js and promises
:Uncaught TypeError: Cannot read property 'then' of undefined
Vous pouvez vérifier si le dom existe déjà par la fixation d'un délai d'attente jusqu'à ce qu'il est déjà rendu dans les dom.