Estou tentando adicionar uma tela sobre outra tela - como posso fazer com que essa função aguarde até que a primeira tela seja criada?
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
fonte
fonte
Respostas:
Se você tiver acesso ao código que cria a tela - basta chamar a função logo após a criação da tela.
Se você não tem acesso a esse código (por exemplo, se é um código de terceiros, como o google maps), o que você pode fazer é testar a existência em um intervalo:
Mas observe: muitas vezes o código de terceiros tem uma opção para ativar seu código (por retorno de chamada ou acionamento de evento) quando ele terminar de carregar. Pode ser aí que você pode colocar sua função. A solução de intervalo é realmente uma solução ruim e deve ser usada apenas se nada mais funcionar.
fonte
Dependendo do navegador que você precisa oferecer suporte, existe a opção de MutationObserver .
EDIT: Todos os principais navegadores suportam o MutationObserver agora .
Algo nesse sentido deve fazer o truque:
NB: Eu não testei esse código, mas essa é a ideia geral.
Você pode estender isso facilmente para pesquisar apenas a parte do DOM que foi alterada. Para isso, use o
mutations
argumento, é uma matriz deMutationRecord
objetos.fonte
Isso funcionará apenas com navegadores modernos, mas acho mais fácil usar um
then
, por isso teste primeiro, mas:Código
Ou usando funções de gerador
Uso
fonte
while (document.querySelector(selector) === null) {await rafAsync()}
Uma abordagem mais moderna para aguardar elementos:
Observe que esse código precisaria ser agrupado em uma função assíncrona .
fonte
r
ai?setTimeout
?Aqui está uma pequena melhoria em relação à resposta de Jamie Hutber
fonte
É melhor retransmitir do
requestAnimationFrame
que em umsetTimeout
. esta é a minha solução nos módulos es6 e usandoPromises
.es6, módulos e promessas:
plain js and promises
:fonte
Uncaught TypeError: Cannot read property 'then' of undefined
Aqui está uma solução usando observáveis.
Agora você pode escrever
fonte
Você pode verificar se o dom já existe definindo um tempo limite até que ele já seja renderizado no dom.
fonte
Se você deseja uma solução genérica usando MutationObserver, pode usar esta função
Fonte: https://gist.github.com/jwilson8767/db379026efcbd932f64382db4b02853e
Exemplo de como usá-lo
Nota: MutationObserver tem um ótimo suporte ao navegador; https://caniuse.com/#feat=mutationobserver
Et voilà! :)
fonte
Outra variação de Iftah
Caso o elemento nunca seja mostrado, não verificamos infinitamente.
fonte