J'essaie d'ajouter un canevas sur un autre canevas - comment puis-je faire attendre cette fonction pour démarrer jusqu'à ce que le premier canevas soit 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;
}
javascript
jquery
html
function
Steven
la source
la source
Réponses:
Si vous avez accès au code qui crée le canevas, appelez simplement la fonction juste après la création du canevas.
Si vous n'avez pas accès à ce code (par exemple, s'il s'agit d'un code tiers tel que Google Maps), vous pouvez tester l'existence dans un intervalle:
Mais notez que souvent, le code tiers a une option pour activer votre code (par rappel ou déclenchement d'événement) lorsqu'il a fini de se charger. C'est peut-être là que vous pouvez mettre votre fonction. La solution d'intervalle est vraiment une mauvaise solution et ne doit être utilisée que si rien d'autre ne fonctionne.
la source
Selon le navigateur que vous devez prendre en charge, il existe l'option de MutationObserver .
EDIT: Tous les principaux navigateurs prennent en charge MutationObserver maintenant .
Quelque chose de ce genre devrait faire l'affaire:
NB Je n'ai pas testé ce code moi-même, mais c'est l'idée générale.
Vous pouvez facilement étendre cela pour rechercher uniquement la partie du DOM qui a changé. Pour cela, utilisez l'
mutations
argument, c'est un tableau d'MutationRecord
objets.la source
Cela ne fonctionnera qu'avec les navigateurs modernes, mais je trouve qu'il est plus facile d'utiliser simplement un
then
alors testez d'abord mais:Code
Ou en utilisant les fonctions du générateur
Usage
la source
while (document.querySelector(selector) === null) {await rafAsync()}
Une approche plus moderne de l'attente des éléments:
Notez que ce code devrait être enveloppé dans une fonction asynchrone .
la source
r
il?setTimeout
?Voici une amélioration mineure par rapport à la réponse de Jamie Hutber
la source
Il vaut mieux relayer
requestAnimationFrame
que dans unsetTimeout
. c'est ma solution dans les modules es6 et en utilisantPromises
.es6, modules et promesses:
plain js and promises
:la source
Uncaught TypeError: Cannot read property 'then' of undefined
Voici une solution utilisant des observables.
Maintenant tu peux écrire
la source
Vous pouvez vérifier si le dom existe déjà en définissant un délai jusqu'à ce qu'il soit déjà rendu dans le dom.
la source
Si vous souhaitez une solution générique utilisant MutationObserver, vous pouvez utiliser cette fonction
Source: https://gist.github.com/jwilson8767/db379026efcbd932f64382db4b02853e
Exemple d'utilisation
Remarque: MutationObserver a un excellent support de navigateur; https://caniuse.com/#feat=mutationobserver
Et voilà ! :)
la source
Une autre variante d' Iftah
Juste au cas où l'élément ne serait jamais affiché, nous ne vérifions donc pas indéfiniment.
la source