Ajax学习笔记第三天

做决定之前仔细考虑,一旦作了决定就要勇往直前、坚持到底!

1 ikunGG邮箱注册

整个流程展示:

024.gif

1.文件目录

021.png

2.页面效果展示及代码

  • mysql数据库中的初始表

022.png

2.1 主页 09.html:里面代码部分解释

  • display: inline-block;

让块元素h1变成行内块元素,不然块级元素h1的宽度会撑满父元素宽度

  • box-sizing: border-box;

盒子的大小:盒子大小固定,与margin,padding,border无关,但会自动调节content的大小

  • position: absolute;

绝对定位会使元素脱离文档流 ,绝对定位元素 是根据 离其(自身)最近并且**有定位设置(static定位除外)的父元素** 作为 定位位置的参考起点

  • cursor:text

大写I的点击填写

  • z-index: 999;

参数越大,表示越会显示在其他堆叠元素之上。Z-index 仅能在定位元素上有效(例如 position:absolute;)

  • display: none;

该元素不显示 ,相当于html标签里面没有这个元素盒子了

  • letter-spacing:

属性增加或减少字符之间的空白(字符间距)

  • 如果label标签设置了for=“xxx”,input标签设置了id=“xxx”【xxx一样】,那么,label标签简单理解为可以绑定表单元素。label本身与某个表单绑定,当用户点击了label标签则会触发表单,也就相当于点击了表单
<!-- label标签是行内元素 -->
<label for="emailadd">邮箱地址</label>
<input type="text" class='username' name="username" id="emailadd">
  • previousSibling

返回当前元素上一个兄弟元素节点【请点击此处】

  • 下面代码打印i时,全部都是3,最后一个。???为什么会出现这样的情况???
console.log(window);
for (var i = 0; i < inputs.length; i++) {// 聚焦时inputs[i].onfocus = function (){// 当聚焦的时候让label消失console.log(i);//全部是3console.log(this); // this => 触发聚焦这个事件的input元素}    
}     

解答:

原因就是:js事件处理器在线程空闲时间不会运行,导致最后运行的时候输出的都是i最后的值。在每个点击事件函数的作用域链中都保存着windows的活动对象**(for语句不构成作用域),所以它们引用的是同一个变量i,即i属于一个全局变量**,所以在给每个li绑定事件后,每个函数内部i的值都是3

【意思就是说:外面的for循环已经执行完了,i已经是3了,再等你点击绑定的事件时,打印的i可不就是3了吗?】

  • 通俗点来说就是:先给每个li绑定点击事件,绑定完点击事件后,每次没有被执行罢了。执行的时候已经被赋值成3了,(同步执行,异步执行问题)i是一个全局变量,所以再点击某个li输出i的时候,输出的自然是3了

  • 解决问题:使用ES6中Let完美解决。var i = 0 —> let i = 0

我们不点击input框,直接我们打印一下window对象身上有没有i。

023.png

