Как выполнить javascript внутри тега script, возвращенного ответом ajax - PullRequest
19 голосов
/ 11 июня 2009

Я отправляю запрос на получение jquery следующим образом:

$.get($(this).attr("href"), $(this).serialize(), null, "script");

Ответ, который я ожидаю получить, будет заключен в теги сценария.

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

Есть ли способ убрать теги скрипта со стороны клиента ответа и выполнить javascript?

Ответы [ 7 ]

27 голосов
/ 11 июня 2009

Вы должны быть в состоянии сделать следующее:

$.get($(this).attr("href"), $(this).serialize(), function(data){
   var script = $(data).text();
   eval(script);
});
4 голосов
/ 19 июля 2010

Или:

var myScript = new Function($('script#myscript',responseText).text());
myScript();
2 голосов
/ 11 июня 2009

Поможет ли вам: http://docs.jquery.com/Ajax/jQuery.getScript?

2 голосов
/ 11 июня 2009

Если я правильно понимаю ваш вопрос, этого должно быть достаточно, чтобы вывести текст из тегов сценария:

$(response).text()

1 голос
/ 02 мая 2015

Хосе Базилио ответит хорошо, но я рекомендую заменить eval на globalEval функцию jQuery ...

$.get($(this).attr("href"), $(this).serialize(), function(data) {
   script = $(data).text();
   $.globalEval(script);
});

globalEval - это функция, которая обычно вызывается при вызове ajax-метода с типом возврата script .

Это из документации по API ...

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

0 голосов
/ 07 октября 2016

Я сделал это немного по-другому, и использовал php land, чтобы сделать это проще. (Мне не нравится использовать eval, и при этом я не люблю громких заметных переписываний).

Я поместил все свои jquery в строку php примерно так (в реальной жизни было намного больше JavaScript)

    $out .= "       $('#save_now').button(); \n";
    $out .= "       $('#save_now').click( function() {\n";
    $out .= "          return false;\n";
    $out .= "       }); \n";

тогда тоже в php land

    echo "<script>\n";
    echo "  function onOpen(){ \n";
    echo $out;
    echo "  } \n";
    echo "</script>\n";

затем в вызове jQuery $ .ajax я делаю это

   $.ajax({
           url: geturl,
           type: 'post',
           data: getparams,
           success: function(data) {
               mydiv.html(data);  
               onOpen();  
           }, 
           cache: false
      });

как вы можете видеть, вы не нуждаетесь в php land, просто в моей кодовой базе мне это как-то нужно. хитрость заключается в том, чтобы покончить с $(document).ready(function(){}); и бросить свой собственный

0 голосов
/ 11 июня 2009

Скажите, что наш ответ находится в 'response' var:

script = response.replace(/<script>(.*)<\/script>/, "$1"); // Remove tags
eval(script); // Execute javascript
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...