您现在的位置:首页 >> 前端 >> 内容

Ajax与Http协议的基础知识讲解

时间:2018/5/11 14:31:48 点击:

  核心提示:1.ajax 模块在处理网络请求的时候包括以下四个步骤:(1)创建Xhr对象(2)发出HTTP请求(3)接收服务器回传的数据(4)更新网页数据补充:ajax可以付出同步请求,也可以发出异步请求。 但大...

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);

 ?>

Tags:AJ JA AX X与 
作者:网络 来源:yllmyl的博客