Próbuję dodać płótno na innym kanwie - jak mogę sprawić, by ta funkcja czekała na uruchomienie, aż zostanie utworzona pierwsza kanwa?
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
źródło
źródło
Odpowiedzi:
Jeśli masz dostęp do kodu, który tworzy płótno - po prostu wywołaj funkcję zaraz po utworzeniu płótna.
Jeśli nie masz dostępu do tego kodu (np. Jeśli jest to kod strony trzeciej, taki jak mapy Google), możesz przetestować jego istnienie w określonym przedziale czasu:
Ale uwaga - wiele razy kod strony trzeciej ma opcję aktywacji kodu (przez wywołanie zwrotne lub wyzwalanie zdarzenia) po zakończeniu ładowania. To może być miejsce, w którym możesz umieścić swoją funkcję. Rozwiązanie interwałowe jest naprawdę złym rozwiązaniem i powinno być używane tylko wtedy, gdy nic innego nie działa.
źródło
W zależności od tego, którą przeglądarkę chcesz obsługiwać, istnieje opcja MutationObserver .
EDYCJA: Wszystkie główne przeglądarki obsługują teraz MutationObserver .
Coś w tym stylu powinno załatwić sprawę:
Uwaga: sam nie testowałem tego kodu, ale taki jest ogólny pomysł.
Możesz łatwo rozszerzyć to, aby przeszukać tylko część DOM, która uległa zmianie. W tym celu użyj
mutations
argumentu, jest to tablicaMutationRecord
obiektów.źródło
Działa to tylko z nowoczesnymi przeglądarkami, ale wydaje mi się, że łatwiej jest po prostu użyć,
then
więc najpierw przetestuj, ale:Kod
Lub za pomocą funkcji generatora
Stosowanie
źródło
while (document.querySelector(selector) === null) {await rafAsync()}
Bardziej nowoczesne podejście do oczekiwania na elementy:
Zauważ, że ten kod musiałby być opakowany w funkcję asynchroniczną .
źródło
r
tam jest ?setTimeout
?Oto niewielka poprawa w stosunku do odpowiedzi Jamiego Hutbera
źródło
Lepiej jest przekazywać
requestAnimationFrame
niż wsetTimeout
. to jest moje rozwiązanie w modułach es6 i przy użyciuPromises
.es6, moduły i obietnice:
plain js and promises
:źródło
Uncaught TypeError: Cannot read property 'then' of undefined
Oto rozwiązanie przy użyciu obserwabli.
Teraz możesz pisać
źródło
Możesz sprawdzić, czy dom już istnieje, ustawiając limit czasu, aż zostanie już wyrenderowany w domenie.
źródło
Jeśli chcesz uzyskać ogólne rozwiązanie wykorzystujące MutationObserver, możesz użyć tej funkcji
Źródło: https://gist.github.com/jwilson8767/db379026efcbd932f64382db4b02853e
Przykład użycia
Uwaga: MutationObserver ma świetną obsługę przeglądarki; https://caniuse.com/#feat=mutationobserver
Zrobione ! :)
źródło
Kolejna odmiana Iftah
Na wypadek, gdyby element nigdy się nie pojawił, więc nie sprawdzamy w nieskończoność.
źródło