Estoy tratando de agregar un lienzo sobre otro lienzo: ¿cómo puedo hacer que esta función espere para comenzar hasta que se cree el primer lienzo?
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
fuente
fuente
Respuestas:
Si tiene acceso al código que crea el lienzo, simplemente llame a la función allí mismo después de crear el lienzo.
Si no tiene acceso a ese código (p. Ej., Si se trata de un código de un tercero, como Google Maps), lo que puede hacer es comprobar la existencia en un intervalo:
Pero tenga en cuenta: muchas veces el código de terceros tiene una opción para activar su código (mediante devolución de llamada o activación de eventos) cuando termina de cargarse. Ahí es donde puedes poner tu función. La solución de intervalo es realmente una mala solución y debe usarse solo si nada más funciona.
fuente
Según el navegador que necesite admitir, existe la opción de MutationObserver .
EDITAR: Todos los principales navegadores admiten MutationObserver ahora .
Algo en este sentido debería hacer el truco:
Nota: no he probado este código yo mismo, pero esa es la idea general.
Puede extender esto fácilmente para buscar solo la parte del DOM que cambió. Para eso, use el
mutations
argumento, es una matriz deMutationRecord
objetos.fuente
Esto solo funcionará con los navegadores modernos, pero me resulta más fácil usar solo un,
then
así que prueba primero pero:Código
O usando funciones generadoras
Uso
fuente
while (document.querySelector(selector) === null) {await rafAsync()}
Un enfoque más moderno para esperar elementos:
Tenga en cuenta que este código debería incluirse en una función asíncrona .
fuente
r
haysetTimeout
?Aquí hay una pequeña mejora con respecto a la respuesta de Jamie Hutber
fuente
Es mejor retransmitir
requestAnimationFrame
que en asetTimeout
. Esta es mi solución en módulos es6 y utilizandoPromises
.es6, módulos y promesas:
plain js and promises
:fuente
Uncaught TypeError: Cannot read property 'then' of undefined
Aquí hay una solución usando observables.
Ahora puedes escribir
fuente
Puede verificar si el dom ya existe estableciendo un tiempo de espera hasta que ya se represente en el dom.
fuente
Si desea una solución genérica usando MutationObserver, puede usar esta función
Fuente: https://gist.github.com/jwilson8767/db379026efcbd932f64382db4b02853e
Ejemplo de cómo usarlo
Nota: MutationObserver tiene una gran compatibilidad con el navegador; https://caniuse.com/#feat=mutationobserver
Et voilà! :)
fuente
Otra variante de Iftah
En caso de que el elemento nunca se muestre, no lo comprobamos infinitamente.
fuente