JavaScript Ajax实现异步通信


Posted in Javascript onDecember 14, 2016

JavaScript Ajax实现异步通信

一、浏览器与服务器的同步和异步通信

1.同步:是阻塞的,浏览器在向服务器发送请求之后一直等待服务器的响应,而没有做其他事情。
2.异步:非阻塞的,浏览器向服务器发送请求之后,继续执行其他代码,知道服务器响应,浏览器中断当前的任务,处理服务器响应。

二、没有Ajax之前浏览器是通过iframe来实现异步刷新

1.iframe标签:iframe标签通过src连接到一个页面,其实就是将需要实现异步刷新的内容使用
iframe标签包裹,

A.对iframe实现整个页面刷新,其实是通过刷新一个页面的子页面来实现异步刷新;

a.主页面代码:

<div>通过实现子页面刷新来实现异步刷新</div>
<iframe src="../testphp/data.php" frameborder="0"></iframe>

b.php页面代码:

<?php
  echo 1;
?>

B.通过在刷新子页面的同时在子页面做一些操作来访问父页面元素并且修改该元素的内容

a.主页面代码:

<div id="refreshTarget"></div>
<form action="../php/data.php" method="post" target="targetIframe">
<input type="submit" value="提交">
</form>
<iframe name="targetIframe" frameborder="0">iframe</iframe>

b.php页面代码:

<?php
  echo 1;
?>
<script type="text/javascript">
  parent.document.querySelector('#refreshTarget').innerHTML = '刷新成功';
</script>

三、Ajax实现异步刷新

1.使用get方法来发送请求:

/**
 * 使用ajax get方式来验证用户名密码是否正确
 * 1.区别于表单,我们需要自己拼接查询字符串,不是表单提交,可
 * 以不为表单添加name属性
 * 2.将数据放在查询字符串中传到请求的页面,然后页面获得数据进
 * 行操作,然后对前端返回响应数据,解析数据,刷新
 */
var submit = document.querySelector('#submit');
submit.onclick = function(){
  var nameValue = document.querySelector('#username').value;
  var passValue = document.querySelector('#password').value;
  var target = document.querySelector('#refreshTarget');
  /* 实例化XMLHttpResquest*/
  var xhr = new XMLHttpRequest();

  /* 监控xhr对象的状态,只要xhr.readyState值改变就会触发事件由alert弹出框的值可以知道
    a.以下xhr.readyState值为4的时候表示请求响应结束,数据接收完毕并且可以使用
    b.xhr.status值为200表示请求成功
  */
  xhr.onreadystatechange = function() {
    alert(1);
    if(xhr.readyState == 4) {
      if(xhr.status == 200){
        var data = xhr.responseText;
        if(data == 1) {
          target.innerHTML = '验证成功';
        }else if(data == 2) {
          target.innerHTML = '验证失败';
        }
      }
    }
  }

  /* 打开请求*/
  var url = '../testphp/inspector.php?username='+nameValue + '&password='+ 
  passValue;

  xhr.open('get',url,true); // xhr.readyState = 1;

  /* 发送请求*/
  xhr.send(null); // xhr.readyState = 2;
  alert(2);
}

2.使用post方法来发送请求:

/**
 * 使用ajax post方式来验证用户名密码是否正确
 * 1.区别于表单,我们需要自己拼接查询字符串,不是表单提交,可
 * 以不为表单添加name属性
 * 2.将数据放在查询字符串中传到请求的页面,然后页面获得数据进
 * 行操作,然后对前端返回响应数据,解析数据,刷新
 * 3.区别于ajax,get方法就是数据是放在send发送不是添加到查询字符串
 */
var submit = document.querySelector('#submit');
submit.onclick = function(){
  var nameValue = document.querySelector('#username').value;
  var passValue = document.querySelector('#password').value;
  var target = document.querySelector('#refreshTarget');
  /* 实例化XMLHttpResquest*/
  var xhr = new XMLHttpRequest();

  /* 监控xhr对象的状态,只要xhr.readyState值改变就会触发事件由alert弹出框的值可以知道
    a.以下xhr.readyState值为4的时候表示请求响应结束,数据接收完毕并且可以使用
    b.xhr.status值为200表示请求成功
  */
  xhr.onreadystatechange = function() {
    alert(1);
    if(xhr.readyState == 4) {
      if(xhr.status == 200){
        var data = xhr.responseText;
        if(data == 1) {
          target.innerHTML = '验证成功';
        }else if(data == 2) {
          target.innerHTML = '验证失败';
        }
      }
    }
  }

  /* 打开请求*/
  var url = '../testphp/inspector.php?';

  xhr.open('post',url,true); // xhr.readyState = 1;

  /* 修改请求头模拟from表单的post提交,
  a.设置Content-type可以使得在php页面中$_POST[‘key']的方式来获取对应的值,不然的话必
  须在$HTTP_RAW_POST_DATA对象中获取
  b.设置'Content-type'既是使用类似表单方式提交数据,所以一下必须对send发送的数据序列
  化为‘name=name&value=value'的形式*/
  xhr.setRequestHeader('Content-type','application/x-www-form-urlencoded');

  var data = 'username='+nameValue+'&password='+passValue;

  /* 发送请求*/
  xhr.send(data); // xhr.readyState = 2;
}

