Выполнение Javascript, написанного с XMLHttpRequest, который содержит теги сценария? - PullRequest
2 голосов
/ 02 февраля 2012

Посредством запроса Javascript XMLHttpRequest отвечает дополнительным Javascript, который необходимо добавить на страницу запрашивающей страницы.

Использование eval (), если ответ выглядит примерно так:

alert('This is the js response');

... тогда это прекрасно работает.

Однако возвращаемый текст может выглядеть примерно так:

<script language="javascript">var checkVar='checkVar: value 1';</script>

но наиболее вероятно:

<script src="http://www.somesite.com/setCheckVarValue.js"></script> 

... там, где на страницу необходимо загрузить дополнительный JS.

Я гарантировал, что XMLHttpRequest равен synchronous, так как я хочу сослаться на checkVar сразу после этого.

Итак:

<script type="text/javascript" src="http://www.mysite.com/addJSToPage.js" />
// at this point, since this is a synchronous call, page processing waits
// until the response is received that needs to include the additional JS
// to load; this, for testing sets the value of checkVar

<script type="text/javascript" >
    alert(checkVar);
</script>

В сообщении должно быть указано «checkVar: значение 1».

По другим причинам это не так просто, как установка var checkVar в addJSToPaged.js, поэтому я не ищу такой рекомендации.

Я использую alert (checkVar) просто как тест, чтобы убедиться, что в ответе было установлено значение через JS.

Полагаю, я мог бы убрать начальный и конечный теги сценария и сохранить способ eval(). Тем не менее, я хотел бы знать, есть ли какие-либо решения, которые поддерживают то, что я ищу?

Спасибо.

UPDATE

Следуя совету Прашанта, в addJSToPage.js я добавил:

var dynamicElement = document.createElement('div');

Затем в ответе XMLHttpRequest я сделал:

dynamicElement.appendChild = xmlhttp.responseText;

Все еще не видите значение checkVar.

Ответы [ 3 ]

3 голосов
/ 02 февраля 2012

Игнорируя тот факт, что все, что вы делаете, вероятно, является плохой идеей, у Прашанта есть правильная идея вставить это в DOM. Вы также можете удалить теги и просто оценить их как "нормальные".

Не игнорируя тот факт, что 1) eval - это зло, 2) динамическая загрузка удаленного кода - это плохо и 3) синхронный AJAX - это очень плохо, я должен сказать следующее:

Если вы не знаете, что делаете, eval что-либо является плохой идеей, ее трудно отладить, могут выявить серьезные недостатки в области безопасности и все виды других неприятностей. Затем вы соединяете это, загружая удаленный код, который, по-видимому, генерируется вне вашего контроля, потому что вы не можете получить только сценарий. Синхронный Ajax плох, потому что в javascript есть только один поток, блокировка на Ajax буквально блокирует страницу whole до тех пор, пока она не будет загружена, потому что даже такие вещи, как прокрутка, генерируют события javascript, которые должен проверить текущий занятый механизм для погрузчиков. В то время как запрос выполняется на вашей локальной машине, кто-то с медленным или некачественным соединением может ждать некоторое время, вплоть до времени ожидания соединения. «A» в AJAX является асинхронным, и по уважительной причине используйте обратные вызовы, они есть по причине.

Если вы просто делаете передачу данных, используйте JSON, который является нотацией объектов JavaScript, простым форматом данных, который также является допустимым JavaScript. Вы можете использовать eval на нем, но я предлагаю парсер JSON, я думаю, что в большинство современных браузеров они встроены (здесь может быть неправильно). JSON хорош, потому что он может выражать сложные структуры данных, прост в генерации и разборе и широко поддерживается.

2 голосов
/ 04 февраля 2012

Повторное отображение - необходимо иметь возможность динамически загружать некоторый контент на страницу после / во время загрузки и выполнять ее. Под исполнением я имею в виду не просто изменить текст на каком-то элементе div - это легко. Но если мы хотим динамически загрузить новый JS, скажем, оповещение, которое приходит из какого-то внешнего источника, и внедрить его вместе с его тегами сценария и, возможно, каким-то другим HTML-кодом, тогда решение заключается в использовании следующего вызова jQuery: 1001 *

jQuery(dynamicResponse).appendTo('body');

dynamicResponse происходит из асинхронного ответа $.ajax({}) или XmlHttpRequest. Когда он присутствует, он добавляется к любому элементу DOM, указанному в appendTo() и выполняется.

1 голос
/ 02 февраля 2012

Вот пример

var script = document.createElement("script");
//innerHTML can be the response from your server. But send the text with script tag.
script.innerHTML = "var foo = function(){console.log('injected into the DOM')}" 
document.body.appendChild(script) // insert into the DOM
foo() // call the function 
...