Использование appendChild с IE в Javascript

У меня возникли проблемы с этим кодом в IE (в Chrome он работает нормально):

<html>
<body>
<script type="text/javascript">
    var scriptContent = "var whatever=1";
    var _js = document.createElement('script');
    _js.setAttribute('type', 'text/javascript');
    textNode = document.createTextNode(scriptContent);
    _js.appendChild(textNode);  
    document.getElementsByTagName('body')[0].appendChild(_js);
</script>
</body>
</html>

Ошибка, которую я получаю в Internet Explorer (IE9): «неожиданный вызов метода или доступ к свойству» в операторе «_js.appendChild (textNode)».

Есть ли способ обойти эту проблему?


person Mike    schedule 17.08.2011    source источник
comment
Из того, что я прочитал, у IE9 есть некоторые проблемы с использованием appendChild для элемента body (я знаю, что ваша ошибка была до этого). В идеале вы все равно хотите помещать свои скрипты в голову, а не в тело.   -  person Jamie Dixon    schedule 17.08.2011


Ответы (2)


Как вы можете видеть здесь appendChild() в IE не применяется к <script>-элементам. (Похоже, IE9 поддерживает это, но это зависит от режима браузера)

Ранее был правильный ответ от Nivas, к сожалению, он был удален. В IE используется

_js.text = scriptContent; 
person Dr.Molle    schedule 17.08.2011

Ваш скрипт выполняется до того, как DOM будет готов, поэтому получение тега <body> является условием гонки. На самом деле я получаю ту же ошибку в Chrome 15 и Firefox 8.

Вы можете видеть, что код работает при вызове после загрузки страницы, например, в функции

HTML

<a href="#" onclick="return append()">append</a>

JavaScript

function append() {
    var scriptContent = "var whatever=1";
    var _js = document.createElement('script');
    _js.setAttribute('type', 'text/javascript');
    textNode = document.createTextNode(scriptContent);
    _js.appendChild(textNode);  
    document.getElementsByTagName('body')[0].appendChild(_js);
    return false;
}
person andyb    schedule 17.08.2011
comment
Да, вопрос был о том, как заставить его работать в IE9, который я протестировал, и он работает (но я полностью согласен, что это зависит от режима просмотра). Я считаю, что мой ответ по-прежнему действителен в отношении неготовой части DOM, поскольку я получаю точно такую ​​​​же ошибку в разных браузерах без вызова append после того, как DOM готов - person andyb; 17.08.2011
comment
Я думаю, что проблема для appendChild не в теле, а в теге скрипта. - person bart; 17.08.2011
comment
@andyb: я думаю, что IE9 был используемым браузером, но OP нравится, чтобы он работал и в более ранних версиях (все еще есть много пользователей WinXP, для которых IE9 недоступен). Но, конечно, ваш ответ по-прежнему актуален и тоже хорош :) - person Dr.Molle; 17.08.2011