$.ajax与同源策略

1.jQuery中的ajax请求

  • 学习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>

2.表单的相关事件

2.1form标签的属性

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>

2.2监听表单的提交事件与阻止表单提交跳转的默认行为

原生方法

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

2.3 获取以及清空表单中的数据

对应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()})})

2.4 使用submit按钮提交与普通按钮click提交的区别

  • 表单提交,是formData格式,常用于图片,文件等资源。可以在提交验证时阻止默认行为。按钮提交用ajax对请求数据格式进行封装。

  • form表单能直接通过action属性设置提交地址,没有跨域问题,如果你直接用click提交那就是ajax,无法跨域的

3.Ajax同源策略与跨域

3.1 Ajax的请求限制

  • Ajax 只能向自己的服务器发送请求。比如现在有一个A网站、有一个B网站,A网站中的 HTML 文件只能向A网站服务器中发送 Ajax 请求,B网站中的 HTML 文件只能向 B 网站中发送 Ajax 请求,但是 A 网站是不能向 B 网站发送 Ajax请求的,同理,B 网站也不能向 A 网站发送 Ajax请求

3.2 同源策略

  • 同源策略是浏览器的一种安全策略,所谓同源指的是请求URL地址中的协议、域名和端口都相同,只要其中之一不相同就是跨域

  • 假设现有服务器 :example123.com - 该网站正在出售! - example123 资源和信息。

example123.com - 该网站正在出售! - example123 资源和信息。域名不同
example123.com - 该网站正在出售! - example123 资源和信息。协议不同
http://www.example123.com:8080/detail.html端口不同
http://api.example123.com:8080/detail.html域名、端口不同
example123.com - 该网站正在出售! - example123 资源和信息。协议、域名不同
https://www.example123.com:8080/detail.html端口、协议不同
  • 同源策略主要为了保证浏览器的安全性

同源政策是为了保证用户信息的安全,防止恶意的网站窃取数据。最初的同源政策是指A网站在客户端设置的 ​ Cookie,B网站是不能访可的。

随着互联网的发展,同源政策也越来越严格,在不同源的情况下,其中有一项规定就是无法向非同源地址发送 ​ Ajax请求,如果请求,浏览器就会报错。

在同源策略下,浏览器不允许Ajax跨域获取服务器数据

  • 代码验证同源策略

准备2台服务器,serve1与serve2,其中1号服务器监听3007端口,2号服务器监听3008端口

3.3 跨域解决方案 相对安全

jsonp

document.domain+iframe

location.hash + iframe

window.name + iframe

window.postMessage

flash等第三方插件

cors

3.4.使用jsonp解决同源限制问题

  • 实际上就是绕过浏览器的同源限制,向非同源服务器发送请求

  • 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})

3.5 .jsonp优化

  • 虽然我们已经实现了,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)}

3.6 jsonp的本质 

jsonp的本质就是动态创建script标签,然后通过src属性向服务端发送跨域请求
 通过响应的内容来调用咱们事先定义好的函数方法,从而通过函数的参数,得到服务端响应的数据。
 注意,客户端得到的有一个函数调用
 服务器响应的内容是【函数调用】 所谓的函数调用就是函数名字加括号,中间存点参数fn(实参)

3.7.jQuery对jsonp的支持

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

4.0 防抖与节流

4. 1 什么是防抖?

image-20230422234546692

4.2 应用:

用户在输入框中连续输入一串字符时,可以通过防抖策略,只在输入完后,才执行查询的请求,这样可以有效减 少请求次数,节约请求资源;

1.  var timer = null // 1.定义防抖标识
2.  定义防抖函数
3.  触发keyup事件时,立即清timer

4.3 节流

节流策略( throttle),顾名思义,可以减少段时间内事件的触发频率

image-20230422234949011

4.4 节流应用场景

①鼠标连续不断地触发某事件(如点击),只在单位时间内只触发一次; ②懒加载时要监听计算动条的位置.但不必每次滑动都觖发,可以降低计算的频率,而不必去浪费CPU资源:

4.5 节流阀的概念

  • 高铁卫生间是否被占用,由红绿灯控制,红灯表示被占用,绿灯表示可使用。

  • 假设每个人上卫生间都需要花费5分钟,则五分钟之内,被占用的卫生间无法被其他人使用

  • 上一个人使用完毕后,需要将红灯重置为绿灯,表示下—个人可以使用卫生间

  • 下—个人在上卫生间之前,需要先判断控制灯是否为绿色,来知晓能否上卫生间。

  • 节流阀为空,表示可以执行下次操作;不为空,表示不能执行下次操作。

  • 当前操作执行完,必须将节流阀重置为空,表示可以执行下次操作了。

  • 每次执行操作前,必须先判断节流阀是否为空

4.6 总结防抖和节流的区别

  • 防抖:如果事件被频繁触发,防抖能保证只有最后一次触发生效!前面N多次的触发都会被忽略!

  • 节流:如果事件被频繁触发,节流能够减少事件触发的频率,因此,节流是有选择性地执行部分事件!

5.cors跨域资源共享

  • 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();
    });

6.访问非同源数据,服务器端解决方案

  • 原理:同源政策是浏览器给予Ajax技术的限制,服务器端是不存在同源政策跟制

  • 我们可以先让自己的服务器去访问服务器端数据,当我们需要数据时,在去请求自己的服务器,规避了ajax直接请求服务器。此方法需要使用request模块。

7.本地存储

<!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.valuelocalStorage.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>

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/643287.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

mc我的世界服务器多少钱一个月?

我的世界服务器多少钱一个月&#xff1f;低至7元一个月&#xff0c;阿里云和腾讯云均可以选择mc服务器&#xff0c;阿里云2核2G3M轻量服务器87元一年、腾讯云轻量2核2G3M服务器88元一年&#xff0c;阿里云ECS云服务器2核2G3M带宽99元一年&#xff0c;腾讯云2核4G5M带宽轻量应用…

RabbitMQ中交换机的应用 ,原理 ,案例的实现

&#x1f389;&#x1f389;欢迎来到我的CSDN主页&#xff01;&#x1f389;&#x1f389; &#x1f3c5;我是平顶山大师&#xff0c;一个在CSDN分享笔记的博主。&#x1f4da;&#x1f4da; &#x1f31f;推荐给大家我的博客专栏《RabbitMQ中交换机的应用及原理&#xff0c;案…

8.Gateway服务网关

3.Gateway服务网关 Spring Cloud Gateway 是 Spring Cloud 的一个全新项目&#xff0c;该项目是基于 Spring 5.0&#xff0c;Spring Boot 2.0 和 Project Reactor 等响应式编程和事件流技术开发的网关&#xff0c;它旨在为微服务架构提供一种简单有效的统一的 API 路由管理方式…

JVM工作原理与实战(二十五):堆的垃圾回收-垃圾回收算法

专栏导航 JVM工作原理与实战 RabbitMQ入门指南 从零开始了解大数据 目录 专栏导航 前言 一、垃圾回收算法介绍 1.垃圾回收算法的历史和分类 2.垃圾回收算法的评价标准 二、垃圾回收算法详解 1.标记清除算法 2.复制算法 3.标记整理算法 4.分代垃圾回收算法 总结 前言…

密码学的100个基本概念

密码学作为信息安全的基础&#xff0c;极为重要,本文分为上下两部分&#xff0c;总计10个章节&#xff0c;回顾了密码学的100个基本概念&#xff0c;供小伙伴们学习参考。本文将先介绍前五个章节的内容。 一、密码学历史 二、密码学基础 三、分组密码 四、序列密码 五、哈希…

生命在于折腾——WeChat机器人的研究和探索

一、前言 2022年&#xff0c;我玩过原神&#xff0c;当时看到了云崽的QQ机器人&#xff0c;很是感兴趣&#xff0c;支持各种插件&#xff0c;查询游戏内角色相关信息&#xff0c;当时我也自己写了几个插件&#xff0c;也看到很多大佬编写的好玩的插件&#xff0c;后来因为QQ不…

数据结构:搜索二叉树 | 红黑树 | 验证是否为红黑树

文章目录 1.红黑树的概述2.红黑树的性质3.红黑树的代码实现3.1.红黑树的节点定义3.2.红黑树的插入操作3.3.红黑树是否平衡 黑红树是一颗特殊的搜索二叉树&#xff0c;本文在前文的基础上&#xff0c;图解红黑树插入&#xff1a;前文 链接&#xff0c;完整对部分关键代码展示&a…

SG-8506CA 可编程晶体振荡器 (SPXO)

输出: LV-PECL频率范围: 50MHz ~ 800MHz电源电压: 2.5V to 3.3V外部尺寸规格: 7.0 5.0 1.5mm (8引脚)特性:用户指定一个起始频率, 7-bit I2C 地址:用户可编程: I2C 接口:基频的高频晶体:低抖动PLL技术应用:OTN, BTS, 测试设备 规格&#xff08;特征&#xff09; *1 这包括初…

Intel Atom + Artix-7 100T FPGA,CompactRIO单板控制器

模拟和数字I/O&#xff0c;RMC&#xff0c;DisplayPort&#xff0c;1.33 GHz双核CPU&#xff0c;1 GB DRAM&#xff0c;4 GB存储容量&#xff0c;Artix-7 100T FPGA&#xff0c;CompactRIO单板控制器 CompactRIO控制器是搭载了实时处理器和用户可编程FPGA的嵌入式控制器。其产…

Elasticsearch:聊天机器人、人工智能和人力资源:电信公司和企业组织的成功组合

作者&#xff1a;来自 Elastic Jrgen Obermann, Piotr Kobziakowski 让我们来谈谈大型企业人力资源领域中一些很酷且改变游戏规则的东西&#xff1a;生成式 AI 和 Elastic Stack 的绝佳组合。 现在&#xff0c;想象一下大型电信公司的典型人力资源部门 — 他们正在处理一百万件…

【Java IO】设计模式 (装饰者模式)

Java I/O 使用了装饰者模式来实现。 装饰者模式 请参考装饰者模式详解 装饰者(Decorator)和具体组件(ConcreteComponent)都继承自组件(Component)&#xff0c;具体组件的方法实现不需要依赖于其它对象&#xff0c;而装饰者组合了一个组件&#xff0c;这样它可以装饰其它装饰者…

022-安全开发-PHP应用留言板功能超全局变量数据库操作第三方插件引用

022-安全开发-PHP应用&留言板功能&超全局变量&数据库操作&第三方插件引用 #知识点&#xff1a; 1、PHP留言板前后端功能实现 2、数据库创建&架构&增删改查 3、内置超全局变量&HTML&JS混编 4、第三方应用插件&传参&对象调用 演示案例&a…

cad二次开发autolisp(二)

目录 一、选择集1.1 选择集的创建1.2 选择集的编辑1.3 操作选择集 二、命令行设置对话框2.1 设置图层2.2 加载线型2.3 设置字体样式2.4 设置标注样式&#xff08;了解即可&#xff09; 三、符号表3.1 简介3.2 符号表查找3.2 符号表删改增 一、选择集 定义&#xff1a;批量选择…

苹果眼镜(Vision Pro)的开发者指南(5)-主要工具

主要工具有:Xcode、Reality Composer Pro、Unity 第一部分:【用Xcode进行开发】 开始使用Xcode为visionOS进行开发。将向你展示如何在你现有的项目中添加一个visionOS目标,或者构建一个全新的应用,在Xcode预览中创建原型,以及从Reality Composer Pro中导入内容。还将分享…

ComfyUI 基础教程(十一):秋葉aaaki 整合包 一键启动

秋葉aaaki大佬的ComfyUI整合包,解压即用,一键启动,预置不少插件(工作流节点)。 1.使用方法 🌟链接:https://pan.quark.cn/s/ff5b759671d7 下载网盘文件(ComfyUI-aki-v1.1),解压缩即可。(秋葉文件包里面的controlnet和模型文件太大了,我删除了) 点击A绘世启动器.e…

elementui 表单 resetFields 方法不生效问题解决

问题 调用 elementui 官方提供的表单重置方法 resetFields 方法重置表单不生效&#xff0c;相信很多小伙伴都遇到过这个问题。 解决方法 检查代码看每个表单项的 prop 与 v-model 绑定的属性值命名是否相同&#xff0c;不相同的话就会导致 resetFields 方法不生效的问题&am…

详细分析Java中的list.foreach()和list.stream().foreach()

目录 前言1. 基本知识2. 差异之处2.1 执行顺序2.2 串行并行2.3 复杂数据处理2.4 CRUD集合2.5 迭代器 3. 总结4. 彩蛋 前言 典故来源于项目中使用了两种方式的foreach&#xff0c;后面尝试体验下有何区别&#xff01; 先看代码示例&#xff1a; 使用List的forEach&#xff1a…

Tomcat 简介安装

目录 1、概念介绍 Tomcat 组件 HTTP 请求过程 Tomcat 目录结构 Tomcat 命令 配置文件说明 2、安装环境 安装JDK 安装Tomcat 创建管理用户 3、搭建虚拟主机 1、概念介绍 端口&#xff1a;8080 Tomcat 服务器是一个免费的开放源代码的 Web 应用服务器, 按照 Sun 提供…

全双工通信协议:WebSocket

全双工通信协议&#xff1a;WebSockets 前言何时使用WebSocketsWebSocket APITextWebSocketHandlerWebSocketConfigurerWebSocket握手配置服务器允许的来源心跳包Java WebSocket API案例一&#xff1a;前端发送消息并接收后端响应案例二&#xff1a;模拟后端向前端推送消息案例…

Shell 虚拟机基线配置脚本示例

这是一个配置虚拟机基线的示例&#xff0c;包含关闭防火墙、禁用SElinux、设置时区、安装基础软件等。 这只是一个简单的模板&#xff0c;基线配置方面有很多&#xff0c;后续可以按照这个模板去逐步添加 代码示例 [rootbogon ~]# cat bastic.sh #!/bin/bashRED\E[1;31m GRE…