Какая лучшая практика: eval или append script? - PullRequest
20 голосов
/ 03 февраля 2012

Мне нужно выполнить пользовательский фрагмент JavaScript, полученный из вызова AJAX. Я мог бы сделать eval строки или просто добавить ее в теге script к DOM. Какой метод будет лучше?

var dynamicScript = 'alert(\'Hello world!\');';

Метод 1 - Сценарий :

var x = '<script type="text/javascript">' + dynamicScript  +'</scr' + 'ipt>';
$(document.body).append(x);

Метод 2 - Eval :

eval(dynamicScript);

Какой метод лучше и почему? Или есть ли лучшая альтернатива?

Ответы [ 4 ]

11 голосов
/ 03 февраля 2012

Я предпочитаю eval, потому что обычно быстрее , чем создание тега сценария и его добавление (особенно если вы хотите создать и вставить его с помощью jQuery).

Примечание(полезное применение тега скрипта) Я также использую метод вставки тега скрипта: в расширениях Google Chrome вставка тегов скрипта является единственным способом запуска кода в области страницы, поскольку windowобъект находится в песочнице.

PS.Понятие jQuery.getScript().Этот метод может быть полезен.

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

Добавьте его в DOM. Причины (взяты из http://ajaxpatterns.org/On-Demand_Javascript):

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

Вы можете загрузить JavaScript из внешних доменов.

URL-адрес указывает на определенный ресурс Javascript. С XMLHttpRequest вы получаете больше гибкости: например, вы можете отправлять несколько фрагментов JavaScript внутри разных узлов XML.

DOM затрагивается по-другому. Даже если поведение временное, сценарий будет добавлен в DOM, тогда как он исчезнет после его обратного вызова XMLHttpRequest.

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

Если вызов ajax возвращает html с тегами сценария, вы можете использовать $ .load () для импорта сценария.

http://api.jquery.com/load/

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

Ни один из методов не настолько хорош для того, что вы делаете. Ваш AJAX-вызов должен возвращать данные, а не сериализованные сценарии. Оба ваших метода открывают вам доступ к внедрению скрипта.

eval следует избегать любой ценой. Это медленно и опасно, Eval is evil

...