Разница в JavaScript между eval () и добавлением тегов скрипта - PullRequest
8 голосов
/ 05 февраля 2011

Мне было интересно, может ли кто-нибудь объяснить разницу между использованием eval () Javascript и другим подходом, например, использованием JQuery для создания тегов сценария и последующим добавлением этого элемента на страницу:

eval(somecode);

vs.

$("<script type='text/javascript'>"+somecode+"</script>").appendTo("head");

Не уверен, что это уместно, но вот контекст: я работаю с версией модуля Drupal Popups, основная цель которого - легко превращать обычные ссылки во всплывающие окна с помощью AJAX'а всегозапрос страницы и добавление его на страницу в модальном окне.Это часто включает внешние файлы CSS и Javascript.Стремясь улучшить производительность всей этой загрузки AJAX, я переключился на использование очередей AJAX и изменил eval () внешних сценариев на альтернативу, перечисленную ниже.Однако это вызвало спорадические ошибки Javscript на других страницах.

Ответы [ 3 ]

2 голосов
/ 05 февраля 2011

Ну, одна (если говорить о различиях) - eval вернет результат выражения.

var result = eval('3+4'); // result = 7 

Пока ваша строка JavaScript находится в структуре блока скрипта, я быпредложить ввести его в тег скрипта /

1 голос
/ 05 февраля 2011

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

Обратите внимание, что существует миллиард случаев, если, но тогда, но я предполагаю, что это случай, основанный на вашем сценарии.*

Теперь вы можете загружать XHR синхронно, но тогда все резко замедлится.Браузеры могут загружать шесть (ish) скриптов одновременно, но выполнять их по порядку.XHR будет загружаться по одному за раз.

1 голос
/ 05 февраля 2011

Я настоятельно рекомендую использовать JSON-P.

Добавить имя функции обратного вызова в исходящий запрос AJAX, создав узел сценария на лету (с src = [url]), и позволить функции обратного вызова получитьвызывается с данными JSON.Вы определяете функцию обратного вызова на своей странице (должным образом распределенную по пространству имен) и помещаете в нее свою логику обновления.

Преимущество динамического обратного вызова узла сценария заключается в том, что нет такого же домена, как в XHR.1006 * Например, ваш сайт www.foobar.com, а некоторые веб-сервисы размещены на www.foobarapi.com.вы создаете узел сценария во время выполнения с помощью src = "http://www.foobarapi.com/baz?a=foo1&b=foo2&callback=foo.bar.baz"

. Тем временем на вашей странице у вас есть:

foo.bar.baz = function(data) {
  // use the data
}

А ваш бэкэнд-сервис, скажем php, может выглядеть так:

$a=$GET['a'];
$b=$GET['b'];
$callback = $GET['callback'];
$c = someCalc($a, $b);
echo $callback . "({ \"c\" : $c });";
...