Возникают некоторые проблемы при сортировке правильного подхода к обработке события загрузки в Chrome при загрузке HTML-объектов.
Я использую HTML-объекты для загрузки виджетов в веб-панель мониторинга, и событие загрузки в Chrome выглядит прерывистым, поскольку я получаю повторное срабатывание события загрузки, но только если я задаю стиль для объекта в загрузке Событие на позицию: абсолют. К сожалению, для моего приложения это критическая функция, так как мне нужно разместить виджет в определенных местах экрана, используя JavaScript.
Скрипка ниже приведет Chrome к бесконечному циклу, в то время как в других браузерах он запускается только один раз (хотя в моем приложении Chrome запускает событие загрузки дважды, а затем останавливается).
HTML
<div id="container"></div>
<br/><br/><br/><br/>
<div id="xx">Not Fired..."</div>
JavaScript:
var cnt = 0;
(function loadWidget() {
var widgetObj = document.createElement("object");
widgetObj.data = ("http://13.75.145.9/widgets/dial.html") // location of widget
var tt = document.getElementById("container");
tt.appendChild(widgetObj);
widgetObj.addEventListener("load", widgetLoaded, false);
})();
function widgetLoaded(e) {
cnt = cnt + 1;
document.getElementById("xx").innerText = "fired x" + cnt;
//any manipulation of style is OK, its only the position: absolute that causes re-firing
e.currentTarget.style = "cursor: move; text-decoration: overline";
e.currentTarget.style.setProperty("position", "relative");
// Uncomment out the line below in Chrome and the event will continuously fire, but only once in othe browsers
e.currentTarget.style = "position: absolute; left: 50px";
}
Бесконечный цикл
Я предполагаю, что это ошибка Chrome, и хотя я могу обойти ее, проверив, сколько раз объект был загружен и досрочно завершив событие загрузки, существует снижение производительности, поскольку похоже, что весь объект перезагружается каждый раз (повторный запуск глобального JavaScript в объекте) и при загрузке пары виджетов в качестве объектов браузер значительно замедляется, что влияет на работу конечного пользователя.
Неважно, что я пытаюсь, я не могу избежать повторных загрузок. Кто-нибудь еще видел эту ошибку и знает, как избежать перезагрузки?
В связанной заметке Chrome отобразит и отобразит объект, а затем переместит его в правильное положение, которое мерцает на экране, в то время как другие браузеры отобразят виджет в его окончательном месте (после запуска загрузочного JavaScript), который является хороший опыт, и я не могу найти способ остановить рендеринг Chrome дважды.
[Обновление от декабря '18] - обходной путь, описанный в ответах ниже, больше не работает с последней версией Chrome (71.0.3578.80), а Chrome выполняет двойную загрузку объектов HTML и двойную загрузку загруженных событий. См. Этот пост об ошибке Chromium для получения дополнительной информации: Ошибка Chrome с объектами HTML