Разница в том, что IE выполняет элемент script при первом добавлении его в childNodes родительского элемента, независимо от того, находится ли родительский элемент в документе. Другие браузеры выполняют скрипт только тогда, когда он добавляется к узлу внутри дерева документа childNodes.
Функция domManip
jQuery (строка 524 в jQuery 1.3.2), которая вызывается append
и другими подобными методами jQuery, пытается быть умной и вызывает evalScript
для любых элементов <script>
, которые она находит в окончательно проанализировал HTML, чтобы выполнить скрипт (выполняя запросы AJAX, если это необходимо для внешних скриптов). (Фактические элементы сценария были удалены из проанализированных дочерних узлов, чтобы остановить их выполнение при вставке в документ, предположительно, чтобы сценарии выполнялись только один раз, когда содержимое, содержащее их, добавляется в несколько элементов одновременно.)
Однако, поскольку предыдущая функция clean
, в то время как анализирует HTML, добавляла элемент script к div-оболочке, IE уже выполнил сценарий. Таким образом, вы получите два казни.
Лучше всего избегать использования domManip
функций, таких как append
со строками HTML, когда вы что-то делаете со скриптами.
На самом деле, не забудьте поместить ваш контент в сериализованную HTML-строку и получить jQuery для его анализа; просто сделайте это гораздо более надежным способом DOM:
var s= document.createElement('script');
s.type= 'text/javascript';
s.charset= 'UTF-8';
s.src= 'js_test2.js';
document.getElementById('some_container').appendChild(s);
(Если честно, после просмотра живого исходного кода функции clean
у меня возникли серьезные сомнения по поводу использования манипуляций DOM на основе HTML-строк в jQuery для чего-либо вообще. Предполагается, что это исправит браузер ошибки, но обработка dumb-regex, по-моему, может вызвать столько же проблем, сколько и решить.)
Между прочим, при этом начальном вызове:
document.write(unescape("%3Cscript src='js_test1.js' type='text/javascript'%3E%3C/script%3E"));
Вам не нужно уходить отсюда; Я не знаю, почему так много людей. Необходимо избегать последовательности </
во встроенном скрипте, так как она заканчивает тег <script>
, и если вы делаете XHTML, то <
и &
также следует избегать (или ]]>
, если вы используя обертку CDATA), но есть более простой способ сделать все это только с помощью строковых литералов JavaScript:
document.write('\x3Cscript src="js_test1.js" type="text/javascript">\x3C/script>"));