Safari и Chrome не оценивают динамически добавляемый тег <script>при загрузке страницы - PullRequest
2 голосов
/ 06 февраля 2010

Я пишу небольшой код JavaScript, который будет загружать внешние файлы js при загрузке html-страницы.

Я проверял 2 способа.

Случай 1: Использовал document.write для добавления тега . Это работало для всех браузеров (IE, FF, Safari, Chrome, Opera).

Случай 2: Использовал DOMElement.appendChild для добавления тега к элементу .

Работало только для IE, FF и Opera. НЕ работал для Safari и Chrome.

В обоих случаях я ожидал, что новый тег будет вставлен перед закрывающим тегом . Таким образом, новый тег оценивается перед обработкой , и к моменту времени, когда вызывается window.onload, переменная success должна иметь значение true.

Но это было не для Safari и Chrome.

Кто-нибудь может сказать, должно это или не должно работать? Спасибо.

<html>
  <head>
    <title>JavaScript loading test</title>
    <script type="text/javascript">
      var success = false;

      window.onload = function()
      {
        document.getElementById("result").innerHTML = success? "OK": "ERROR!";
      }

      // TEST CASE 1.
      // Works for all browsers.
      document.write('<script type="text/javascript" src="foo.js"></' + 'script>');

      // TEST CASE 2.
      // Only works for Opera, FireFox, Opera.
      // var scriptElem = document.createElement("script");
      // scriptElem.setAttribute("type", "text/javascript");
      // scriptElem.setAttribute("src", "foo.js");
      // var headElem = document.getElementsByTagName("head")[0];
      // headElem.appendChild(scriptElem);
    </script>
    <!-- expected new scrip tag being inserted here. -->
  </head>
  <body>
    Testing...<br/>
    <span id="result"></span>
  </body>
</html>

"foo.js" - это всего лишь одна строка кода.

success = true;

Ответы [ 2 ]

4 голосов
/ 06 февраля 2010

Попробуйте вместо этого:

var s = document.createElement('SCRIPT');
s.charset = 'UTF-8';
s.src ='foo.js';
document.getElementsByTagName('HEAD')[0].appendChild(s);

Но поместите это в тег SCRIPT в начале тега BODY

1 голос
/ 06 февраля 2010

В то время, когда ваш javascript оценивается, DOM не полностью собран, элемент head даже не закончен.Обычно вы не можете получить доступ или управлять DOM (getElementsByTagName и appendChild и т. Д.) До полной загрузки HTML-страницы.

...