Ответ 1
Ответ зависит от того, где находится тег script и как вы его добавили:
-
Script теги, встроенные в вашу разметку, выполняются синхронно с обработкой этой разметки браузером (кроме, см. № 2), и поэтому, если - например, те теги ссылаются на внешние файлы, они имеют тенденцию замедлить обработку страницы. (Это значит, что браузер может обрабатывать операторы
Тегиdocument.write
, которые изменяют разметку, которую они обрабатывают.) -
Script с атрибутом
defer
могут в некоторых браузерах не выполняться до тех пор, пока DOM не будет полностью отображен. Естественно, они не могут использоватьdocument.write
. (Аналогично, существует атрибутasync
, который делает асинхронным script, но я мало знаю об этом или насколько хорошо он поддерживается; details.) -
Script теги в содержимом, который вы назначаете элементам после загрузки DOM (через
innerHTML
и тому подобное), вообще не выполняются, запрещая использование библиотеки jQuery или Prototype для этого. (С одним исключением, указанным Энди Е: В IE, если у них есть атрибутdefer
, он будет выполнять их. Не работает в других браузерах.) -
Если вы добавите фактический элемент
script
в документ черезElement#appendChild
, браузер начнет загрузку этого script немедленно и выполнит его, как только загрузка будет завершена. Сценарии, добавленные таким образом, не выполняются синхронно или обязательно в порядке. Первое добавление<script type="text/javascript" src="MyFct.js"></script>
, а затем добавление<script type="text/javascript">myFunction();</script>
вполне может выполнить встроенный (второй) один перед удаленным (первым). Если это произойдет, иMyFct.js
объявитmyFunction()
, он не будет определен, когда мы попытаемся использовать его со встроенным script. Если вам нужно что-то сделать, вы можете узнать, когда загружен удаленный script, наблюдая за событиямиload
иreadyStateChange
в добавляемом элементеscript
(load
- это событие в большинстве браузеров,readyStateChange
в некоторых версиях IE, а некоторые браузеры делают оба, поэтому вам нужно обрабатывать несколько уведомлений для одного и того же script). -
Script внутри обработчиков событий по атрибутам (
<a href='#' onclick='myNiftyJavaScript();'>
), а не в теге script, выполняется соответствующее событие.
Я работал в своей реальной работе, и вдруг мой задний мозг сказал: "Знаете, вам сказали, что они не будут выполнены, если вы назначили их innerHTML
, но лично ли вы проверили?" И я этого не сделал, поэтому я сделал - FWIW:
<!DOCTYPE HTML>
<html>
<head>
<meta http-equiv="Content-type" content="text/html;charset=UTF-8">
<title>Script Test Page</title>
<style type='text/css'>
body {
font-family: sans-serif;
}
</style>
<script type='text/javascript'>
function addScript()
{
var str, div;
div = document.getElementById('target');
str = "Content added<" + "script type='text/javascript'>alert('hi there')<" + "/" + "script>";
alert("About to add:" + str);
div.innerHTML = str;
alert("Done adding script");
}
</script>
</head>
<body><div>
<input type='button' value='Go' onclick='addScript();'>
<div id='target'></div>
</div></body>
</html>
Предупреждение от script не отображается в IE7, FF3.6 или Chrome4 (я не удосужился проверить других, я должен работать:-)). Если вы добавили элементы, как показано здесь, выполняется script.