请求的php页面代码

<?php
/* 设置响应数据的内容格式,和字符集*/
header('Content-type:text/html;charset=utf-8');

/*使用表单的post请求php页面中可以通过$_POST来获取*/
$username = $_POST['username'];
$password = $_POST['password'];

if($username == 'admin' && $password == '123'){
  echo 1;
}else{
  echo 2;
}

?>

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
在IE和VB中支持png图片透明效果的实现方法(vb源码打包)
Apr 01 Javascript
页面回到顶部的三种实现(锚标记,js)
Oct 01 Javascript
js实现将选中值累加到文本框的方法
Aug 12 Javascript
jquery+CSS3实现3D拖拽相册效果
Jul 18 Javascript
bootstrap日历插件datetimepicker使用方法
Dec 14 Javascript
BootStrap Table 设置height表头与内容无法对齐的问题
Dec 28 Javascript
Vue实例简单方法介绍
Jan 20 Javascript
深入理解Angularjs中$http.post与$.post
May 19 Javascript
DataTables添加额外的查询参数和删除columns等无用参数实例
Jul 04 Javascript
React Native之TextInput组件解析示例
Aug 22 Javascript
vue 自定义 select内置组件
Apr 10 Javascript
layui实现动态和静态分页
Apr 28 Javascript
微信小程序 配置文件详细介绍
Dec 14 #Javascript
微信小程序 闭包写法详细介绍
Dec 14 #Javascript
微信小程序 wx.uploadFile无法上传解决办法
Dec 14 #Javascript
bootstrap日历插件datetimepicker使用方法
Dec 14 #Javascript
详解jQuery停止动画——stop()方法的使用
Dec 14 #Javascript
实例解析Array和String方法
Dec 14 #Javascript
利用JavaScript实现拖拽改变元素大小
Dec 14 #Javascript
You might like
一周学会PHP(视频)Http下载
2006/12/12 PHP
关于二级目录拖拽排序的实现(源码示例下载)
2013/04/26 PHP
thinkphp 多表 事务详解
2013/06/17 PHP
PHP保留两位小数并且四舍五入及不四舍五入的方法
2013/09/22 PHP
Thinkphp关闭缓存的方法
2015/06/26 PHP
php数据库操作model类(使用__call方法)
2016/11/16 PHP
基于swoole实现多人聊天室
2018/06/14 PHP
解析JavaScript中的不可见数据类型
2013/12/02 Javascript
超精准的javascript验证身份证号的具体实现方法
2015/11/18 Javascript
jquery实现全屏滚动
2015/12/28 Javascript
JavaScript中的时间处理小结
2016/02/24 Javascript
基于jquery实现最简单的选项卡切换效果
2016/05/08 Javascript
vue 怎么创建组件及组件使用方法
2017/07/27 Javascript
本地存储localStorage用法详解
2017/07/31 Javascript
Vue2.0 组件传值通讯的示例代码
2017/08/01 Javascript
解决layer.msg 不居中 ifram中的问题
2019/09/05 Javascript
JavaScript函数IIFE使用详解
2019/10/21 Javascript
[47:42]Fnatic vs Liquid 2018国际邀请赛小组赛BO2 第一场 8.16
2018/08/17 DOTA
用Python编写一个简单的俄罗斯方块游戏的教程
2015/04/03 Python
Python中logging实例讲解
2019/01/17 Python
Python 串口读写的实现方法
2019/06/12 Python
python torch.utils.data.DataLoader使用方法
2020/04/02 Python
详解Windows下PyCharm安装Numpy包及无法安装问题解决方案
2020/06/18 Python
使用phonegap播放音频的实现方法
2017/03/31 HTML / CSS
英国网上花店:Bunches
2016/11/29 全球购物
英国电视和家用电器购物网站:rlrdistribution.co.uk
2018/11/20 全球购物
网络、C以及其他硬件方面的面试题
2016/08/23 面试题
关于Assembly命名空间的三个面试题
2015/07/23 面试题
编程输出如下图形
2013/11/24 面试题
小学教师的自我评价范例
2013/10/31 职场文书
环境工程专业个人求职信
2013/12/05 职场文书
经典促销广告词大全
2014/03/19 职场文书
教师考核评语大全
2014/12/31 职场文书
家庭暴力离婚起诉书
2015/05/18 职场文书
教你怎么用Python操作MySql数据库
2021/05/31 Python
OpenCV绘制圆端矩形的示例代码
2021/08/30 Python