Ich versuche, eine Zeichenfläche über einer anderen Zeichenfläche hinzuzufügen. Wie kann ich diese Funktion warten lassen, bis die erste Zeichenfläche erstellt wird?
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
quelle
quelle
Antworten:
Wenn Sie Zugriff auf den Code haben, mit dem die Zeichenfläche erstellt wird, rufen Sie die Funktion einfach direkt nach der Erstellung der Zeichenfläche auf.
Wenn Sie keinen Zugriff auf diesen Code haben (z. B. wenn es sich um einen Code eines Drittanbieters wie Google Maps handelt), können Sie die Existenz in einem Intervall testen:
Beachten Sie jedoch, dass Code von Drittanbietern häufig die Option bietet, Ihren Code (durch Rückruf oder Ereignisauslösung) zu aktivieren, wenn das Laden abgeschlossen ist. Hier können Sie Ihre Funktion platzieren. Die Intervalllösung ist wirklich eine schlechte Lösung und sollte nur verwendet werden, wenn nichts anderes funktioniert.
quelle
Je nachdem, welchen Browser Sie unterstützen müssen, gibt es die Option MutationObserver .
BEARBEITEN: Alle gängigen Browser unterstützen jetzt MutationObserver .
Etwas in dieser Richtung sollte den Trick tun:
NB Ich habe diesen Code nicht selbst getestet, aber das ist die allgemeine Idee.
Sie können dies problemlos erweitern, um nur den Teil des DOM zu durchsuchen, der sich geändert hat. Verwenden Sie dazu das
mutations
Argument, es ist ein Array vonMutationRecord
Objekten.quelle
Dies funktioniert nur mit modernen Browsern, aber ich finde es einfacher, nur einen zu verwenden.
then
Bitte testen Sie zuerst, aber:Code
Oder mit Generatorfunktionen
Verwendung
quelle
while (document.querySelector(selector) === null) {await rafAsync()}
Ein moderner Ansatz zum Warten auf Elemente:
Beachten Sie, dass dieser Code in eine asynchrone Funktion eingeschlossen werden muss .
quelle
r
dasetTimeout
?Hier ist eine kleine Verbesserung gegenüber Jamie Hutbers Antwort
quelle
Ist besser weiterzuleiten
requestAnimationFrame
als in asetTimeout
. Dies ist meine Lösung in es6-Modulen und mitPromises
.es6, Module und Versprechen:
plain js and promises
::quelle
Uncaught TypeError: Cannot read property 'then' of undefined
Hier ist eine Lösung mit Observablen.
Jetzt kannst du schreiben
quelle
Sie können überprüfen, ob der Dom bereits vorhanden ist, indem Sie ein Timeout festlegen, bis er bereits im Dom gerendert ist.
quelle
Eine weitere Variante von Iftah
Nur für den Fall, dass das Element nie angezeigt wird, überprüfen wir es nicht unendlich.
quelle
Wenn Sie eine generische Lösung mit MutationObserver wünschen, können Sie diese Funktion verwenden
Quelle: https://gist.github.com/jwilson8767/db379026efcbd932f64382db4b02853e
Beispiel für die Verwendung
Hinweis: MutationObserver bietet eine hervorragende Browserunterstützung. https://caniuse.com/#feat=mutationobserver
Et voilà! :) :)
quelle