<!DOCTYPE html>
<html lang="en"><head><meta charset="UTF-8"><meta http-equiv="X-UA-Compatible" content="IE=edge"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>Document</title><style>* {margin: 0;padding: 0;}body {background: #eff8ff;}/* 整个最外层包裹的盒子的样式 */.container {width: 470px;/* 内边距10px */padding: 10px;border: 1px solid #333;/* 上下30px,左右自动居中对齐 */margin: 30px auto;}.container h1 {/* 让块元素h1变成行内块元素,不然块级元素h1的宽度会撑满父元素宽度 */display: inline-block;font-size: 30px;/* 字体粗细层度 */font-weight: 400;color: #333;/* h1字号:原本32px = 2rem=2*16px */line-height: 34px;}/* 父级元素container里的所有item子元素 */.container .item {width: 470px;/* 距离上面同级元素底边的距离 */margin-top: 35px;/* 定位 */position: relative;}.container .item input {width: 100%;height: 46px;/* 盒子的大小:盒子大小固定,与margin,padding,border无关,但会自动调节content的大小 */box-sizing: border-box;border: 1px solid #cbcbcb;border-radius: 5px;/* 上11 右0 下10 左16 */padding: 11px 0 10px 16px;font-size: 16px;}.container .item label {height: 46px;box-sizing: border-box;border-radius: 3px;padding: 14px 0 10px 17px;font-size: 16px;/* 绝对定位会使元素脱离文档流 *//* 绝对定位元素 是根据 离其(自身)最近并且有定位设置(static定位除外)的父元素 作为 定位位置的参考起点 */position: absolute;top: 0;left: 0;color: #bfbfbf;/* cursor:text(大写I的点击填写) */cursor: text;/* 参数越大,表示越会显示在其他堆叠元素之上。Z-index 仅能在定位元素上有效(例如 position:absolute;) */z-index: 999;}.container .item .username {/* 距离右边父级元素120px */padding-right: 120px;}.container .item .domain {width: 131px;color: #343434;/* 绝对定位会使元素脱离文档流 */position: absolute;top: 0;right: 0;border: none;height: 46px;/* 盒子的大小:盒子大小固定,与margin,padding,border无关,但会自动调节content的大小 */box-sizing: border-box;border-radius: 3px;padding: 11px 0 10px 16px;font-size: 16px;line-height: 25px;}.tip {height: 17px;line-height: 17px;/* 上面两行代码,是内容垂直居中对齐 */font-size: 13px;color: #9e9e9e;/* 该元素不显示 */display: none;margin-top: 10px;}#error {color: #ff5b5b;font-size: 12px;display: none;font-size: 13px;margin-top: 10px;}#success {color: #33a853;font-size: 12px;display: none;font-size: 13px;margin-top: 10px;}.btn {color: #fff;background: #3b78dd;font-size: 22px;letter-spacing: 2.2px;/* 该元素盒子被内容,line-height撑高 */line-height: 46px;/* display:block就是将元素显示为块级元素 */display: block;text-align: center;border-radius: 5px;margin-top: 35px;}</style>
</head><body><div class="container"><h1>欢迎注册ikunGG邮箱</h1><div class="item"><!-- label标签简单理解为可以绑定表单元素。label本身与某个表单绑定,当用户点击了label标签则会触发表单,也就相当于点击了表单 --><!-- label标签是行内元素 --><label for="emailadd">邮箱地址</label><input type="text" class='username' name="username" id="emailadd"><p class="tip">6~18个字符,可使用字母、数字、下划线,需要以字母开头</p><div class="domain">164.com</div><p id="error">该邮箱已经被注册</p><p id="success">恭喜,该邮件地址可以注册</p></div><div class="item"><label>密码</label><input type="text" name="password"><p class="tip">6~16个字符,区分大小写</p></div><div class="item"><label>手机号</label><input type="text" name="phone"><p class="tip">可通过该手机号找回密码</p></div><div class="btn" id="btn">立即注册</div></div><!-- 引入封装好的Ajax技术 --><script src="js/ajax.js"></script><script>// 获取所有的input框var inputs = document.getElementsByTagName("input");var username = document.getElementsByClassName("username")[0];var successTip = document.getElementById("success");var errorTip = document.getElementById("error");var btn = document.getElementById("btn");// 记录存储名称var keys = {"username": "邮箱地址","password": "密码","phone": "手机号"}// 设置一个状态,用来判断当前的邮箱地址是否已经被注册了,如果被注册了,就不允许提交var emailFlag = true;// console.log(window);for (var i = 0; i < inputs.length; i++) {// 聚焦时inputs[i].onfocus = function (){// 当聚焦的时候让label消失// console.log(i);//全部是3// console.log(this);// console.log(this.previousSibling.previousSibling);//label//  this => 触发这个事件的input元素// previousSibling 返回当前元素上一个兄弟元素节点【重点补充】// previousSibling和nextSibling是获取上一个、下一个同胞元素,如果上一个或下一个同级节不存在,则此属性返回值是null// this.previousSibling.previousSibling.style.display = 'none'// 和上面代码一样,但下面的代码兼容性不行this.previousElementSibling.style.display = "none";// 当聚焦的时候让下面的提示文案显示// this.nextSibling.nextSibling.style.display = "block";this.nextElementSibling.style.display = "block";// 如果input的name属性为username,即,如果聚焦的为第一个input框,那么让成功和失败的提示消失if (this.name == 'username') {// 强制让成功和失败的提示消失successTip.style.display = "none";errorTip.style.display = "none";}}// 失去焦点inputs[i].onblur = function (){// 当失去焦点的时候,判断,如果有value值,就不让label显示,否则就显示labelif (!this.value) {this.previousSibling.previousSibling.style.display = 'block'}// 失去焦点的时候让下面的提示文案隐藏this.nextSibling.nextSibling.style.display = "none";// 如果是用户名则发送ajax请求去判断当前的用户是否已经被注册// 找到用户名这个框且不能为空,才能校验if (this.name == "username" && this.value) {// 发送Ajax请求校验validate(this.value);}}}// 校验请求function validate (value){// 可以直接调用封装好的ajax.get("check.php", { "username": value }, function (data){// 返回的数据时SUCCESS,那么就是可以注册emailif (data == "SUCCESS") {// 显示成功提示successTip.style.display = "block";// 邮箱的可提交状态为trueemailFlag = true;} else if (data == "ERROR") {//显示失败提示errorTip.style.display = "block";// 邮箱的可提交状态为false,即不可提交emailFlag = false;}})}// 发送请求提交数据btn.onclick = function (){// 第一步:要先判断用户名是否可以使用,如果不可以抛出错误// emailFlag 不可以注册是 trueif (!emailFlag) {alert("当前用户名已经被占用,请输入新的邮箱地址")return;}// 提交参数var subObj = {};// 第二步:判断所有的表单信息是否都填上了,如果没有就抛出错误提示for (let i = 0; i < inputs.length; i++) {// inputs[i].value :不为空,就是真if (!inputs[i].value) {return;alert("请完善" + keys[inputs[i].name]);} else {// 表单信息赋值,相当于以k-v的形式存进空白对象subObj中subObj[inputs[i].name] = inputs[i].value;}}// 如果都没有被return就将所有的信息提交到数据库add(subObj);}// 发送请求function add (json){// 提交逻辑ajax.post("add.php", json, function (data){// 注册成功后,那么emailFlag状态变为false,即不可注册if (data == "SUCCESS") {alert("提交成功")emailFlag = false;} else {alert("提交失败!请重试")}})}</script></body></html>

2.2 add.php

<?php// 从客户端传递过来的数据,// 得到邮箱地址,密码和手机号,并存在变量中$username= $_POST["username"];$phone= $_POST["phone"];$password= $_POST["password"];// 链接数据库$connect = mysql_connect("localhost",'root','xjf123456');// 选择数据库mysql_select_db("ikungg");// 设置字符集mysql_query("SET NAMES UTF8");// 插入SQL$sql =  "INSERT INTO email_form (username,password,phone) VALUES ('{$username}','{$password}','{$phone}')";// 执行SQL,存进数据库了$result = mysql_query($sql);// 如果$result返回1了,就说明提交成功了,服务器操作数据库,并返回数据 SUCCESS 或者 ERRORif($result == 1) {echo "SUCCESS";} else {echo "ERROR";}?>

2.3 check.php

<?php// 得到邮箱地址$username= $_GET["username"];// 链接数据库$connect = mysql_connect("localhost",'root','xjf123456');// 选择数据库mysql_select_db("ikungg");// 设置字符集mysql_query("SET NAMES UTF8");// 查询SQL$sql = "SELECT * FROM email_form WHERE username = '{$username}'";// 执行SQL$result = mysql_query($sql);// 返回查询出来的结果数量 ,符合条件的数据有多少行$num = mysql_num_rows($result);// 当前的结果如果大于0就说明有查询结果if($num > 0) {echo "ERROR";} else {echo "SUCCESS";}
?>

2.4 ajax.js

(function(){// 唯一暴露的参数变量// 把ajax空对象放到Windows上window.ajax = ajax = {};function common(xhr,JSON,callback) { // 如果用户只传了两个参数,第二个参数如果不是JSON就是函数// 如果第二个参数的类型是函数了,说明第二个参数就是回调函数if(typeof JSON == "function") {// 如果第二个参数是回调函数了,让callback参数就等于这个函数callback = JSON;JSON = {};}xhr.onreadystatechange = function() {if(xhr.readyState == 4) {if(xhr.status >= 200 && xhr.status < 300 || xhr.status == 304) {callback(xhr.responseText)}}}// 拼接JSON数据,比如我们的参数{"id":10001,"name":"小明","age":18}// 转换为id=10001&name=小明&age=18var temp = [];for(var k in JSON) {temp.push(k+"="+encodeURI(JSON[k]));}// 将temp的数据转换为字符串格式的,共最后提交请求使用return temp.join("&");}ajax.get = function(url,JSON,callback) {var xhr = new XMLHttpRequest();// 调用公共方法var str = common(xhr,JSON,callback)// 防止没有参数if(str) {url+="?"+str}xhr.open("get",url,true);xhr.send(null);}ajax.post = function(url,JSON,callback) {var xhr = new XMLHttpRequest();// 调用公共方法var str = common(xhr,JSON,callback)xhr.open("post",url,true);xhr.setRequestHeader('Content-Type','application/x-www-form-urlencoded');xhr.send(str)}
})()

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

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

相关文章

OpenCV C++ 图像处理实战 ——《缺陷检测》

OpenCV C++ 图像处理实战 ——《缺陷检测》 一、结果演示二、缺陷检测算法2.1、多元模板图像2.2、训练差异模型三、图像配准3.1 功能源码3.1 功能效果四、多元模板图像4.1 功能源码五、缺陷检测5.1 功能源码六、源码测试图像下载总结一、结果演示

pytorch笔记:TRIPLETMARGINLOSS

1 介绍 创建一个衡量三元组损失的标准&#xff0c;给定输入张量 x1​、x2​ 和 x3​ 以及一个大于0的间距值。这用于测量样本之间的相对相似性。一个三元组由a、p和n组成&#xff08;锚点、正例和负例&#xff09;。所有输入张量的形状都应为 (N,D) 2 基本使用方法 torch.nn.…

AD9371 官方例程HDL详解之JESD204B RX侧格式配置

AD9371 系列快速入口 AD9371ZCU102 移植到 ZCU106 &#xff1a; AD9371 官方例程构建及单音信号收发 采样率和各个时钟之间的关系 &#xff1a; AD9371 官方例程HDL详解之JESD204B TX侧时钟生成 &#xff08;三&#xff09; 参考资料&#xff1a; UltraScale Architecture G…

【AD9361 数字接口CMOS LVDSSPI】D 串行数据之SPI

【AD9361 数字接口CMOS &LVDS&SPI】D部分 接续 【AD9361 数字接口CMOS &LVDS&SPI】A 并行数据之CMOS 串行外设接口&#xff08;SPI&#xff09; SPI总线为AD9361的所有数字控制提供机制。每个SPI寄存器的宽度为8位&#xff0c;每个寄存器包含控制位、状态监视…

【OpenCV实现平滑图像金字塔,轮廓:入门】

文章目录 概要图像金字塔轮廓&#xff1a;入门 概要 文章内容的概要&#xff1a; 平滑图像金字塔&#xff1a; 图像金字塔是什么&#xff1f; 图像金字塔是指将原始图像按照不同的分辨率进行多次缩小&#xff08;下采样&#xff09;得到的一系列图像。这种处理方式常用于图像…

数据链路层和DNS之间的那些事~

数据链路层&#xff0c;考虑的是两个节点之间的传输。这里面的典型协议也很多&#xff0c;最知名的就是“以太网”。我们本篇主要介绍的就是以太网协议。这个协议规定了数据链路层&#xff0c;也规定了物理层的内容。 目录 以太网帧格式 帧头 载荷 帧尾 DNS 从输入URL到…

[读论文] On Joint Learning for Solving Placement and Routing in Chip Design

0. Abstract 由于 GPU 在加速计算方面的优势和对人类专家的依赖较少&#xff0c;机器学习已成为解决布局和布线问题的新兴工具&#xff0c;这是现代芯片设计流程中的两个关键步骤。它仍处于早期阶段&#xff0c;存在一些基本问题&#xff1a;可扩展性、奖励设计和端到端学习范…

获取IEEE会议论文的标题和摘要

获取IEEE会议论文的标题和摘要 – 潘登同学的爬虫笔记 文章目录 获取IEEE会议论文的标题和摘要 -- 潘登同学的爬虫笔记 打开IEEE的高级搜索环境准备完整爬虫过程获取文章地址翻译函数获取文章标题和摘要 前几天接到导师的一个任务&#xff0c;要我去找找IEEE Transactions on K…

vue源码分析(七)—— createComponent

文章目录 前言一、createComponent 参数说明二、createComponent 源码详解1.baseCtor的实际指向2.extend 方法3.判断Ctor是否是函数的判断4.installComponentHooks方法5.返回一个带标识的组件 vnode 前言 createComponent文件的路径&#xff1a; src\core\vdom\create-componen…

【Qt之控件QKeySequenceEdit】分析及使用

描述 QKeySequenceEdit小部件允许输入一个QKeySequence。 该小部件允许用户选择一个QKeySequence&#xff0c;通常用作快捷键。当小部件获取焦点时&#xff0c;录制将开始&#xff0c;并在用户释放最后一个键后的一秒钟结束。 用户可以使用输入键盘来输入键序列。通过调用get…

Postman日常操作

一.Postman介绍 1.1第一个简单的demo 路特斯&#xff08;英国汽车品牌&#xff09;_百度百科 (baidu.com) 1.2 cookie 用postman测试需要登录权限的接口时&#xff0c;会被拦截&#xff0c;解决办法就是每次请求接口前&#xff0c;先执行登录&#xff0c;然后记住cookie或者to…

python html(文件/url/html字符串)转pdf

安装库 pip install pdfkit第二步 下载程序wkhtmltopdf https://wkhtmltopdf.org/downloads.html 下载7z压缩包 解压即可, 无需安装 解压后结构应该是这样, 我喜欢放在项目里, 相对路径引用(也可以使用绝对路径, 放其他地方) import pdfkit# 将 wkhtmltopdf.exe程序 路径 p…

LVS-keepalived实现高可用

概念&#xff1a; 本章核心&#xff1a; Keepalived为LVS应运而生的高可用服务。LVS的调度无法做高可用&#xff0c;预算keepalived这个软件&#xff0c;实现了调度器的高可用。 但是&#xff1a;Keeplived不是专门为LVS集群服务的&#xff0c;也可以做其他服务器的高可用 LVS…

STM32F103的中断

文章目录 STM32F103的NVICSTM32F103 的中断优先级分组 STM32F103的NVIC CM3 内核支持 256 个中断&#xff0c;其中包含了 16 个内核中断和 240 个外部中断&#xff0c;并且具有 256级的可编程中断设置。 CM3中每个中断通道都具备自己的8位中断优先级控制字节&#xff0c; 但ST…

【ROS入门】雷达、摄像头及kinect信息仿真以及显示

文章结构 雷达信息仿真以及显示Gazebo仿真雷达配置雷达传感器信息xacro文件集成启动仿真环境 Rviz显示雷达数据 摄像头信息仿真以及显示Gazebo仿真摄像头新建xacro文件&#xff0c;配置摄像头传感器信息xacro文件集成启动仿真环境 Rviz显示摄像头数据 kinect信息仿真以及显示Ga…

不做学习的奴隶,更要注重生活

下面是国外社交软件 i n s ins ins上近 40 40 40万点赞的帖子。 “睡8小时&#xff0c;而不是6小时。 锻炼1小时&#xff0c;而不是4小时。 学习3小时&#xff0c;而不是10小时。 读书2小时&#xff0c;而不是5小时。 深度工作3小时&#xff0c;而不是12小时。 你是人&#xff…

arch linux 安装 vsftpd 配置虚拟用户

后面操作会直接基于 yay 操作 自行查找如何安装 yay 公司经常会用到 ftp 服务 不想用 apache 的 ftp server 所以自己在小机器上撞了 arch linux 用来安装软件 跑程序等。 1. 安装 vsftpd yay vsftpd --noconfirm选择 1 安装 输入密码 2. 安装 pam_pwdfile 安装 pam_pwdf…

【软件安装】Windows系统中使用miniserve搭建一个文件服务器

这篇文章&#xff0c;主要介绍如何在Windows系统中使用miniserve搭建一个文件服务器。 目录 一、搭建文件服务器 1.1、下载miniserve 1.2、启动miniserve服务 1.3、指定根目录 1.4、开启访问日志 1.5、指定启动端口 1.6、设置用户认证 1.7、设置界面主题 &#xff08;…

华为终端智能家居应用方案

PLC-IoT概述 华为智能PLC-IoT工业物联网系列通信模块是基于电力线宽带载波技术的产品&#xff0c;实现数据在电力线上双向、高速、稳定的传输&#xff0c;广泛适用于电力、交通、工业制造、智能家居等领域&#xff0c;PLC-IoT通信模块包含头端和尾端两种类型&#xff0c;头端配…

el-table(vue2中)滚动条被固定列盖住

一、项目场景&#xff1a; vue2 el-table 二、问题描述 1、现场图片&#xff1a; 2、全局css环境配置了滚动条高度为6px /* 全局滚动条配置 */ ::-webkit-scrollbar {width: 6px;height: 6px; }::-webkit-scrollbar-track {background-color: #f1f1f1; }::-webkit-scrollbar-…