Подтвердить что ты не робот

Как выполнить javascript внутри тега script, возвращаемого ответом ajax

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

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

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

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

Можно ли отключить теги script с клиентской стороны ответа и выполнить javascript?

4b9b3361

Ответ 1

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

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

Ответ 2

Или:

var myScript = new Function($('script#myscript',responseText).text());
myScript();

Ответ 3

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

$(response).text()

Ответ 5

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

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

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

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

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

Ответ 6

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

script = response.replace(/<script>(.*)<\/script>/, "$1"); // Remove tags
eval(script); // Execute javascript

Ответ 7

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

Я поместил все мои jquery в php-строку вроде этого (в реальной жизни был LOT больше 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, это просто в моей кодовой базе, я сделал что-то вроде этого. трюк состоит в том, чтобы покончить с $(document).ready(function(){}); и бросить свой собственный