问题:

在 ThinkPHP 中使用原生 js 发起 Ajax 请求的时候、在控制器无法使用 IS_AJAX 进行判断。而使用 jQuery 中的 ajax 是没有问题的。

在ThinkPHP中、有一个判断是 ajax 请求的常量 IS_AJAX;

Ajax 请求常用的有两种情况:一种是原生 js 的 ajax 请求、一种是 jQuery 的 ajax 请求。

分析:

先看看使用 jQuery 中使用 ajax 发送请求的时候的头信息:
  1. Accept: application/json, text/javascript, */*; q=0.01
  2. Accept-Encoding: gzip, deflate, br
  3. Accept-Language: zh-CN,zh;q=0.9
  4. Connection: keep-alive
  5. Content-Length: 22
  6. Content-Type: application/x-www-form-urlencoded; charset=UTF-8
  7. Cookie: PHPSESSID=ns9mjve234erh0qerlcl180v52
  8. Host: localhost
  9. Origin: http://localhost
  10. Referer: http://localhost/ok/
  11. User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/547.36 (KHTML, like Gecko) Chrome/71.0.3578.98 Safari/547.36
  12. X-Requested-With: XMLHttpRequest
再看看使用 JS 中的原生 ajax 发送请求的时候的头信息:
  1. Accept: */*
  2. Accept-Encoding: gzip, deflate, br
  3. Accept-Language: zh-CN,zh;q=0.9
  4. Connection: keep-alive
  5. Cookie: PHPSESSID=ns9mjve234erh0qerlcl180v52
  6. Host: localhost
  7. Referer: http://localhost/tp/
  8. User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/547.36 (KHTML, like Gecko) Chrome/71.0.3578.98 Safari/547.36
再查看在TP是如何定义的常量 IS_AJAX:

在 tp3.2.3 版本中

\ThinkPHP\Library\Think\App.class.php (Line:49)

  1. define('IS_AJAX', ((isset($_SERVER['HTTP_X_REQUESTED_WITH']) && strtolower($_SERVER['HTTP_X_REQUESTED_WITH']) == 'xmlhttprequest') || !empty($_POST[C('VAR_AJAX_SUBMIT')]) || !empty($_GET[C('VAR_AJAX_SUBMIT')])) ? true : false);
你会发现如下:

使用 jquery 发送 ajax 请求的时候、比使用原生 js 中的 ajax 多一个请求头 X-Requested-With: XMLHttpRequest。

而且 ThinkPHP 就是利用判读是否存在请求头这种原理去定义常量 IS_AJAX 的。

那怎么解决这个问题呢?

在发送ajax请求的时候设置一个对应的请求头信息。

  1. function page( page )
  2. {
  3. var ajax = new XMLHttpRequest()
  4. ajax.open( 'get', '__URL__/show?page='+page, true )
  5. ajax.setRequestHeader("X-Requested-With", "XMLHttpRequest");
  6. ajax.send()
  7. ajax.onreadystatechange = function ()
  8. {
  9. if ( ajax.readyState == 4 && ajax.status == 200 )
  10. {
  11. document.getElementById( 'box' ).innerHTML = ajax.responseText;
  12. }
  13. }
  14. }

