Учитывая ваши конкретные требования, это на самом деле довольно просто и должно работать полностью кросс-браузерно.Однако требуется, чтобы first.js непосредственно предшествовал second.js без каких-либо различий между ними, кроме пробелов.
Сначала давайте предположим, что HTML-код выглядит следующим образом:
<!DOCTYPE html>
<html>
<head>
<title>Test Case</title>
<meta charset="UTF-8" />
<script type="text/javascript">
function func() {
window.meaningOfLife = 42;
window.loadSecond();
};
</script>
<script type="text/javascript" src="first.js"></script>
<script type="text/javascript" src="second.js"></script>
</head>
<body>
<p>Lorem ipsum dolor sit amet ...</p>
<a href="javascript:func()">Run Func()</a>
</body>
</html>
I 'мы удалили setTimeout, потому что это может привести к запуску func () до запуска start.js, что приведет к ошибке «loadSecond is notfined».Вместо этого я предоставил ссылку для запуска func ().
Во-вторых, давайте предположим, что second.js выглядит следующим образом:
document.body.appendChild(document.createTextNode("second.js has run. "));
if (window.meaningOfLife !== 42) {throw new Error();}
Здесь я только что добавил строку, чтобы добавить некоторый текст в тело документа, чтобы было прощечтобы увидеть, когда на самом деле выполняется second.js.
Тогда решение для first.js таково:
function loadSecond()
{
var runSecond = document.createElement("script");
runSecond.setAttribute("src", "second.js");
document.body.appendChild(runSecond);
}
document.write("<script type='application/x-suppress'>");
Функция loadSecond предназначена для запуска second.js при запуске func ()..
Ключом к решению является строка document.write
.Он вставит в HTML <script type='application/x-suppress'>
между тегом close script в файле first.js и тегом open script в файле second.js.
Анализатор увидит это и запустит новый элемент script.Поскольку атрибут type имеет значение, которое не распознается браузером как JavaScript, он не будет пытаться запустить его содержимое.(Таким образом, существует неограниченное количество возможных значений атрибутов типа, которые вы можете использовать здесь, но вы должны включить атрибут типа, так как при его отсутствии браузер будет предполагать, что содержимое сценария является JavaScript.)
ВторойОткрывающий тег сценария .js будет затем проанализирован как текстовое содержимое нового элемента сценария и не будет выполнен.Наконец, закрывающий тег скрипта second.js будет переопределен, чтобы вместо этого закрыть новый элемент скрипта, что означает, что остальная часть HTML анализируется правильно.
Вы можете увидеть рабочую версию на http://www.alohci.net/static/jsprevent/jsprevent.htm