Есть ли какой-либо способ, кроме использования eval/handleAs: "javascript" для динамического извлечения скриптов (через XMLHttpRequest)
Здесь Я задал вопрос, относящийся к исключениям, возникающим при динамической загрузке скриптов через XMLHttpRequest (другими словами, когда выполняется через eval
)
В связанном вопросе я хотел знать, как динамически загружать сценарии как таковые, с самого начала считается плохой практикой. В моем конкретном случае у меня есть элемент HTML Canvas, и вместо того, чтобы загружать все возможные фигуры, я хочу их динамически импортировать, не перезагружая страницу и не запуская их при возврате. Проблема, с которой я столкнулась, заключается в том, что если код, связанный с этой формой, неверен, отображаемое сообщение об ошибке не очень полезно (указывает расположение оператора eval
, а не неверный оператор). Есть ли другой способ динамически извлекать код с сервера и выполнять его, а лучше информировать о местоположении исключения, когда это происходит.
Ответы
Ответ 1
Если вы хотите загрузить script, используйте элемент <script>
. Если вы хотите динамически загружать script, создайте элемент <script>
динамически.
var script = document.createElement('SCRIPT');
script.src = "<url to load>";
document.getElementsByTagName("HEAD")[0].appendChild(script);
Не гарантируется синхронный способ eval
с синхронным XHR, но в идеале вы бы структурировали свой код, чтобы воспользоваться асинхронностью.
Ответ 2
Добавляя к ответу Майка, если вы хотите, чтобы хорошая поддержка отладчика, включая тег script, вероятно, это путь, так как это то, что отладчики привыкли работать. Основные отличия от eval, о которых вам нужно знать:
- Eval запускается в области, где ее вызываемые теги script включены в глобальную область.
- Eval является синхронным, в то время как теги включены асинхронно. (Вам нужно будет использовать что-то вроде JSONP и dojo. io.script, если вам нужно запустить код после завершения тега script).
Если скрипты исправлены, вы можете также рассмотреть возможность их отладки, включив теги script и развернув их по своему усмотрению.