设置完之后、再次看请求头信息、与之前的对比、多了一条

  1. Accept: */*
  2. Accept-Encoding: gzip, deflate, br
  3. Accept-Language: zh-CN,zh;q=0.9
  4. Connection: keep-alive
  5. Cookie: PHPSESSID=ns9mjve234erh0qerlcl180v52
  6. Host: localhost
  7. Referer: http://localhost/tp/index.php/Home/Index/show
  8. User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/547.36 (KHTML, like Gecko) Chrome/71.0.3578.98 Safari/547.36
  9. X-Requested-With: XMLHttpRequest

如此问题便解决了。

ThinkPHP 中使用 IS_AJAX 判断原生 JS 中的 Ajax 出现问题的更多相关文章

  1. 原生JS中apply()方法的一个值得注意的用法

    今天在学习vue.js的render时,遇到需要重复构造多个同类型对象的问题,在这里发现原生JS中apply()方法的一个特殊的用法: var ary = Array.apply(null, { &q ...

  2. 原生js中slice()方法和splice()区别

    slice()方法和splice()方法都是原生js中对数组操作的方法. slice(),返回一个新的数组,该方法可从已有的数组中返回选定的元素.例如:arrObject(start,end),sta ...

  3. 【温故知新】——原生js中常用的四种循环方式

    一.引言 本文主要是利用一个例子,讲一下原生js中常用的四种循环方式的使用与区别: 实现效果: 在网页中弹出框输入0   网页输出“欢迎下次光临” 在网页中弹出框输入1   网页输出“查询中……” 在 ...

  4. 关于原生js中函数的三种角色和jQuery源码解析

    原生js中的函数有三种角色: 分两大种: 1.函数(最主要的角色)2.普通对象(辅助角色):函数也可以像对象一样设置属于本身的私有属性和方法,这些东西和实例或者私有变量没有关系两种角色直接没有必然的关 ...

  5. koa 基础(十七)原生 JS 中的类、静态方法、继承

    1.app.js /** * 原生 JS 中的类.静态方法.继承 * es5中的类和静态方法 */ function Person(name, age) { // 构造函数里面的方法和属性 this. ...

  6. JavaScript 基础——使用js的三种方式,js中的变量,js中的输出语句,js中的运算符;js中的分支结构

    JavaScript 1.是什么:基于浏览器 基于(面向)对象 事件驱动 脚本语言 2.作用:表单验证,减轻服务器压力 添加野面动画效果 动态更改页面内容 Ajax网络请求 () 3.组成部分:ECM ...

  7. 【面试篇】寒冬求职季之你必须要懂的原生JS(中)

    互联网寒冬之际,各大公司都缩减了HC,甚至是采取了“裁员”措施,在这样的大环境之下,想要获得一份更好的工作,必然需要付出更多的努力. 一年前,也许你搞清楚闭包,this,原型链,就能获得认可.但是现在 ...

  8. 原生js中stopPropagation,preventDefault,return false的区别

    1.stopPropagation:阻止事件的冒泡,但不阻止事件的默认行为. 最好莫过于用例子说明: <div id='div'  onclick='alert("div") ...

  9. 原生js中获取this与鼠标对象以及vue中默认的鼠标对象参数

    1.通过原生js获取this对象 <!DOCTYPE html> <html> <head> <meta charset="utf-8" ...

随机推荐

  1. stylus导入时 报错These relative modules were not found

    These relative modules were not found: * ./star48_@2x.png in ./node_modules/_css-loader@0.28.7@css-l ...

  2. Angular 2/4/5+ 重复点击菜单刷新界面

    记一下,网上没找到方法 自己搞了好久  通过跳转到别的界面在跳回来的方式进行实现             //再次点击刷新界面       if (this.router.url == item.ur ...

  3. CenOS 更换yum源

    说明: 更换CentOS yum源既是修改配置文件/etc/yum.repos.d/CentOS-Base.repo. 目前有很多公司都提供yum源文件的下载,所以我们可以不需要去修改这个文件,直接从 ...

  4. MySql5.7多实例配置教程

    最近朋友在搞在Linux上配置MySql5.7多实例教程,在网上查询了很多资料,一直报各种各样的错误,后来在网上搜了一篇博客,根据其配置,最近是配置成功了 参考配置连接:https://blog.cs ...

  5. vs2017激活码

    Visual Studio 2017(VS2017) 企业版 Enterprise 注册码:NJVYC-BMHX2-G77MM-4XJMR-6Q8QF Visual Studio 2017(VS201 ...

  6. sqlserver查看锁表进程及对锁定的表进行解锁

    select request_session_id spid,object_name(resource_associated_entity_id) tableName from sys.dm_tran ...

  7. [转]vux使用教程

    原文:https://blog.csdn.net/revival_liang/article/details/78267992 <1>. 在项目里安装vuxnpm install vux ...

  8. 线性求第k大

    快排变种. 快排每次只进行部分排序,进入左边或者右边或者当前mid就是答案. 据说期望值是O(n) 然后STL中的 nth_element也是用这个思想. #include <cstdio> ...

  9. test for open live writer

    this is a test article post by open live writer.

  10. PHP 多维数组排序 函数怎么保持数字键不被重新索引

    /** * 根据数组中的某个键值大小进行排序,仅支持二维数组 * * @param array $array 排序数组 * @param string $key 键值 * @param bool $a ...