AJAX基础教程

Posted 想做你的编译器

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了AJAX基础教程相关的知识,希望对你有一定的参考价值。

get请求

php文件:checkUSerName.php

<?php
$username = $_GET['username'];if($username == "zhangsan"){ echo "对不起,用户名已存在";}else{ echo "该用户名可以注册";}

html文件 添加window.onload才可以通过id,class等获取到js代码以后的HTML元素

<!DOCTYPE html><html lang="en"><head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <meta http-equiv="X-UA-Compatible" content="ie=edge"> <title>注册页面</title> <!-- ajax文件(夹)名不能为中文,否则不能实现功能 --> <script> window.onload = function(){ var u = document.getElementById("username"); var span = document.getElementById("span1"); u.onblur = function(){ var username = u.value; var xhr = new XMLHttpRequest(); xhr.open("get","checkUserName.php?username="+username,true);//true 表示异步(不等待返回值) // 发送请求 xhr.send(null);//get请求额 send参数为null  // 获取返回值状态 xhr.onreadystatechange = function(){ // 获取返回值 var result = xhr.responseText; span.innerHTML = result;  } } }</script>  </script></head><body> <form action="checkUserName.php" method="GET"> 用户名: <input type="text" name="username" id="username"><span id="span1"></span> <br/> 密 码: <input type="text" id="password"> <br/> <input type="submit"> </form></body></html>

post请求(可以不需要form标签)

php文件:checkUSerName.php<?php
$username = $_POST['username'];if($username == "zhangsan"){ echo "对不起,用户名已存在";}else{ echo "该用户名可以注册";}

HTML文件 (兼容完善)

<!DOCTYPE html><html lang="en">
<head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <meta http-equiv="X-UA-Compatible" content="ie=edge"> <title>z注册页面</title> <script> window.onload = function() { var func = document.getElementById("username"); var span = document.getElementById("span1"); func.onblur = function() { var username =func.value; // 第一步: 创建对象 var xhr = null; if (window.XMLHttpRequest) { //如果有window下XMLHttpRequest对象 xhr = new XMLHttpRequest(); } else { //IE6及一下的版本没有XMLHttpRequest对象 xhr = new ActiveXObject("Microsoft.XMLHTTP"); } //第二步: 准备发送 xhr.open("post", "checkUserName.php", true); var param = "username=" + username; // 设置xhr请求头信息: xhr.setRequestHeader("Content-type","application/x-www-form-urlencoded"); // 第三步: 执行发送 xhr.send(param); // 第四步: 处理请求 // readyState : 0 表示xhr对象创建完成 // 1 表示请求已经发送 // 3 表示正在解析数据 // 4 表示数据已经解析完成,可以使用了 //xhr.status http常见响应状态码 : // 200表示响应成功 404表示资源没找到 500表示服务器内部错误 xhr.onreadystatechange = function() { if (xhr.readyState == 4){ if(xhr.status==200){ var result = xhr.responseText;//有些数据是responseXML span.innerHTML = result; } } } } }</script></head>
<body>
用户名: <input type="text" name="username" id="username"><span id="span1"></span> <br/>
</body>
</html>

同步请求

php文件 checkUSerName.php

<?phpsleep(5);//模拟网络延迟5s后再执行下面的代码$username = $_POST['username'];if($username == "zhangsan"){ echo "对不起,用户名已存在";}else{ echo "用户名可以注册";}

HTML文件

<!DOCTYPE html><html lang="en"><head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <meta http-equiv="X-UA-Compatible" content="ie=edge"> <title>页面注册-同步请求</title> <script> window.onload = function(){ var username = document.getElementById("username"); var span = document.getElementById("span1"); username.onblur = function(){ var xhr = null;  if(window.XMLHttpRequest){ xhr = new XMLHttpRequest(); }else{ xhr = new ActiveXObject("Microsoft.XMLHTTP"); } console.log("--------1--"+xhr.readyState+"----------");//0 xhr.open("post","checkUserName.php",false);//false 表示同步 // 同步时在存在网络延迟的情况下,input输入框失去焦点后会卡在当前输入框, // 直到延迟(模拟5s)结束后才能继续进行其他操作 console.log("--------2--"+xhr.readyState +"----------");//1 var param = "username="+username.value; xhr.setRequestHeader("Content-type","application/x-www-form-urlencoded"); console.log("--------3--"+xhr.readyState +"----------");//1 xhr.send(param); var result = xhr.responseText; if(xhr.readyState == 4){ if(xhr.status == 200){ span.innerHTML = result; } } console.log("--------4--"+xhr.readyState+"----------");//4 // xhr.onreadystatechange = function(){//可以看到前面readyState状态已经是4了 // // 所以不会再执行回调函数了(state不会再change了),所以应该下面的代码拿到回调函数 之前 // console.log("--------5--"+xhr.readyState +"----------"); // var result = xhr.responseText; // if(xhr.readyState == 4){ // if(xhr.status == 200){ // span.innerHTML = result; // } // } // } } }</script></head><body> 用户名: <input type="text" id="username" name="username"> <span id="span1"></span><br>  密 码: <input type="text"></body></html>

ajax-解析xml数据

getBookList.php文件

<?php header('content-type:text/xml;charset=utf-8');//设置响应头信息 保证浏览器可以把相应的内容设置为xml文件类型$arr =array();$arr[0] = ["author"=>"施耐庵","name"=>"《水浒传》","desc"=>"108汉子"];$arr[1] = ["author"=>"吴承恩","name"=>"《西游记》","desc"=>"西天取经的故事"];
include ("bookList.xml");//引入xml文件?>

bookList.xml文件

<?xml version="1.0" encoding="UTF-8"?><bookList> <?php  foreach($arr as $k => $v){ ?>  <book> <author><?php echo $v['author']?></author>  <name><?php echo $v['name'] ?></name> <desc><?php echo $v['desc']?></desc> </book> <?php }?></bookList>

bookList.html文件

<!DOCTYPE html><html lang="en"><head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <meta http-equiv="X-UA-Compatible" content="ie=edge"> <title>通过xml数据格式获取书单列表</title> <script> window.onload = function(){ var xhr = new XMLHttpRequest(); xhr.open("get","getBookList.php",true); xhr.send(null); xhr.onreadystatechange = function(){ if(xhr.readyState == 4){ if(xhr.status == 200){ var result = xhr.responseXML; var books = result.getElementsByTagName("bookList")[0].getElementsByTagName("book"); var newHtml = document.getElementById("table").innerHTML; for(var i=0;i<books.length;i++){ var itemBook = books[i]; var author =itemBook.getElementsByTagName("author")[0].textContent; var name = itemBook.getElementsByTagName("name")[0].textContent; var desc = itemBook.getElementsByTagName("desc")[0].textContent; var tempHtml = "<tr><td>"+author+"</td><td>"+name+"</td><td>"+desc+"</td></tr>"; newHtml+=tempHtml; console.log(newHtml);  } document.getElementById("table").innerHTML = newHtml; } } } }</script> <style> table{ border:solid; margin: auto; width: 60%; text-align: center; border-collapse: collapse; /* border-spacing: 0; 或者此语句 也可以去掉表格外层边框*/  } table tr th,td{ border: solid 1px; border-collapse: separate;  }</style></head><body>  <table id="table"> <tr> <th>作者</th> <th>书名</th> <th>描述</th> </tr>  <tr> <td>罗贯中</td> <td>《三国演义》</td> <td>一个战争征伐的年代</td> </tr> </table></body></html>

ajax-解析json数据格式

json数据可以放在php文件中或者php文件中,当然也可以直接在js文件中

js文件

var employees = [{ "firstName":"Bill" , "lastName":"Gates" },{ "firstName":"George" , "lastName":"Bush" },{ "firstName":"Thomas" , "lastName": "Carter" }];

getStudent.php文件

[ { "name":"zhangsan", "id":"1001", "sex":"男" }, { "name":"wangwu", "id":"1002", "sex":"女" }]student.json文件[ { "name":"zhangsan", "id":"1001", "sex":"男" }, { "name":"wangwu", "id":"1002", "sex":"女" }]

studen.html文件

<!DOCTYPE html><html lang="en">
<head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <meta http-equiv="X-UA-Compatible" content="ie=edge"> <title>ajax解析json格式数据</title> <style> table { border: solid 2px; border-collapse: collapse; margin: auto; width: 980px; text-align: center; } table th { border: solid; font-size: 30px; color: red; } table td { border: solid; }</style> <script> window.onload = function() { var xhr = new XMLHttpRequest(); xhr.open("get", "student.json", true);//第二个参数也可以是json格式的php文件 xhr.send(null); xhr.onreadystatechange = function() { if(xhr.readyState == 4){ if(xhr.status == 200){ var result = xhr.responseText; var data = JSON.parse(result); // console.log(data); var newHtml = document.getElementById("table").innerHTML; for(var i=0;i<data.length;i++){ var item = data[i]; var name = item.name; var id = item.id; var sex = item.sex; // console.log(name); var tempHtml = "<tr><td>"+name+"</td><td>"+id+"</td><td>"+sex+"</td></tr>"; newHtml+=tempHtml; } document.getElementById("table").innerHTML = newHtml; } } } }</script></head>
<body> <table id="table"> <tr> <th>name</th> <th>id</th> <th>sex</th> </tr> <tr> <td>1</td> <td>2</td> <td>3</td> </tr> </table></body>
</html>

jquery-ajax

<!DOCTYPE html><html><head><meta charset="utf-8"><title>用户注册界面</title><script type="text/javascript" src="./js/jquery-3.4.0.js"></script><script type="text/javascript"> $(document).ready(function(){var username=document.querySelector("#username");$("#username").blur(function(){console.log("username");var usernameValue=username.value;var type="get";var url="checkUsername.php";var params="uname="+usernameValue;$.ajax({url:url,//被注释掉的都有默认值,可以不是必须得// type:type,data:{uname:usernameValue},// async:true,// dataType:"text",success:function(result){var spanResult=document.querySelector("#span01");if(result=="ok"){spanResult.innerText="可以注册";}else{spanResult.innerText="已注册";}}})}) });</script></head><body>用户名:<input type="text" name="" id="username"><span id="span01"></span><br>邮 箱:<input type="text" name=""></body></html>

php文件

<?php$uname=$_GET["uname"];if ($uname=="zhangsan") {echo "error";}else{echo "ok";} ?>

同源策略

同源条件:域名,端口,协议(常见http和https协议)都相同

ajax是为获取自己服务器的数据

跨域是为了获取其他服务器的数据

跨域

html文件

 跨域实现步骤 一、定义传输数据方法(必须在引入文件前定义) <script> function foo(data){ console.log(data); }</script> 二、引入跨域文件,开始执行跨域文件内的方法 src里包含的资源路径可以不是同源(可以使任何服务器的) <script src="param.php?name=zhangsan"></script>

param.php文件

<?php
$str = $_GET['name'];if($str == "zhangsan"){ echo 'foo("成功")';//php文件中调用js方法 // 这里不能直接 echo "成功"; // 会报错param.php?name=zhangsan:1 Uncaught ReferenceError: 成功 is not defined}else{ echo 'foo("失败")';}

跨域本质1-动态创建script标签

html文件

<!DOCTYPE html><html lang="en"><head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <meta http-equiv="X-UA-Compatible" content="ie=edge"> <title>Document</title></head><body> 跨域本质就是动态创建script标签 <script> function foo(data){ console.log(data); }</script> <!-- <script ></script> --> <script> window.onload = function(){ var btn = document.querySelector("#btn"); var head = document.querySelector("head");  btn.onclick = function(){  var cityName = document.getElementById("city").value;  var script = document.createElement("script"); script.src = "for_data.php?city="+cityName;   head.appendChild(script);  console.log(cityName);  } }</script> 请输入城市名称:<input type="text" id="city" ><button id="btn">查询</button></body></html>

for_data.php文件

<?php$city = $_GET['city'];if($city == "beijing"){ echo "foo('北京天气晴')";}else{ echo 'foo("无此城市天气")';}

跨域本质2-动态指向回调函数

html文件

 跨域本质 动态创建回调函数 <script> window.onload = function(){ var btn = document.querySelector("#btn"); var head = document.querySelector("head");  btn.onclick = function(){  var cityName = document.getElementById("city").value;  var script = document.createElement("script"); script.src = "for_data.php?city="+cityName+"&callback=foo2";   window["foo2"] = function(data){ console.log(data); } head.appendChild(script);  console.log(cityName);  } }</script> 请输入城市名称:<input type="text" id="city" ><button id="btn">查询</button>

php文件

<?php$callback = $_GET['callback'];$city = $_GET['city'];if($city == "beijing"){ echo $callback."('北京天气晴')";}else{ echo $callback.'("无此城市天气")';}

jquery跨域

$.ajax({ url:www...,//其他服务器接口地址 data:{ unname:"zhangsan", age:18, }, success:function(data){ console.log(data) }, dataType:"jsonp",//跨域数据格式jsonp,JSON with Padding,可以让网页从别的域名(网站)那获取资料,即跨域读取数据。 jsonp:"cb",//回调函数名称,默认值是callback jsonpCallback:"haha",//非必要,返回函数名称(或返回集合名称),默认值是jQuery});


以上是关于AJAX基础教程的主要内容,如果未能解决你的问题,请参考以下文章

Spring MVC 3.2 Thymeleaf Ajax 片段

AJAX基础教程

html PHP代码片段: - AJAX基本示例:此代码演示了使用PHP和JavaScript实现的基本AJAX功能。

JQuery中ajax的简单使用教程(附带实例代码)

AJAX相关JS代码片段和部分浏览器模型

jstl标签库基础教程及其使用代码