【问题标题】:How to execute javascript inside a script tag returned by an ajax response如何在 ajax 响应返回的脚本标记内执行 javascript
【发布时间】:2010-11-01 23:05:23
【问题描述】:

我正在发送一个 jquery get 请求,如下所示:

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

我希望收到的响应将包含在脚本标签中。

我了解浏览器不会执行响应,除非它在没有脚本标签的情况下返回。通常我会从响应中删除标签,但在这种情况下,我无法访问远程机器上运行的代码,因此无法从源代码中去除标签。

有没有办法可以从响应客户端剥离脚本标签并执行 javascript?

【问题讨论】:

    标签: javascript ajax jquery


    【解决方案1】:

    我的做法稍有不同,并使用 php land 使其更容易。 (我不喜欢使用 eval,也不喜欢显眼的大量重写)。

    我把我所有的 jquery 都放在一个 php 字符串中(现实生活中还有很多 JavaScript)

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

    然后也在 php 领域

        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(){}); 并自己动手

    【讨论】:

      【解决方案2】:

      您应该能够做到以下几点:

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

      【讨论】:

      • 我建议在脚本之前添加 var,以防止它是全局的。
      【解决方案3】:

      Jose Basilio 的回答还可以,但我建议将 eval 替换为 jQuery 的 globalEval 函数...

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

      globalEval 是调用返回类型为 script 的 ajax 方法时通常会调用的函数。

      这来自 API 文档...

      此方法的行为与使用普通 JavaScript eval() 不同 因为它是在全局上下文中执行的(这很重要 用于动态加载外部脚本)。

      【讨论】:

        【解决方案4】:

        或者:

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

        【讨论】:

          【解决方案5】:

          这对您有帮助吗:http://docs.jquery.com/Ajax/jQuery.getScript

          【讨论】:

          • 如果返回的数据没有包含在
          【解决方案6】:

          假设我们的响应在“响应”变量中:

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

          【讨论】:

          • 但是,如果要使用此解决方案,您可能不得不稍微复杂化正则表达式以允许脚本标签中的任何属性,并且可能将所述正则表达式锚定到开头和结尾字符串。例如(完全未经测试):/^
          【解决方案7】:

          如果我理解你的问题,这应该足以从脚本标签中取出文本:

          $(response).text()

          【讨论】:

            猜你喜欢
            • 2015-12-09
            • 2013-07-07
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多