我在后台处理ajax和一般的网页请求时,一般是需要额外加个参数进行区分的。比如使用get参数的is_ajax=1,后台判断有is_ajax=1成立时,表明该请求是ajax请求,遂可区分处理。我正在使用的电商网站TPshop里边我遇到的都这样处理,如果一个接口可同时处理网页和jax的话,需要使用is_ajax来区分。

但我在看Thinkphp5的官方手册时,遇到里边说:

默认情况下,控制器在ajax请求会对返回类型自动转换,默认为json。

还有:

error方法会自动判断当前请求是否属于 Ajax 请求,如果属于Ajax请求则会自动转换为default_ajax_return配置的格式返回信息。

这两处分明就不是用is_ajax来区分网页和ajax请求的,那到底是什么原理呢?

翻一下源码:

/**
 * 当前是否Ajax请求
 * @access public
 * @param bool $ajax  true 获取原始ajax请求
 * @return bool
 */
public function isAjax($ajax = false)
{
    $value  = $this->server('HTTP_X_REQUESTED_WITH', '', 'strtolower');
    $result = ('xmlhttprequest' == $value) ? true : false;
    if (true === $ajax) {
        return $result;
    } else {
        return $this->param(Config::get('var_ajax')) ? true : $result;
    }
}

原来是根据$_SERVER[‘HTTP_X_REQUESTED_WITH‘]来设别的,所有的ajax请求都会带这个标识吗?

半夜寒羽的博客中有观点:

在发送ajax请求的时候,我们可以通过XMLHttpRequest这个对象,创建自定义的header头信息, 在jquery框架中,对于通过它的$.ajax,$.get, or $.post方法请求网页内容时,它会向服务器传递一个HTTP_X_REQUESTED_WITH的参数,php中就是在header一层判断是否是ajax请求,对应的根据$_SERVER['HTTP_X_REQUESTED_WITH']判断。

但又有网友遇到有些ajax框架是不带这个信息的,这就比较坑了,想想这又不是标准规范,带不带确实都得看个性的。所以,还是自己搞个is_ajax变量做判断妥一些。如果是自己开发的网站,用的是jquery,应该也无所谓了。

在看源码的时候随便看到了:

/**
 * 当前是否Pjax请求
 * @access public
 * @param bool $pjax  true 获取原始pjax请求
 * @return bool
 */
public function isPjax($pjax = false)
{
    $result = !is_null($this->server('HTTP_X_PJAX')) ? true : false;
    if (true === $pjax) {
        return $result;
    } else {
        return $this->param(Config::get('var_pjax')) ? true : $result;
    }
}

看来有一个非标准约束的标志出现了HTTP_X_PJAX(非标准的好像都带上‘X’)

那pjax又是什么玩意?我简单将我查阅的资料摘录一下。

history API中有几个新特性,分别是history.pushState和history.replaceState,我们把pushState+AJAX进行封装,合起来简单点叫,就是PJAX。

PJAX的基本思路是,用户点击一个链接,通过ajax更新页面变化的部分,然后使用HTML5的pushState修改浏览器的URL地址,这样有效地避免了整个页面的重新加载。

如何使用:

将jquery.pjax.js部署到你的页面中,将需要使用pjax的a链接进行绑定(不能绑定外域的url),如:

$('a').pjax({
  container: '#container', //内容替换的容器
  fx: 'fade',  //展现的动画,支持默认和fade, 可以自定义动画方式。
  cache: true,  //是否使用缓存
  storage: true,  //是否使用本地存储
  titleSuffix: '' //标题后缀
});

至于后台,跟处理ajax一样,只是用HTTP_X_PJAX来区分是否是pjax请求。

主要参考资料

1、 PHP判断ajax请求:HTTP_X_REQUESTED_WITH

2、 HTTP之X-Requested-With分析和思考

3、 PJAX的实现与应用

4、 pjax:ajax和pushState结合的js库

-end-

最新文章

  1. CHM打不开的解决方法
  2. Android四大组件之Activity详解——创建和启动Activity
  3. 每个人都应该知晓的8项Resharper快捷键
  4. Codeforces Round #116 (Div. 2, ACM-ICPC Rules) C. Letter 暴力
  5. Android Studio使用教程(一)
  6. Redis学习-持久化
  7. RoboCup仿真3D TC笔记(2014年合肥中国公开赛 仿真3D比赛环境搭建)
  8. 看到了必须要Mark啊,最全的编程中英文词汇对照汇总(里面有好几个版本的,每个版本从a到d的顺序排列)
  9. 2014-2015 ACM-ICPC, Asia Xian Regional Contest GThe Problem to Slow Down You
  10. python 全栈开发,Day118(django事务,闭包,客户管理,教学管理,权限应用)
  11. hdu5335(bfs,贪心)
  12. kepware http接口 OCaml
  13. 软工作业NO.2小学生线上杨永信——四则运算题目生成
  14. Git回版本回退
  15. 在64位的环境下利用Jet来操作Access,Excel和TXT
  16. [洛谷P5068][Ynoi2015]我回来了
  17. mvvm2
  18. Leetcode 529.扫雷游戏
  19. 图解 TCP/IP 第六章 TCP与UDP 笔记6.1 传输层的作用
  20. KMP瞎扯一下

热门文章

  1. CentOS 下安装 Node npm pm2
  2. css3 loading
  3. mongoose简单使用样例
  4. apache和nginx原理上的不同之处
  5. placeholder的字体样式改变,滚动条的颜色改变,ios日期兼容
  6. FB,Flash,as3 Bug集
  7. Hibernate(一)之Hibernate入门
  8. Java 9 尝鲜之JShell交互式编程环境
  9. 【redis专题(8)】命令语法介绍之通用KEY
  10. 使用RandomAccessFile类对文件进行读写