学习Jquery中的ajax,我们借助官方文档
$.ajax(url,[settings]) | jQuery API 3.2 中文文档 | jQuery API 在线手册
使用$.ajax()方法完成图书案例
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>Document</title>
<style>
.container {
width: 350px;
min-height: 150px;
background: pink;
margin: 50px auto;
}
</style>
</head>
<body>
<!-- 需求分析:给出指定的图书编码,通过发送get请求的方式,获取到该图书的相关信息,并渲染页面 -->
<div class="container">
<span>图书编码:</span>
<input type="text" id="code" />
<input type="button" value="查询" id="btn" />
<div id="info"></div>
</div>
<script src="jquery.js"></script>
<script>
$(function () {
$('#btn').click(function () {
$.ajax({
type: 'get',
url: 'http://localhost:3333/get/book',
data: {
code: $('#code').val()
},
dataType: 'json',
success(data) {
// console.log(data);
if (data.error != 0) {
var htmlStr = `<ul>`;
$.each(data, (key, val) => {
htmlStr += `<li>${key}:${val}</li>`;
});
htmlStr += '</ul>';
$('#info').html(htmlStr);
} else {
$('#info').html(data.msg);
}
}
});
});
});
</script>
</body>
</html>
action,method,target,enctype
代码演示:相关属性
<form action="submit.html" target="_self" method="get" enctype="multipart/form-data">
<label>
<p>用户名: <input type="text" name="username">
</p>
</label>
<label>
<p>密码: <input type="password" name="password">
</p>
<button>提交数据</button>
</label>
</form>
原生方法
<script>
var form = document.querySelector("#form")
form.addEventListener("submit", function (e) {
console.log("提交了数据");
e.preventDefault()
})
</script>
jQuery中的方法
<script>
$(function () {
// $("#form").submit(function (e) {
// console.log("提交了数据");
// e.preventDefault()
// })
$("#form").on('submit', function (e) {
console.log("提交了数据");
e.preventDefault()
})
})
</script>
对应UI结构如下
<form id="form" action="submit.html" method="post" target="_self" enctype="multipart/form-data">
<label>
用户名:
<input type="text" name="username" id="username">
</label>
<label>
密码:
<input type="password" name="password" id="password">
</label>
<input type="radio" name="gender" value="男">男
<input type="radio" name="gender" value="女">女
<input type="radio" name="gender">
<input type="checkbox" value="游泳" name="checkbox" class="hobby">游泳
<input type="checkbox" value="看书" name="checkbox" class="hobby">看书
<input type="checkbox" value="敲代码" name="checkbox" class="hobby">敲代码
<select name="city" id="">
<option value="请选择">请选择</option>
<option value="帝都">帝都</option>
<option value="魔都">魔都</option>
<option value="酆都">酆都</option>
<option value="妖都">妖都</option>
</select>
<button>提交</button>
</form>
使用serialize()函数,此方法必须给需要获取的form的表单里面的元素添加name值
// 2.使用serialize()函数,此方法必须给需要获取的form的表单里面的元素添加name值
var data = $("#form").serialize()
console.log(data);
返回结果是这样:
username=zhangsan&password=123456&checkbox=%E6%B8%B8%E6%B3%B3&checkbox=%E7%9C%8B%E4%B9%A6&checkbox=%E6%95%B2%E4%BB%A3%E7%A0%81
清空表单数据.reset()方法可以清空表单的值,但是这个方法是一个js方法,需要将使用对象进行转换。
$(function () {
$("#form").on('submit', function (e) {
e.preventDefault()
var data = $("#form").serialize()
console.log(data);
$("#form").get(0).reset()
})
})
表单提交,是formData格式,常用于图片,文件等资源。可以在提交验证时阻止默认行为。按钮提交用ajax对请求数据格式进行封装。
form表单能直接通过action属性设置提交地址,没有跨域问题,如果你直接用click提交那就是ajax,无法跨域的
Ajax 只能向自己的服务器发送请求。比如现在有一个A网站、有一个B网站,A网站中的 HTML 文件只能向A网站服务器中发送 Ajax 请求,B网站中的 HTML 文件只能向 B 网站中发送 Ajax 请求,但是 A 网站是不能向 B 网站发送 Ajax请求的,同理,B 网站也不能向 A 网站发送 Ajax请求
同源策略是浏览器的一种安全策略,所谓同源指的是请求URL地址中的协议、域名和端口都相同,只要其中之一不相同就是跨域
同源策略主要为了保证浏览器的安全性
同源政策是为了保证用户信息的安全,防止恶意的网站窃取数据。最初的同源政策是指A网站在客户端设置的 ? Cookie,B网站是不能访可的。
随着互联网的发展,同源政策也越来越严格,在不同源的情况下,其中有一项规定就是无法向非同源地址发送 ? Ajax请求,如果请求,浏览器就会报错。
在同源策略下,浏览器不允许Ajax跨域获取服务器数据
代码验证同源策略
准备2台服务器,serve1与serve2,其中1号服务器监听3007端口,2号服务器监听3008端口
jsonp
document.domain+iframe
location.hash + iframe
window.name + iframe
window.postMessage
flash等第三方插件
cors
实际上就是绕过浏览器的同源限制,向非同源服务器发送请求
jsonp是 json with padding的缩写,它不属于Ajax请求,但它可以模拟Ajax请求。
代码演示
<script type="text/javascript">
// 要写在函调调用之前
function fn(data) {
console.log("客户端的fn函数被调用了")
console.log(data)
}
</script>
<script type="text/javascript" src="http://localhost:3008/test02"></script>
后端返回一个函数名+() 括号中放点参数
fn( {a :10})
虽然我们已经实现了,jsonp请求,但是这个请求是在页面一加载的时候就实现的,我们希望可以将请求变成动态形式,比如,当我们点击一个按钮的时候,才发送jsonp请求,我们的做法如下:
将 script请求的发送变成动态请求。
<head>
<meta charset="UTF-8">
<title>Document</title>
<script>
function fn(data) {
console.log(data.username, data.password);
// fn({"username":"zhangsan","password":"123456"})
}
</script>
</head>
<body>
<button id="btn">点击发送请求</button>
<script type="text/javascript">
window.onload = function () {
var btn = document.getElementById("btn")
btn.onclick = function () {
var script = document.createElement('script');
script.src = 'http://localhost:3008/test03'
var head = document.getElementsByTagName('head')[0];
head.appendChild(script);
//监听script标签,并删除
script.onload = function () {
head.removeChild(script)
}
}
}
</script>
</body>
客户端需要将函数名称传递到服务器端
var btn = document.getElementById("btn")
btn.onclick = function () {
var script = document.createElement('script');
script.src = 'http://localhost:3008/test04?callback=fn'
var head = document.getElementsByTagName('head')[0];
head.appendChild(script);
//监听script标签,并删除
script.onload = function () {
head.removeChild(script)
}
jsonp的本质就是动态创建script标签,然后通过src属性向服务端发送跨域请求
?通过响应的内容来调用咱们事先定义好的函数方法,从而通过函数的参数,得到服务端响应的数据。
?注意,客户端得到的有一个函数调用
?服务器响应的内容是【函数调用】 所谓的函数调用就是函数名字加括号,中间存点参数fn(实参)
<head>
<meta charset="UTF-8">
<title>Document</title>
<script type="text/javascript" src="./jquery.js"></script>
<script type="text/javascript">
$(function () {
$("#btn").click(function () {
$.ajax({
type: "get",
url: "http://localhost:3008/test05",
dataType: 'jsonp', //指定类型
jsonpCallback: "hello", //指定函数名字
success: function (data) {
console.log(data);
},
error: function () {
console.log("failure");
}
})
});
});
</script>
</head>
<body>
<input type="button" value="点击" id="btn">
</body>
用户在输入框中连续输入一串字符时,可以通过防抖策略,只在输入完后,才执行查询的请求,这样可以有效减 少请求次数,节约请求资源;
1. ?var timer = null // 1.定义防抖标识
2. ?定义防抖函数
3. ?触发keyup事件时,立即清timer
节流策略( throttle),顾名思义,可以减少段时间内事件的触发频率
①鼠标连续不断地触发某事件(如点击),只在单位时间内只触发一次; ②懒加载时要监听计算动条的位置.但不必每次滑动都觖发,可以降低计算的频率,而不必去浪费CPU资源:
高铁卫生间是否被占用,由红绿灯控制,红灯表示被占用,绿灯表示可使用。
假设每个人上卫生间都需要花费5分钟,则五分钟之内,被占用的卫生间无法被其他人使用
上一个人使用完毕后,需要将红灯重置为绿灯,表示下—个人可以使用卫生间
下—个人在上卫生间之前,需要先判断控制灯是否为绿色,来知晓能否上卫生间。
节流阀为空,表示可以执行下次操作;不为空,表示不能执行下次操作。
当前操作执行完,必须将节流阀重置为空,表示可以执行下次操作了。
每次执行操作前,必须先判断节流阀是否为空
防抖:如果事件被频繁触发,防抖能保证只有最后一次触发生效!前面N多次的触发都会被忽略!
节流:如果事件被频繁触发,节流能够减少事件触发的频率,因此,节流是有选择性地执行部分事件!
CORS:全称为 Cross-origin resource sharing,即跨域资源共亨,它允許浏览器向跨域服务器发送Ajax请求克服了Ajax只能同源使用的限制。
// // 设置允许跨域访问该服务
app.all('*', function (req, res, next) {
? res.header("Access-Control-Allow-Origin", "*");
? res.header('Access-Control-Allow-Methods', 'PUT, GET, POST, DELETE, OPTIONS');
? res.header("Access-Control-Allow-Headers", "X-Requested-With,Content-Type,mytoken");
? next();
});
原理:同源政策是浏览器给予Ajax技术的限制,服务器端是不存在同源政策跟制
我们可以先让自己的服务器去访问服务器端数据,当我们需要数据时,在去请求自己的服务器,规避了ajax直接请求服务器。此方法需要使用request模块。
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
</head>
<body>
<button>存数据</button>
<button>取数据</button>
<button>删除数据</button>
<button>清空数据</button>
<br>
<input type="text" id="username">
<script>
var username = document.getElementById("username")
var btns = document.querySelectorAll("button")
// 存用户名 username data
// sessionStorage
// 注意事项:
// 1.同一个域
// 2.在浏览器不关闭的情况下使用
// 3.可存储大小 大概 在5M左右
// localStorage
// 注意事项:
// 1.同一个域
// 2.在浏览器关闭的情况同样可以继续使用
// 3.可存储大小 大概 在20M左右
btns[0].onclick = function () {
var data = username.value
localStorage.setItem("username",data)
}
// 取用户名
btns[1].onclick = function () {
var data = localStorage.getItem("username")
console.log(data);
}
// 删除用户名
btns[2].onclick = function () {
localStorage.removeItem("username")
}
// 全部清空
btns[3].onclick = function () {
localStorage.clear();
}
</script>
</body>
</html>