Повесить событие load на ещё не отрендеренный элемент script в head?

Рассматривайте этот вопрос как чисто теоретический, пожалуйста. Если начать разбирать, зачем это мне понадобилось, или как можно обойтись иначе, мы уйдём далеко от интересующего меня момента в сторону уже удовлетворительно решённой задачи.

Итак. На HTML-странице внутри тега head имеются несколько тегов script. Когда выполняется подключенный через один из них код, можно получить ссылку на соответствующий элемент (ну, например, так, если в одну строчку:
var script = Array.prototype.slice.call(document.head.getElementsByTagName("script")).pop()
) и навесить на него обработчик события load (
script.addEventListener("onload", function(){...}, false)
), которое сработает после полного выполнения этого скрипта.

Вопрос: возможно ли путём какого-либо кода в данном скрипте обеспечить выполнение события load на последующих элементах script? Я имею в виду, на тех, которые рендерятся для тегов уже существующих на HTML-страницы (для динамически добавляемых-то всё тривиально).

Закавыка в том, что они ещё не отрендерены, то есть через DOM-модель до них ещё не добраться. Но, может быть, как-то возможно создать обработчик для момента, когда они окажутся отрендерены (но ещё не выполнены)? Надежда, что событие onload всплывает и может быть перехвачена на элементе head (который уже доступен), не оправдалась; не всплывает (по меньшей мере, в Firefox).

Да, атрибута onload у этих скриптов, разумеется, нет.

Интересует есть ли решение для Firefox или, на худой конец, хоть для какого-нибудь браузера.
  • Вопрос задан
  • 3950 просмотров
Пригласить эксперта
Ответы на вопрос 3
@1nd1go
Посмотрите как реализован .live в jQuery. Ну или используйте его.
Ответ написан
nur
@nur
я бы советовал смотреть в сторону requirejs
Ответ написан
pxx
@pxx
Приходит в голову такое решение:
console.log('Set interval');
var scriptOnLoadInterval = window.setInterval(attachOnLoads, 20);
function attachOnLoads() {
  $('script').each(function() {
    var script = $(this);
    if (!script.data('onload-attached')) {
      script.data('onload-attached', true).one('load', onloadHandler);
    }
  });
};
function onloadHandler() { console.log( $(this).attr('src') ); };

$(function() {
  window.clearInterval(scriptOnLoadInterval);
  console.log('Clear interval');
});

Суть в том, чтобы как можно раньше зарегистрировать интервальное событие с как можно меньшим таймингом и в этом событии пробегать по скриптам и к вновь появившимся навешивать onload. На document.ready интервал можно смело развоплощать.
Нужно поиграться с самим интервалом, чтобы он был достаточно маленьким, чтобы отслеживать появление скриптов, но при этом успевал отработать и не убивал производительность. И тем не менее, потенциально могут быть несрабатывания, нужно играться и смотреть.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы