Blogger Information
Blog 36
fans 4
comment 3
visits 31901
Popular Tutorials
More>
Latest Downloads
More>
Web Effects
Website Source Code
Website Materials
Front End Template
7.16 原生JS AJAX GET与原生JS AJAX POST 请求数据
大灰狼的博客
Original
766 people have browsed it

原生JS AJAX GET

练习了3遍还是不能默写出来~感觉真的要练习很多遍的样子还好原理是完全懂了。

什么是AJAX ?
AJAX 最大的优点是在不重新加载整个页面的情况下,可以与服务器交换数据并更新部分网页内容。( 比如你打开邮箱 并没有刷新网页,但是有新邮件会弹窗提示。比如你个人中心页面并没有刷新 有新通知会提示。类似的网页都是使用了ajax向服务器请求部分数据。)

我们网页一般发送数据分为GET和POST 两种 ajax都支持。
get方式呢 就是把要产送的数据在网址参数和值成对传递比如下图

1.png

ajax get流程

1 创建请求对象

var XHR=new XMLHttpRequest();

 2 监听 成功回调 break;

XHR.addEventListener('readystatechange',successCallback,false);

3 设置请求参数

 格式XHR.open(请求类型,请求的服务器上的处理脚本,是否异步请求)

因为是get请求所有参数在url上 但是参数转码才安全 所以先进行转码

var data=encodeURIComponent(input.value);

发送的数据会拼接到网址上传送

XHR.open('GET','php/user_info.php?user_id='+data,true);

4 发送:异步请求 因为是get方式 所以发送的数据位null

XHR.send(null);


实例

<!DOCTYPE html>
<html>
	<head>
		<meta charset="UTF-8">
		<title>7.16原生js的AJAX-GET</title>
	</head>
	<body>
		<div class="wrap">
			<label for="user_id">用户名</label>
			<input type="text" name="user_id" id="user_id" value="" />
			<p id='tips'></p>
			
			
		</div>
		<script type="text/javascript">
			//获取输入框元素
			var input=document.getElementById('user_id');
			//获取提示框元素
			var tips=document.getElementById('tips');
			
			//1 创建请求对象
			var XHR=new XMLHttpRequest();
			//给input添加键盘事件
			input.addEventListener('keypress',getUserInfo,false);
			//事件函数
			function getUserInfo (ev) {
				if (ev.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;
						default:
							// 2 监听 成功回调 break;
							XHR.addEventListener('readystatechange',successCallback,false);
							// 3 设置请求参数
							// 格式XHR.open(请求类型,请求的服务器上的处理脚本,是否异步请求)
							//因为是get请求所有参数在url上 但是参数转码才安全 所以先进行转码
							var data=encodeURIComponent(input.value);
							XHR.open('GET','php/user_info.php?user_id='+data,true);
							
							//4 发送:异步请求
							XHR.send(null);
					}
				}	
			}
			//成功回调函数
			function successCallback (ev) {
				//查看请求过程的状态
				console.log(ev.target);
				if(XHR.readyState===4){
					//查看确定返回值是否正确
					console.log(XHR.responseText)
					//把返回值插入到页面上 dom操作
					tips.innerHTML=XHR.responseText
				}
			}
			//添加一个input的事件 只要内容有变化就清空tips的提示信息。
			input.addEventListener('input',function(ev){
				tips.innerHTML=null;
			},false);
		</script>
	</body>
</html>

运行实例 »

点击 "运行实例" 按钮查看在线实例


服务器端php部分

<?php
$userId = isset($_GET['user_id']) ? $_GET['user_id'] : null;

$userInfo = [
    ['user_id'=>1, 'username'=>'苍老师', 'gender'=>'女', 'age'=>26],
    ['user_id'=>2, 'username'=>'波老师', 'gender'=>'女', 'age'=>23],
    ['user_id'=>3, 'username'=>'黑老师', 'gender'=>'男', 'age'=>33],
];

$res = '';
foreach ($userInfo as $user) {
    if ($user['user_id'] === intval($userId)) {
        $res .= $user['user_id'].'---'.$user['username'].'---'.$user['gender'].'---'.$user['age'];
    }
}

echo empty($res) ? '<span style="color: red;">没有找到该用户名</span>' : $res;
exit;



-------------------------------------------------------------------------分割线

2.png
ajax post 流程分为4个 不能乱!
1 创建ajax请求对象(xhr对象名字你喜欢就好 随便起)

var XHR=new XMLHttpRequest();

2 监听成功回调(失败了也得有个结果哈)

XHR.addEventListener('readystatechange', successCallback, false);

successCallback函数名可以自定义其他是固定格式

3 设置 请求参数 (键值对的方式传递 需要拼接)

XHR.open('POST', '/php/check.php', true);

//因为是post发送,需要设置请求头。 键值对

XHR.setRequestHeader('content-type','application/x-www-form-urlencoded;charset=utf-8');


4 发送 异步请求

先收集要发送的数据
var data = 'username='+username+'&password='+password+'&email='+email+'&remember='+remember;
发送数据
XHR.send(data);


实例

