Saya mencoba menambahkan kanvas di atas kanvas lain - bagaimana saya bisa membuat fungsi ini menunggu untuk memulai sampai kanvas pertama dibuat?
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
sumber
sumber
Jawaban:
Jika Anda memiliki akses ke kode yang menciptakan kanvas - cukup panggil fungsi di sana setelah kanvas dibuat.
Jika Anda tidak memiliki akses ke kode itu (mis. Jika kode pihak ke-3 seperti google maps) maka yang dapat Anda lakukan adalah menguji keberadaannya dalam interval:
Tetapi perhatikan - berkali-kali kode pihak ke-3 memiliki opsi untuk mengaktifkan kode Anda (dengan panggilan balik atau pemicu acara) ketika selesai memuat. Itu mungkin di mana Anda dapat menempatkan fungsi Anda. Solusi interval benar-benar solusi yang buruk dan harus digunakan hanya jika tidak ada yang berfungsi.
sumber
Bergantung pada browser mana yang Anda butuhkan untuk mendukung, ada opsi MutationObserver .
EDIT: Semua browser utama mendukung MutationObserver sekarang .
Sesuatu di sepanjang garis ini harus melakukan trik:
NB Saya belum menguji kode ini sendiri, tapi itu ide umum.
Anda dapat dengan mudah memperluas ini hanya untuk mencari bagian DOM yang berubah. Untuk itu, gunakan
mutations
argumen, ini adalah arrayMutationRecord
objek.sumber
Ini hanya akan berfungsi dengan peramban modern tetapi saya merasa lebih mudah untuk hanya menggunakan
then
jadi silakan uji dulu tetapi:Kode
Atau menggunakan fungsi generator
Pemakaian
sumber
while (document.querySelector(selector) === null) {await rafAsync()}
Pendekatan yang lebih modern untuk menunggu elemen:
Perhatikan bahwa kode ini harus dibungkus dengan fungsi async .
sumber
r
disanasetTimeout
?Ini sedikit perbaikan dari jawaban Jamie Hutber
sumber
Lebih baik untuk menyampaikan
requestAnimationFrame
daripada dalamsetTimeout
. ini adalah solusi saya dalam modul ES6 dan menggunakanPromises
.es6, modul dan janji:
plain js and promises
:sumber
Uncaught TypeError: Cannot read property 'then' of undefined
Berikut adalah solusi menggunakan yang bisa diamati.
Sekarang kamu bisa menulis
sumber
Anda dapat memeriksa apakah dom sudah ada dengan mengatur batas waktu hingga dom diberikan di dalam dom.
sumber
Jika Anda menginginkan solusi umum menggunakan MutationObserver, Anda dapat menggunakan fungsi ini
Sumber: https://gist.github.com/jwilson8767/db379026efcbd932f64382db4b02853e
Contoh cara menggunakannya
Catatan: MutationObserver memiliki dukungan browser yang hebat; https://caniuse.com/#feat=mutationobserver
Dan lagi! :)
sumber
Variasi lain dari Iftah
Kalau-kalau elemen tidak pernah ditampilkan, jadi kami tidak memeriksa tanpa batas.
sumber