有时咱们须要判断是否是ajax请求来决定模块输出仍是json格式输出.javascript
在发送ajax请求的时候,咱们能够经过XMLHttpRequest这个对象,建立自定义的header头信息, 在jquery框架中,对于经过它的$.ajax, $.get, or $.post方法请求网页内容时,它会向服务器传递一个HTTP_X_REQUESTED_WITH的参数,php中就是在header一层判断是不是ajax请求,对应的根据$_SERVER['HTTP_X_REQUESTED_WITH']判断。php
/** * 当前请求是否ajax请求 * * @access public * @return bool */ function isAjax() { return isset($_SERVER['HTTP_X_REQUESTED_WITH']) && strtolower($_SERVER['HTTP_X_REQUESTED_WITH']) == 'XMLHttpRequest'; }
若是是跨域的话这个,上面的isAjax就彻底不正确了。跨域同域的问题参考:《$.getjson遇到的几个问题》使用$.getJSON来实现跨域,可是检测是不是ajax一直是false,并尝试$get(参看:$.get实现返回解析json数据以及jsonp跨域)以后无果的以后,考虑要使用万能的$ajax方法,见ajax的文档:html
若是指定了script或者jsonp类型,那么当从服务器接收到数据时,其实是用了<script>标签而不是 XMLHttpRequest对象。这种状况下,$.ajax()再也不返回一个XMLHttpRequest对象,而且也不会传递事件处理函数,好比 beforeSend。java
ajax跨域只能指定jsonp格式的数据,这个是就不是XMLHttpRequest对象了,就算你自定义一个$_SERVER['HTTP_X_REQUESTED_WITH']也是没有意义的jquery
针对跨域状况的getjson 或者ajax(jsonp)可使用ACCEPT请求头部格式来判断ajax
PHP端对应$_SERVER['HTTP_ACCEPT']json
jsonp的请求通常是:text/javascript, application/javascript, */*跨域
json的请求:application/json, text/javascript, */*服务器
一个简单的判断跨域条件下的ajax请求:app
switch ($_SERVER['HTTP_ACCEPT']){ case 'application/json, text/javascript, */*': // JSON 格式 break; case 'text/javascript, application/javascript, */*': // javascript 或 JSONP 格式 break; case 'text/html, */*': // HTML 格式 break; case 'application/xml, text/xml, */*': // XML 格式 break; }