Ajax与Http协议

本文深入讲解了Ajax模块在网络请求中的应用,包括创建Xhr对象、发出HTTP请求、接收及处理服务器回传的数据等核心步骤,并提供了详细的代码示例。同时探讨了同步与异步请求的区别及其对浏览器的影响。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1.ajax 模块在处理网络请求的时候包括以下四个步骤:

(1)创建Xhr对象

(2)发出HTTP请求

(3)接收服务器回传的数据

(4)更新网页数据

补充:ajax可以付出同步请求,也可以发出异步请求。

          但大多数情况下指的是异步请求,因为同步的ajax请求对浏览器会产生“阻塞效应”。

<?php

       var xhr= newXHLHttpRequest();

       xhr.onreadystatechange=function(){

          if(xhr,readyState==4){

               if(xhr.statuas==200){

                    console.log(JSON.panrse(xhr.responseText));

              }else{

                    console.error(xhr.statusText);

               }

        }

   }

   xhr.onerror=function(e){

             console.error(xhr.statusText);

   };

    xhr.open('GET','ajax.php',true);

    xhr.timeout=5000;

    xhr.send(null);


 2.

    在Ajax规则中,"请求"从创建到被发送需要至少经历如下几个步骤:
通过XMLHttpRequest类创建xhr对象
为xhr对象添加属性与回调方法
令xhr对象执行open()方法,指明请求被发往某处
令xhr对象执行send()方法,发出请求。

   

   3. xhr对象的常用属性与方法

            在整体感知中我们看到的例子中的属性和方法,基本都是要掌握的内容。或许有一些内容

     并没有体现在上面,但相信我他们都会是你今后离不开的东西。

          (1)onreadystate属性  语法:xhr.onreadystatechange=function(){};

          (2)readyState属性 语法: xhr.onreadystatechange=function(){

                                                      if(xhr.readyState==n){

                                                           //执行对应的函数

                                                       }

                                               }

             值为4,对应常量DONE,表示服务器数据已经完全接收,或者本次接收已经失败了。

          (3)status属性

                       语法:  if(xhr.readyState==n){

                                           if(xhr.status==200){

                                                //通信成功

                                           }

                                      }

                                    200是正常访问

                                  本属性是只读属性

          (4)statuesText属性

                               xhr.statusText

          (5)responseText属性

                               xhr.responseText

          (6)open()方法

                               xhr.open("请求类型’,'url地址’,‘是否异步’);

          (7)setRequestHeader()方法

          (8)send()方法

                         xhr.send(formData);

    4.xhr对象发送post请求

           var  formData=new FormData();

           formData.append('key',value);

           xhr.send(formData);


           var userName = document.querySelector('.userName').value;
    var password = document.querySelector('.password').value;
    var formData = new FormData();
    formData.append('userName',userName);
    formData.append('password',password);


  5. xhr 对象的兼容性问题

         标准浏览器支持的方法为:XMLHttpRequest()

         IE浏览器支持的方法为:ActiveXObject()

         if(window.XMLHttpRequest){

               xhr=new XMLHttpReuest();

         }else if(window.ActiveXObject();

         }

          可以直接使用三目运算符解决
    xhr = window.XMLHttpRequest?new XMLHttpRequest():new ActiveXObject("");

6. 请求超时timeout与超时监听ontimeout

           xhr.timeout=xxx;

           xhr.ontimeout=function(){

                         console.err('The request for'+url地址+‘timed out’);};

            xhr,time=5000;//5秒后超时

            xhr.ontimeout=function(){

                           console.error('The request for'+ajax.php+'timed  out.');

            };

7.登录post 请求实例

          原生的登录HTML:

                       <!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>登录</title>


</head>
<body>
  <label for='username'>
     <span>账户:</span><input type="text" id="username" 
     placeholder="请在此输入用户名"/>
   </label>
   <br/>
   <label for="password">
      <span>密码:</span><input type="text" id="password"
      placeholder="请在此输入密码"/>
   </label>
   <br/>
   <button>登录</button>
   <script type="text/javascript">
  var usernameInput = document.querySelector('#username');
var passwordInput = document.querySelector('#password');
var btn = document.querySelector('button');
btn.onclick = function (){
var username = usernameInput.value;
var password = passwordInput.value;
if(username.length==0||password.length==0){
alert('用户名或密码不能为空!!');
return;
}
//ajax
var xhr = new XMLHttpRequest();
xhr.onreadystatechange = function (){
if(xhr.readyState == 4){
if(xhr.status == 200){
var resObj = JSON.parse(xhr.responseText); 
// console.log(resObj);
if(resObj.code){
alert('登录成功,欢迎回来'+resObj.username);
}else{
alert('登录失败');
}
}else{
console.log(xhr.statusText);
}
}
};
//构造formData
var formData = new FormData();
formData.append('uname',username);
formData.append('upass',password);
//基本设置
xhr.open('post', 'denglu.php', true);
xhr.send(formData);
};
 
    </script>
  </body>
</html>

 原生的登录php:


<?php
  $success = array('msg'=>'OK');//code字段用来表示是否登录成功,1表示成功,0表示失败
$username = $_POST['uname'];
$password = $_POST['upass'];


//把数据库中所有的信息检索出来
$con = mysqli_connect('localhost','root','','studb');
if($con){
mysqli_query($con, 'set names utf8');
mysqli_query($con, 'set character_set_client=utf8');
mysqli_query($con, 'set character_set_results=utf8');
//
$sql = "select * from stud where 1";
$result = $con->query($sql);
//
if($result->num_rows>0){
$info = [];
for($i=0; $row=$result->fetch_assoc(); $i++){
$info[$i] = $row;
}


//判断逻辑,判断数组信息中是否有和用户发来的内容匹配的选项
$flag = 0;
for($j=0; $j<count($info); $j++){
if($info[$j]['stuName'] == $username){
if($info[$j]['stuAge'] == $password){
$flag = 1;
break;
}
}
}
$success['code'] = $flag;
//ps
if($flag){
$success['username'] = $username;
}
        }
}
          echo json_encode($success);

?>


 PDO 登录HTML:

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>pod登录</title>
</head>
<body>
<label for="username">
     <span>账户:</span><input type='text' id='username' placeholder='请在此输入用户名' value='lily'>
</label>
<br/>
<label for="password">
     <span>密码:</span><input type='text' id='password' placeholder='请在此输入密码' value='19'>
</label>
<br/>
<button>登录</button>
<script  type='text/javascript'>
    var usernameInput = document.querySelector('#username');
var passwordInput = document.querySelector('#password');
var btn = document.querySelector('button');
btn.onclick = function (){
var username = usernameInput.value;
var password = passwordInput.value;
if(username.length==0||password.length==0){
alert('用户名或密码不能为空!!');
return;
}


// ajax
var xhr = new XMLHttpRequest();
xhr.onreadystatechange = function (){
if(xhr.readyState == 4){
if(xhr.status == 200){
var resObj = JSON.parse(xhr.responseText); 
console.log(resObj);
if(resObj.code){
alert('登录成功,欢迎回来'+resObj.username);
}else{
alert('登录失败');
}
}else{
console.log(xhr.statusText);
}
}
};
//构造formData
var formData = new FormData();
formData.append('uname',username);
formData.append('upass',password);
//基本设置
xhr.open('post', 'poddenglu.php', true);
xhr.send(formData);
};   
       </script>
    </body>

</html>

PDO登录php:

<?php
       $success=array('msg'=>'OK');
       $username=$_POST['uname'];
       $password=$_POST['upass'];
       // 
       // $username='lily';
       // $password='19';


       class singletonPDO{
private static $pdo = null;
public static function getPdo (){
if(self::$pdo == null){
try {
self::$pdo = new PDO("mysql:host=localhost;dbname=studb","root","");
} catch (Exception $e) {
echo '出现错误:'.'<br/>';
echo $e->getMessage();
}
}
return self::$pdo;
}
}
    
$pdo = singletonPDO::getPdo();
$pdo->exec('set names utf8');
          $sql="select * from stud where 1";
          $pdoso=$pdo->prepare($sql);
          $pdoso->execute();


          $pdoso->bindColumn(1,$stuName);
          $pdoso->bindColumn(2,$stuGender);
          $pdoso->bindColumn(3,$stuAge);
          $pdoso->bindColumn(4,$stuNumber);
          $pdoso->bindColumn(5,$stuScroe);




          // echo "<pre>";
          $info=[];
          for($i=0; $pdoso->fetch(PDO::FETCH_COLUMN);$i++){
          $info[$i]=array($stuName, $stuGender, $stuAge, $stuNumber, $stuScroe);
          }


          $flag = 0;
for($j=0; $j<count($info); $j++){
if($info[$j][0] == $username){
if($info[$j][2] == $password){
$flag = 1;
break;
}
}
}
$success['code'] = $flag;
//ps
if($flag){
$success['username'] = $username;
}
          echo json_encode($success);
 ?>

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值