如果返回的数据是javascript,$ .ajax会自动执行脚本吗?

时间:2015-04-08 09:13:41

标签: javascript php jquery ajax

我使用单个JS文件将我的所有数据发布回我的服务器,使用:

$.ajax({
        url: "/backend/post.php", // Url to which the request is send
        type: "POST",             // Type of request to be send, called as method
        data: new FormData(this), // Data sent to server, a set of key/value pairs (i.e. form fields and values)
        contentType: false,       // The content type used when sending data to the server.
        cache: false,             // To unable request pages to be cached
        processData:false,        // To send DOMDocument or non processed data file it is set to false
        success: function(response, status, xhr)   // A function to be called if request succeeds
        {
            var ct = xhr.getResponseHeader("content-type") || "";
            if(ct.indexOf("text/plain") > -1){
                alert(response);
                console.log('text - response');
            }
            if(ct.indexOf("text/javascript") > -1){
                //eval(response);
                console.log('javascript - response');
            }
        }
    });

它经历了服务器端的一大堆功能,但最终到达了这一个:output_javascript("alert('item added');");

function output_javascript($script)
{
    header("content-type:text/javascript");
    echo $script;
}

我们的想法是让$.ajax函数显示文本或从服务器执行脚本。

$.ajaxoutput_javascript("alert('item added');");获得响应时,它会执行两次代码。当我注释掉要在成功函数中执行的代码时:

$.ajax({
        url: "/backend/post.php", // Url to which the request is send
        type: "POST",             // Type of request to be send, called as method
        data: new FormData(this), // Data sent to server, a set of key/value pairs (i.e. form fields and values)
        contentType: false,       // The content type used when sending data to the server.
        cache: false,             // To unable request pages to be cached
        processData:false,        // To send DOMDocument or non processed data file it is set to false
        success: function(response, status, xhr)   // A function to be called if request succeeds
        {

        }
    });

然后它只执行一次响应。让我相信$.ajax在返回response变量中的脚本之前执行代码。

这是真的,还是我不能正确理解$.ajax?如果我误解$.ajax函数,有人可以告诉我如何解决这个问题吗?

1 个答案:

答案 0 :(得分:7)

是的,ajax将执行返回的JavaScript代码。我们可以在the documentation中看到这一点:

  

dataType(默认值:智能猜测(xml,json,script或html))

     

类型:字符串

     

您期望从服务器返回的数据类型。如果没有指定,jQuery将尝试根据响应的MIME类型推断它(XML MIME类型将产生XML,在1.4 JSON中将产生一个JavaScript对象,在1.4脚本中将执行脚本,其他任何东西将是以字符串形式返回)。可用的类型(以及作为成功回调的第一个参数传递的结果)是:

因此,如果您未指定dataType,jQuery将从响应中找出它。好的,但它对"script"值有什么影响?再往下:

  

“script”:将响应评估为JavaScript并将其作为纯文本返回。通过将查询字符串参数“_ = [TIMESTAMP]”附加到URL来禁用缓存,除非缓存选项设置为true。注意:这会将POST转换为GET以获取远程域请求。

后来在讨论中:

  

如果指定了script$.ajax()将执行从服务器接收的JavaScript,然后将其作为字符串传递给成功处理程序。

只需在页面上搜索“JavaScript”一词,即可在文档中轻松找到所有这些内容。