Правильно, но я спрашиваю: а что, если у меня есть контроль над first.js, а не second.js?
=========================================================================================

емного странный случай, но у меня есть свои причины:

Я хотел бы иметь возможность написать

в моей разметке и, используя код в`first.js`предотвратить или задержать исполнение`second.js`, Это возможно в любом браузере? Что делать, если содержимое`first.js` встроены? (Если это поможет, предположим, что второй тег сценария имеет`id` атрибутов.)

Поскольку я получил пару ответов, в которых не было того, к чему я клоню, я должен уточнить:

Решение должно быть полностью внутри`first.js`, Все, что требует изменения исходного HTML-кода страницы или`second.js`не допускается.Этоявляется приемлемо для загрузки`second.js` через Ajax и выполнить его с помощью`eval`, Это легкая часть. Трудной частью является предотвращение немедленного исполнения`second.js`.Предположим, что вы**не знаю** Что в`second.js`, Таким образом, вы не можете просто заменить каждую глобальную функцию, вызываемую`second.js` с неоперативной функцией. (Кроме того, это почти наверняка приведет к ошибкам.)Если вы знаете решение, которое работает в некоторых браузерах, но не в других, я бы хотел услышать его.

**пример**: Чтобы сделать это немного более конкретным, скажем, что код

предшествует двум`script` включает в себя, и что`second.js` содержит строку

`first.js` должен быть в состоянии предотвратить эту ошибку, задерживая`second.js` от выполнения до`window.loadSecond` это запустить. (Предположим, что реализация`window.loadSecond` также в`first.js`.) Это**не** разрешено трогать`window.meaningOfLife`.

**Обновить**: Ответ Алохчи отвечает этим требованиям, но только при условии, что появится второй тег сценариянемедленно после первого, с пустым пространством между ними. Если бы кто-то мог продлить свой взлом, чтобы избежать этого требования, не представляя других нежелательных последствий, это было бы удивительно ...

 это на самом деле довольно просто и должно работать полностью кросс-браузерно. Однако требуется, чтобы first.js непосредственно предшествовал second.js без чего-либо между ними, кроме пробелов.

Во-первых, давайте предположим, что HTML выглядит так:

Я удалил setTimeout, потому что это может привести к запуску func () до запуска start.js, что приведет к ошибке «loadSecond is notfined». Вместо этого я предоставил ссылку для запуска func ().

Во-вторых, давайте предположим, что second.js выглядит так:

Здесь я только что добавил строку для добавления текста в тело документа, чтобы было легче увидеть, когда фактически выполняется second.js.

Тогда решение для first.js таково:

Функция loadSecond предназначена для запуска second.js при запуске func ().

Ключом к решению является`document.write` линия. Это будет вводить в HTML`<script type='application/x-suppress'>` между тегом закрытия скрипта first.js и тегом открытия скрипта second.js.

Открывающий тег скрипта second.js будет затем проанализирован как текстовое содержимое нового элемента скрипта и не будет выполнен. Наконец, закрывающий тег скрипта second.js будет переопределен, чтобы вместо этого закрыть новый элемент скрипта, что означает, что остальная часть HTML анализируется правильно.

Вы можете увидеть рабочую версию на<http://www.alohci.net/static/jsprevent/jsprevent.htm>



`<script>` метки имеют своиконтекст выполнения, что делает практически невозможным вмешиваться друг в друга. Конечно, вы получили (печально)**глобальный объект** (ссылается`window` в браузерах).

Предотвращение исполнения`second.js` довольно просто:сломать Это! При условии, что`second.js` пытается позвонить`document.getElementById` например:

[Рабочий пример](http://jsbin.com/ifoki4/4/) взлома jQuery, затем загрузка позже (с зависимостями).  
Проверено на:IE 6+, FF 3.6+, Chrome

**конец first.js**

в любое время ты хочешь**выполнить second.js**

Обратите внимание`onload` параметр для`execute` необязательно.



Насколько я знаю, ты не можешь. Если разметка выглядит

вы не можете получить доступ ко второму элементу скрипта изнутри`first.js`, поскольку он не был добавлен в DOM в момент запуска первого скрипта (даже если вы не назначите`id` ко второму элементу). Неважно, является ли код`second.js` помещается в строку или во внешний файл.

Единственное, что я не понимаю, это твой второй момент. Сначала вы говорите, что не можете контролировать разметку документа, но затем утверждаете, что можно загрузить`second.js` динамически (с использованием AJAX).



`first.js`, установлен`var shouldILoad = true`

Затем загрузить`second.js` сюда:

(где «myscript» - это идентификатор некоторого элемента, перед которым вы хотите вставить новый элемент Script)



`first.js` Отправитьсинхронный XHR к файлу PHP и удалил файл PHP`second.js`, Когда readyState достиг 4, у меня было что-то, предупреждающее JS, чтобы остановить поток. Затем я пошел и проверил сервер ... Да,`second.js` был удален И все же, это не сработает. Я бы закрыл окно предупреждения и код, который былв `second.js` все равно будет выполнен, несмотря на то, что файл исчез.

Я действительно не знаю, что это значит, но ответ на ваш вопрос, вероятно, «Нет, это невозможно».



Для обработки существующих тегов на странице:

Обезьяна-патчdocument.createElement.Переопределите дескрипторы «src» и «type» в прототипе HTMLScriptElement.Также это ребята обеспечивают[Эт](https://github.com/snipsco/yett) библиотека с подходом, описанным в статье.



 чтобы задержать выполнение некоторого кода