Это немного странный случай использования, но у меня есть причины:
Я бы хотел написать
<script type="text/javascript" src="first.js"></script>
<script type="text/javascript" src="second.js"></script>
в моей разметке и, используя код в first.js
, предотвратить или отсрочить выполнение second.js
. Возможно ли это в любом браузере? Что делать, если содержимое first.js
является встроенным? (Если это помогает, предположим, что второй тег script имеет атрибут id
.)
Поскольку у меня есть несколько ответов, которые пропустили то, что я получаю, я должен уточнить:
- Решение должно быть полностью в пределах
first.js
. Все, что требует изменения исходного HTML-страницы илиsecond.js
, неприемлемо. - Допустимо загрузить
second.js
через Ajax и выполнить его с помощьюeval
. Это легкая часть. Жесткая часть предотвращает немедленное выполнениеsecond.js
. - Предположим, что вы не знаете, что в
second.js
. Таким образом, вы не можете просто заменить каждую глобальную функцию, называемуюsecond.js
функцией no-op. (Кроме того, это почти наверняка приведет к ошибкам.)
Если вы знаете о решении, которое работает в некоторых браузерах, но не в других, я бы хотел его услышать.
Пример. Чтобы сделать это более конкретным, скажем, что код
<script type="text/javascript">
function func() {
window.meaningOfLife = 42;
window.loadSecond();
};
setTimeout(func, 10);
</script>
предшествует двум script
включает, и что second.js
содержит строку
if (window.meaningOfLife !== 42) {throw new Error();}
first.js
должен быть в состоянии предотвратить эту ошибку, задерживая second.js
от выполнения до тех пор, пока не будет запущен window.loadSecond
. (Предположим, что реализация window.loadSecond
также находится в first.js
.) До не можно коснуться window.meaningOfLife
.
Обновить. Ответ Alohci отвечает этим требованиям, но только при условии, что второй тег script появляется сразу после первого, без пробелов между ними. Если кто-то может расширить свой хак, чтобы избежать этого требования, не внося никаких других нежелательных последствий, это было бы удивительно...