有時咱們須要判斷是否是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; }