Javascript AJAX включает файл с Eval - PullRequest
4 голосов
/ 26 января 2012

Предположим, у меня есть

1) HTML-документ.

2) Этот документ HTML загружает файл Javascript "code.js" следующим образом:

<script src="code.js">

3) Пользователь нажимает кнопку, которая запускает функцию «fetchdata» в «code.js»,

4) Функция "fetchdata" выглядит так:

var xmlhttp = new XMLHttpRequest();
xmlhttp.onreadystatechange = function() {
    if (xmlhttp.readyState==4) {
        myjsdata = xmlhttp.responseText;
    }
}
xmlhttp.open("GET", 'http://www.example.com/data.js', false);
xmlhttp.send(null);

...

Теперь, как мне сделать следующее успешно:

Я хочу вставить / оценить свой Javascript таким образом, чтобы все функции в "code.js", включая "fetchdata" и функции, определенные выше / ниже, могли обращаться к данным (структурам, объявлениям, предварительно вычисленным значениям данных и т. Д. ) в "data.js".

(Если бы это было возможно, это была бы идея, так как я мог бы ждать загрузки фактического файла данных JS, пока пользователь явно не запросит его.)

Ответы [ 3 ]

10 голосов
/ 26 января 2012

В jQuery всегда есть что-то для всего:

http://api.jquery.com/jQuery.getScript/

Загружает файл JavaScript из URL и выполняет его в глобальном контексте.

edit: Упс, не видел, что вы не используете jQuery. Все всегда используют jQuery ...

Просто сделай:

var scrpt = document.createElement('script');
scrpt.src='http://www.example.com/data.js';
document.head.appendChild(scrpt);
5 голосов
/ 26 января 2012

я думаю, вам стоит взглянуть на этот сайт

этот сайт рассказывает о динамической загрузке и обратных вызовах (с примерами) - где вы можете вызвать функцию в загруженном скрипте после неегрузы.нет JQuery, просто чистый JS.

2 голосов
/ 26 января 2012

Это зависит от множества факторов, но в большинстве случаев вы захотите загрузить весь свой код / ​​html / css за один раз. Он требует меньше запросов и, следовательно, может похвастаться более высокой эффективностью. Если размер вашего файла кода не превышает несколько мегабайт, загрузка его по запросу пользователя не требуется.

В дополнение ко всему этому, изменение innerHTML и запуск сценариев с помощью eval могут быть очень громоздкими и рискованными (соответственно). Многие онлайн-ссылки подтверждают эту точку зрения. Не думайте, что если библиотека делает что-то подобное, ее можно выполнять безопасно.

Тем не менее, вполне возможно загрузить внешние файлы js и выполнить их. Один из способов - вставить весь код во вновь созданный тег сценария. Вы также можете просто попробовать запустить код в вызове функции eval (хотя это не рекомендуется).

address = "testscript.js";

var req = (window.XMLHttpRequest)?new XMLHttpRequest():new ActiveXObject("Microsoft.XMLHTTP");
if(req == null) {
    console.log("Error: XMLHttpRequest failed to initiate.");
}
req.onload = function() {
    try {
        eval(req.responseText);
    } catch(e) {
        console.log("There was an error in the script file.");
    }
}
try {

    req.open("GET", address, true);
    req.send(null);

} catch(e) {
    console.log("Error retrieving data httpReq. Some browsers only accept cross-domain request with HTTP.");
}
...