<!DOCTYPE html>
<html>
	<head>
		<meta charset="UTF-8">
		<title>7.16原生js的AJAX-POST</title>
	</head>
	<body>
		<div class="wrap">
			<h2>用户登录</h2>
			<form action="" method="post" name="login">
				<p>
					<label for="username">用户名 </label><input type="text" name="username" id="username" value="" />
				</p>
				<p>
					<label for="password">密   码 </label><input type="password" name="password" id="password" value="" />
				</p>
				<p>
					<label for="email">邮   箱 </label><input type="text" name="email" id="email" value="" />
				</p>
				<p>
					<label for="remember">级   别</label>
					<select name="remember" id="remember">
						<option value="1" name="day">一天</option>
						<option value="7" name="week">一星期</option>
						<option value="30" name="month">一个月</option>
					</select>
				</p>
				<input type="button" name="submit" value="提交" />
			</form>
			<script type="text/javascript">
				//获取需要处理的表单login
				var login=document.forms.namedItem('login');
				//获取到按钮
				var btn=login.submit;
				// 1 AJAX 创建  请求对象
				var XHR=new XMLHttpRequest();
				
				
				//前端开始啦 前端先验证数据 绑定事件来触发验证 。当输入域失去焦点 (blur) 
				login.username.addEventListener('blur',isEmpty,false);
				login.password.addEventListener('blur',isEmpty,false);
				login.email.addEventListener('blur',isEmpty,false);
				
				//非空验证
				function isEmpty(ev){
					if(ev.target.value.length===0){
						console.log(ev.target)
						//来验证非空提示
						if (ev.target.nextElementSibling===null) {
							var tips=document.createElement('span');
							tips.style.color='red';
							
							//判断一下那个为空 来提示
							switch (ev.target.name){
								case 'username':
									tips.innerText='用户名不存在';
									break;
								case 'password':
									tips.innerText='密码不能为空';
									break;
								case 'email':
								    tips.innerText='邮箱不能为空';
								    break;
								default:
									tips.innerText='未知错误 *** 写bug的大灰狼QQ12345'
									break;
							}
							//把错误提示添加到 追加到父元素的里面的后面
							ev.target.parentNode.appendChild(tips);
						} 
						//如果 失去焦点的元素内容为空 再次指定焦点到元素上
						ev.target.focus();
					}
				}
				
				//当input内容有改变 清空提示信息 先添加事件
				login.username.addEventListener('input',clearTips,false);
				login.password.addEventListener('input',clearTips,false);
				login.email.addEventListener('input',clearTips,false);
				
				//clearTips 清除提示函数
				function clearTips(ev){
					//拿到tips元素
					var tips=ev.target.nextElementSibling;
					if (tips!==null) {
						//移除提示信息 
						tips.remove();
					}
				};
				
				//4 ajax事件
				btn.addEventListener('click',check,false);
				
				//事件函数
				function check (ev) {
					//让数据调用方便一点 
					var username=login.username.value;
					var password=login.password.value;
					var email=login.email.value;
					var remember=login.remember.value;
					
					//当有必填框为空禁止提交
					if (username.Length===0 || password.length ===0 || email.length ===0) {
						//不让点击 应该移除点击事件
						btn.removeEventListener('click',check,false);
						//因为是空 所以模拟失去焦点 让焦点到输入框
						var blueEvent=new Event('blur');
						login.username.dispatchEvent(blueEvent);
						return false;
					}
					
					//2 监听 成功回调
					XHR.addEventListener('readystatechange', successCallback, false);
					
					//3 设置 请求的参数
					XHR.open('POST', '/php/check.php', true);
					
					//因为是post发送,需要设置请求头。 键值对
					XHR.setRequestHeader('content-type','application/x-www-form-urlencoded;charset=utf-8');
					    
					
					//4 发送:异步请求
					var data = 'username='+username+'&password='+password+'&email='+email+'&remember='+remember;
					XHR.send(data);
				}
				
				//成功回调函数
				function successCallback (ev) {
					if (XHR.readyState === 4) {
						console.log(XHR.responseText)
					}
				}
				
			</script>
		</div>
	</body>
</html>

运行实例 »

点击 "运行实例" 按钮查看在线实例


服务器端php部分

<?php
session_start();

// 获取表单提交的数据
$username = $_POST['username'];
$email = $_POST['email'];
$password = sha1($_POST['password']);
$remember = $_POST['remember'];

// 为简化代码,不用数据表验证,使用硬编码,只验证邮箱与密码
if ($email === 'admin@php.cn' && $password === sha1('123456')) {
    $_SESSION['username'] = $username;
    $_SESSION['email'] = $email;
    echo json_encode(['status'=>1, 'message'=>'验证成功']);
} else {
    echo json_encode(['status'=>0, 'message'=>'验证失败']);
}
exit;



Correction status:qualified

Teacher's comments:写得不错, 课堂案例多看看
Statement of this Website
The copyright of this blog article belongs to the blogger. Please specify the address when reprinting! If there is any infringement or violation of the law, please contact admin@php.cn Report processing!
All comments Speak rationally on civilized internet, please comply with News Comment Service Agreement
2 comments
大灰狼 2019-09-18 23:26:02
3Q。貌似你是第一个评论de~
2 floor
荼谧故人 2019-07-19 07:23:10
凌晨两点发的啊!保重身体啊!
1 floor
Author's latest blog post