Я пытаюсь добавить холст поверх другого холста - как заставить эту функцию ждать запуска, пока не будет создан первый холст?
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
Стивен
источник
источник
Ответы:
Если у вас есть доступ к коду, который создает холст - просто вызовите функцию сразу после создания холста.
Если у вас нет доступа к этому коду (например, если это сторонний код, такой как Google Maps), то вы можете проверить его на наличие интервала:
Но обратите внимание - во многих случаях сторонний код имеет возможность активировать ваш код (путем обратного вызова или запуска события), когда он заканчивает загрузку. Это может быть, где вы можете поставить свою функцию. Интервальное решение - действительно плохое решение и должно использоваться, только если ничего не работает.
источник
В зависимости от того, какой браузер вам нужно поддерживать, есть опция MutationObserver .
РЕДАКТИРОВАТЬ: Все основные браузеры теперь поддерживают MutationObserver .
Что-то вроде этого должно сделать свое дело:
NB Я сам не тестировал этот код, но это общая идея.
Вы можете легко расширить это, чтобы искать только ту часть DOM, которая изменилась. Для этого используйте
mutations
аргумент, это массивMutationRecord
объектов.источник
Это будет работать только с современными браузерами, но я считаю, что проще использовать
then
так, пожалуйста, сначала протестируйте, но:Код
Или используя функции генератора
использование
источник
while (document.querySelector(selector) === null) {await rafAsync()}
Более современный подход к ожиданию элементов:
Обратите внимание, что этот код должен быть заключен в асинхронную функцию .
источник
r
там?setTimeout
?Вот небольшое улучшение по сравнению с ответом Джейми Хатбер
источник
Лучше передать в
requestAnimationFrame
чем вsetTimeout
. это мое решение в модулях es6 и использованииPromises
.es6, модули и обещания:
plain js and promises
:источник
Uncaught TypeError: Cannot read property 'then' of undefined
Вот решение с использованием наблюдаемых.
Теперь вы можете написать
источник
Вы можете проверить, существует ли dom, установив тайм-аут, пока он уже не будет отображен в dom.
источник
Если вы хотите универсальное решение с использованием MutationObserver, вы можете использовать эту функцию
Источник: https://gist.github.com/jwilson8767/db379026efcbd932f64382db4b02853e
Пример использования
Примечание: MutationObserver имеет отличную поддержку браузера; https://caniuse.com/#feat=mutationobserver
И вуаля ! :)
источник
Еще одна вариация ифта
На всякий случай элемент никогда не отображается, поэтому мы не проверяем бесконечно.
источник