Сообщение от danik.js
|
melky я не понимаю к чему ты клонишь.
|
Сообщение от Poznakomlus
|
какой смысл удаять тег если скрипт будет все равно в памяти?
|
вот это я имел в виду. Скрипт на момент "удаления" уже пропарсен движком JS с скомпилен в байт-код (неоптимизированный).
Сообщение от danik.js
|
Впрочем я оказался не прав: даже во время парсинга скрипт исполнится асинхронно:
<script>
var script = document.createElement('script');
script.src = 'data:application/javascript,function%09fn(){alert("ok")}';
document.head.appendChild(script);
fn();
</script>
<script>
document.addEventListener('DOMContentLoaded', function(){
var script = document.createElement('script');
script.src = 'data:application/javascript,function%09fn(){alert("ok")}';
document.head.appendChild(script);
fn();
});
</script>
|
что?
попробуй достать до <body> из <head>, если они исполняются асинхронно. Парсер HTML приостанавливается, когда встречает <script>. Продолжает работу, когда <script> пропарсен.
твой первый пример полностью подтверждает это
<html>
<head>
<script>
try {
alert( 'document.getElementsByTagName("body").length: ' + document.getElementsByTagName("body").length );
} catch (e) {
alert( 'ошибка при доступе к document.getElementsByTagName("body").length \n\n\t' + e.message );
}
</script>
</head>
<body>Должен быть алерт</body>
</html>
асинхронно (не задерживая парсер HTML) скрипты загружаются, если их пометить атрибутом
async (в старых IE называется
defer). Но это не даёт никаких гарантий, что этот асинхронный скрипт будет работать после парсинга дерева.
Cори за оффтоп.