jQuery的ajax里的这三个参数-------到底怎么用?

这三个参数,怎么用呢?规则到底是什么,糊涂了。。
accepts,contents,converters
求答。
什么情况下,才执行 convers 里的方法呢?
最好举个 例子。。例子。。例子。。。

jQuery.ajaxSetup({
  accepts: {
    script: "text/javascript, application/javascript"
  },
  contents: {
    script: /javascript/
  },
  converters: {
    "text script": jQuery.globalEval
  }
});

补充:
一篇相关的源码解析文章,敬上:http://www.cnblogs.com/chuaWe...

希望大神再帮我梳理梳理。。

//补充 发现在如何选择相应的converts函数时有些复杂,没分析。。

这三个参数的原理是:jquery 里面预先 设置了这三个参数,用户的设置也会合并覆盖进去。
accepts 是设置发送头里的类型,与另外两个没关系。

dataType 设置了就直接用来 在converts里比较并执行相应的converts 函数,
dataType没设置就 那就在contents里匹配,匹配后再在converts 里比较,执行相应的converts 函数。

coverts函数才将结果返回给 success fail complete 等函数。

clipboard.png

阅读 5.5k
3 个回答

题主所说的这几个我没有用过,所以也不清楚具体作用,贴一下API地址吧:

http://api.jquery.com/jQuery....

clipboard.png

clipboard.png

clipboard.png

---------------------------- 更新

看了一些文章:

https://decadecity.net/blog/2...

https://github.com/jquery/jqu...

这两篇文章和题主说的情况还是很接近的。写了一个case是相关用法的demo:

https://jsfiddle.net/weisiwu/...

但是在这个demo中我也贴了几个问题:

  1. 问题1: 加上 dataType 就会失败
  2. 问题2: content 咋写都可以,并没有像预料的一样检测响应头的类型
  3. 问题3: 转换的log没有打出来

---------------------------- 更新

看完源码后,大概了解了它的流程,但是jquery为什么这么做,我概括不出来。

我来说一下,它是怎么用的(个人的理解,欢迎讨论)。

首先在给出的例子中有三个属性:

accepts/contents/converters

第一个属性它的作用是用于和服务器进行内容协商(content negotiation),其实也就是建议服务器

按照请求中设置的头来返回数据类型。

第二个contents 属性,它的作用是在 dataType 被设置为 * 时其作用(经过测试,当不设置 dataType 时也会生效,应该是内部做了一些处理)

它的值一个键值对,如例子中给出的一样,jquery遍历它的属性,用属性值去检测响应头中的 content-type

clipboard.png

如果符合条件的话(为 true),那么将该请求的值按照对应的种类进行解析。需要注意的是,如果设置了 dataType,

那么这个属性是无效的(从代码里面来看)。

第三个属性 converters 用于转化值,例如用户指定的 dataType 为 self,那么需要在该属性中定义一个处理函数

来处理这种类型。至于第一个为什么为 text,我也给绕昏了,不过看上去应该是因为jquery 从 XHR 中抽出来的类型

(大概有: text/xml/json)。

我使用以下代码,更改了一些设置来印证我的看法

<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <title>通过jquery的ajax加载JS,但是不执行</title>
</head>
<body>
  <!-- 这个js做了一些关于 ajax 部分的解析, 8616 行左右 -->
  <script type="text/javascript" src="http://tmp.sampletest.cn/var/www/html/tmp/jquery.js"></script>
  <script type="text/javascript">
    $('body').append('<p>当前jquery 版本: ' + $.fn.jquery + '</p>');
    $.ajax({
      // 返回值的解析类型
      // dataType: 'script',
      dataType: '*',
      accepts: {
        script: 'text/javascript, application/javascript'
      },
      contents: {
        script: /javascript/
      },
      converters: {
        'text script': function(res) {
          console.log('通过转换器进行转换!', res);
          return res;
        }
      },
      url: 'http://tmp.sampletest.cn/var/www/html/tmp/jquery2.js',
      success: function(res) {
        //console.log('load jq 2.1.2 success!')
        $('body').append('<p>加载后的jquery 版本: ' + $.fn.jquery + '</p>');
      },
      error: function(err) {
        console.log('load jq 2.1.2 fail!', err)
      }
    });
  </script>
</body>
</html>

举几个例子 来印证我的看法:

1 dataType 设置为 * ,在 contents 中使用错误的正则来检测,结果如下:

clipboard.png

clipboard.png

代码执行完毕后,控制台并没有输出信息。可以视作因为没有 content-type 不满足 contents 中的 script

的正则,所以没有指定类型为 script.故也没有成功调用 converters

2 dataType 设置 script, 在 contents 中使用错误的正则来检测

clipboard.png

clipboard.png

代码执行完毕,控制台输出信息,可以视作其直接跳过了 contents

3 dataType 设置 *, 在 contents 中使用正确的正则来检测

clipboard.png

clipboard.png

代码执行完毕后,控制台输出信息,可以视作其通过 contents 将类型确定为 script 并最后成功调用

对应的 converters.

先这样,其实源码还是有一些东西我也不是很理解。周末回去再看看

accepts
默认: 取决于数据类型。
内容类型发送请求头,告诉服务器什么样的响应会接受返回。如果accepts设置需要修改,推荐在$.ajaxSetup()方法中做一次。

contents
一个以"{字符串:正则表达式}"配对的对象,用来确定jQuery将如何解析响应,给定其内容类型。

converters
默认: {"* text": window.String, "text html": true, "text json": jQuery.parseJSON, "text xml": jQuery.parseXML}

一个数据类型对数据类型转换器的对象。每个转换器的值是一个函数,返回响应的转化值

accepts和converters没有什么难点吧,我记得文档的例子就可以自己试验的啊,另外这种东西要自己学着看源码

//简单写一个,自己跑了试试吧
$.ajax({
url:"xxx",
dataType:"my",
accept:{'my':'text/html'},
converters:{'text my':function(data){console.log(data);return data.toString()+1;}}
success:function(data){cosnole.log(data)}
})
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题
宣传栏