Кросс-браузерная загрузка javascript с обратным вызовом: есть ли лучший способ, чем использование iframes? - PullRequest
2 голосов
/ 26 декабря 2011

Я хочу программно загрузить файл .js и выполнить некоторые действия после его завершения. Файл, который я хочу включить, размещен в домене, в который он будет включен.

В частности, файл, который я загружаю, это swfobject.js. Я хочу проверить его наличие и загрузить его только при необходимости.

Вот что у меня есть:

// BHD is defined elsewhere. For this example:
var BHD = {};

BHD.uid = function () {
  return 'x'+(+(''+Math.random()).substring(2)).toString(32)+(+new Date()).toString(32);
};

BHD.include = function (file, callback) {
  var uid = BHD.uid();
  frame = document.createElement('iframe');
  frame.src = file;
  frame.id = frame.name = uid;
  frame.onload = function () {
    var s = document.getElementsByTagName('script')[0]; 
    var d = frames[uid].document.documentElement;
    var script = document.createElement('script');
    script.type = 'text/javascript';
    script.text = d.textContent||d.innerText;
    s.parentNode.insertBefore(script, s);
    callback();
    s.parentNode.removeChild(s);
    frame.parentNode.removeChild(frame);
  }
  document.documentElement.appendChild(frame);
}

Это похоже на работу. Хотя это уродливый хак. Содержимое файла .js загружается в iframe, и когда загрузка iframe заканчивается, в основной документ добавляется новый элемент сценария с содержимым iframe. По-видимому, это приводит к немедленной загрузке сценария, поэтому обратный вызов может быть вызван сразу после этого.

Мне интересно, есть ли лучший способ сделать это. Я ищу что-то вроде кросс-браузерного события 'onload' для тегов скрипта или какой-то другой способ избежать взлома iframe.

1 Ответ

0 голосов
/ 04 декабря 2014

Современные версии IE поддерживают событие load для элементов сценария (и readystate больше не поддерживается), поэтому будут работать обычные методы события load, многократные пути кода не требуются, и нам больше не нужно мириться с охваченным ошибками готовым состоянием .

...