批改状态:合格
老师批语:原生的Ajax虽然麻烦, 但是从底层让大家对异步执行有了更加深入的了解, 远比直接学习$.ajax()要棒的多
使用JavaScript代码来代理用户发起的HTTP请求 称为异步请求 Ajax
AJAX请求的步骤
创建请求对象
监听成功回调
设置请求参数
发送AJAX请求
Ajax-GET 请求数据
通过用户输入的信息,使用Ajax-GET的方式来获取服务器脚本传过来的对应的数据。
在前端通过判断来把对应的数据显示到网页上
<!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-GET</title>
</head>
<body>
<p>
<label for="userid">用户ID:</label>
<input type="text" id="userid" name="userid" autocomplete="off" >
<!-- autocomplete="off" 关闭文本框记录历史输入数据 -->
</p>
<p id="tips"></p>
<script>
// 获取id输入框
var input = document.getElementById('userid');
// 获取提示信息tips
var tips = document.getElementById('tips');
// AJAX 对象
// 1.创建:请求对象
var request = new XMLHttpRequest();
// 给Input设置事件监听
input.addEventListener('keypress', keyEnter, false);
function keyEnter(event) {
console.log(event.target.value);
// 判断当前按键是否是Enter键
if ( event.key === 'Enter' ) {
// 判断当前输入的内容
switch ( true ) {
// 判断当前输入的内容不能为空
case input.value.length === 0:
tips.innerHTML = "<span style='color:red';>ID不能为空!</span>"
return false;
// 当前输入内容只能是整数
case isNaN(input.value):
tips.innerHTML = "<span style='color:red';>ID必须是一个整数!</span>"
return false;
//当数据全部合法后,进入AJAX异步执行
default:
// 2.监听:成功回调
request.addEventListener( 'readystatechange', successCallback, false );
// 3.设置:请求参数
// request.open(请求类型, 请求的服务器上的处理脚本程序, 是否是异步执行);
// 请求类型:GET POST
// 是否异步:true false
// 给数据进行编码处理
// encodeURIComponent()
var valueData = encodeURIComponent(input.value);
request.open( 'GET', 'php/user.php?userid='+valueData, true );
// 4.发送:异步请求
// GET请求默认为null,不用传参
// POST请求需要传参
request.send(null);
}
}
// 成功回调函数
function successCallback(event) {
console.log(event.target);
// 如果readyState的值等于4,就说明请求成功,则返回获取的数据插入到页面中
// responseText 获取脚本程序返回的文本数据
if (event.target.readyState === 4) {
tips.innerHTML = event.target.responseText;
}
}
}
// 设置输入框事件
// 当输入的ID发生变化是,自动删除tips里已经获取到的数据
input.addEventListener('input', function (event) {
tips.innerText = null;
},false);
</script>
</body>
</html>点击 "运行实例" 按钮查看在线实例
Ajax-POST 发送数据、请求数据
POST方式与GET不同
使用POST方式发送请求数据,需要先设置请求头(内容的类型,发送数据的格式)
request.setRequestHeader('内容类型', '发送数据的格式')
GET发送请求可以为空。POST则必须传值
<!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-POST</title>
</head>
<body>
<h2>用户登录</h2>
<form action="" name="login">
<p>
<label for="username">帐号:</label>
<input type="text" name="username" id="username" placeholder="输入邮箱或手机号">
</p>
<p>
<label for="password">密码:</label>
<input type="password" name="password" id="password" placeholder="输入密码">
</p>
<p>
<label for="email">邮箱:</label>
<input type="email" name="email" id="email" placeholder="admin@php.cn">
</p>
<p>
<label for="remember">记住我:</label>
<select name="remember" id="remember">
<option value="1" name="day" selected>一天</option>
<option value="7" name="week">一周</option>
<option value="30" name="month">一个月</option>
</select>
</p>
<p>
<button type="button" name="submit">登录</button>
</p>
</form>
<script>
// 获取相关的表单元素
// 获取form表单
var loginForm = document.forms.namedItem('login');
// 获取from下的元素节点
// 获取帐号文本框
var userName = loginForm.username;
// 获取密码文本框
var passWord = loginForm.password;
// 获取邮箱文本框
var email = loginForm.email;
// 获取记住我 下拉框
var remember = loginForm.remember;
// console.log(userName);
//获取按钮
var button = loginForm.submit;
// 创建AJAX对象
var request = new XMLHttpRequest();
// 对表单进行数据验证
// 验证表单内容不能为空
// 验证用户名不能为空
userName.addEventListener('blur', noEmpty, false);
// 验证邮箱不能为空
passWord.addEventListener('blur', noEmpty, false);
// 验证密码不能为空
email.addEventListener('blur', noEmpty, false);
// 非空验证方法
function noEmpty(event) {
console.log(event.target.value.length);
// 判断如果输入的内容为空,则显示提示信息
if ( event.target.value.trim().length === 0 ) {
// 创建动态提示信息
// 判断当前要插入提示信息的位置,有没有数据,如果有就不执行,如果没有就创建提示信息
if (event.target.nextElementSibling === null) {
var tips = document.createElement('span');
// 给提示信息添加样式
tips.style="color:red; font-size:12px;"
// 根据事件目标设置提示信息
console.log(event.target.name);
// event.target.name获取当前点击控件的name值
switch (event.target.name) {
// name值等于username,则插入账号不能为空
case 'username':
tips.innerText = '*帐号不能为空'
break;
// name值等于password,则插入密码不能为空
case 'password':
tips.innerText = '*密码不能为空'
break;
case 'email':
tips.innerText = '*邮箱不能为空'
break;
default:
tips.innerText = '未知错误'
}
// 将span元素 提示信息添加到页面中
// 插入到input的父级节点下
event.target.parentNode.appendChild(tips);
}
// 将焦点锁定到错误数据上
event.target.focus();
}
}
// 当用户输入内容后,清除提示信息
console.log(document.getElementsByTagName('span')[1]);
loginForm.addEventListener('input', function (event) {
// span 标签 = 当前点击文本框的下一个兄弟节点
var span = event.target.nextElementSibling;
// 如果不为空,则清除提示信息
if (span !== null) {
span.innerText = "";
// span.parentNode.removeChild(span)
}
},false);
// AJAX验证
// 给提交按钮添加一个点击事件
console.log(button);
// 获取页面中所有的input
var input = document.getElementsByTagName('input');
button.addEventListener('click', check, false);
function check(event) {
// 当没有输入内容的时候,禁止提交
console.log(userName);
if ( userName.value.length === 0 || passWord.value.length === 0 || email.value.length === 0 ) {
// 当输入内容为空,移除点击事件
button.removeEventListener('click', check, false);
// 事件模拟器当用户没有输入内容就点击提交按钮后,自动焦点到第一个文本框
var blurEvent = new Event('blur');
// userName.dispatchEvent(blurEvent);
// 循环给每个为空的文本框添加失去焦点事件
for (var i = 0; i < input.length; i++) {
console.log(input[i]);
// 判断内容为空的文本框
if (input[i].value.length === 0) {
input[i].dispatchEvent(blurEvent);
}
}
return false;
}
// 监听成功回调
request.addEventListener('readystatechange', successCallback, false);
// 设置请求参数
request.open('POST', 'php/check.php', true);
// 因为是POST,要设置请求头。模拟表单数据格式进行发送 键值对
// request.setRequestHeader('内容类型', '发送数据的格式');
request.setRequestHeader('content-type', 'application/x-www-form-urlencoded;charset=utf-8');
// 发送AJAX请求
// 请求值就是键值对的格式
var data = 'username='+userName.value+'&password='+passWord.value+'&email='+email.value+'&remember='+remember.value;
request.send(data);
}
// 成功回调函数
function successCallback(event) {
if ( request.readyState === 4 ) {
console.log(request.responseText);
}
}
</script>
</body>
</html>点击 "运行实例" 按钮查看在线实例
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号