由于 HTML 代码杂乱无章,我们习惯性的用注释来划定区域方便后续的查找
DOCTYPE html>
<html lang="en">
<head>
head>
<body>
body>
html>
<head>
<meta name="keyword" content="搜索关键字">
<meta name="description" content="网页秒数信息">
<title>title>
<style>style>
<link rel="stylesheet" href="mycss.css">
<scritpt>scritpt>
<script src="myjs.js">script>
head>
<h1> 一级标签 h1>
<b>加粗b>
<i>斜体i>
<u>下划线u>
<s>删除线s>
<br>
<hr>
常见的块级标签
<h1>h1>
<div>div>
<p>p>
<i>斜体i>
<u>下划线u>
<s>删除线s>
<br>
<hr>
<p> p>
<p>> <p>
<p>&p>
<p>¥p>
<p>©p>
<p>®p>
<div>
<span>Hello Worldspan>
div>
<a href="" id="d1">a><br>
<img src="111.png" alt="this is my wife" height="400px" title="YiFei Liu"><br>
<a href=""id="#d1">点此回到图片上a>
无序列表
<ul>
<li>第一项li>
<li>第二项li>
<li>第二项li>
<li>第二项li>
ul>
有序列表
<ol type="1" start="5">
<li>111li>
<li>222li>
<li>333li>
ol>
标题列表
<dl>
<dt>标题1dt>
<dd>内容1dd>
<dt>标题2dt>
<dd>内容2dd>
<dt>标题3dt>
<dd>内容3dd>
dl>
<table>
<thead>
<tr>
<th>usernameth>
加粗文本
<td>usernametd>
正常文本
tr>
thead>
<tbody>
<tr>
<td>jasontd>
<td>123td>
<td>readtd>
tr>
tbody>
table>
<table border="1"> 加外边宽
<td colspan="2">egontd> 水平方向占多行
<td rowspan="2">DBJtd> 垂直方向占多行
<form action="http://127.0.0.1:5000/index/"
method="post"
enctype="multipart/form-data">
<input>
form>
input标签 就类似于前端的变形金刚 通过type属性变形
text:普通文本
password:密文
date:日期
submit:用来触发form表单提交数据的动作
button:就是一个普普通通的按钮 本身没有任何的功能 但是它是最有用的,学完js之后可以给它自定义各种功能
reset:重置内容
radio:单选
默认选中要加checked='checked'
<input type="radio" name="gender" checked='checked'>男
当标签的属性名和属性值一样的时候可以简写
<input type="radio" name="gender" checked>女
checkbox:多选
<input type="checkbox" checked>DBJ
file:获取文件 也可以一次性获取多个
<input type="file" multiple>
select标签 默认是单选 可以加mutiple参数变多选 默认选中selected
<select name="" id="" multiple>
<option value="" selected>新垣结衣option>
<option value="" selected>斯佳丽option>
<option value="">明老师option>
select>
textarea标签 获取大段文本
<textarea name="" id="" cols="30" rows="10">textarea>
# 能够触发form表单提交数据的按钮有哪些(一定要记住)
1、<input type="submit" value="注册">
2、<button>点我button>
# 所有获取用户输入的标签 都应该有name属性
name就类似于字典的key
用户的数据就类似于字典的value
<p>gender:
<input type="radio" name="gender">男
<input type="radio" name="gender">女
<input type="radio" name="gender">其他
p>
id
值,类似于身份证号,同一个 HTML 页面上唯一不能重复class
值,一个标签可以继承多个 class 值/**/
选择器 {
属性1:值1;
属性2:值2;
属性3:值3;
属性4:值4;
}
1.style标签内部直接书写(为了教学演示方便我们用第一种)
2.link标签引入外部css文件(最正规的方式 解耦合)
"stylesheet" href="mycss.css">
3.行内式(一般不用)
"color: green">老板好 要上课吗?
/*后代选择器*/
div span {
color: red;
}
/*儿子选择器*/
div>span {
color: red;
}
/*毗邻选择器*/
div+span { /*!*同级别紧挨着的下面的第一个*!*/
color: aqua;
}
/*弟弟选择器*/
div~span { /*同级别下面所有的span*/
color: red;
}
""
1 含有某个属性
2 含有某个属性并且有某个值
3 含有某个属性并且有某个值的某个标签
"""
属性选择器是以[]作为标志的
[username] { /*!*将所有含有属性名是username的标签背景色改为红色*!*/
background-color: red;
}*/
[username='jason'] { /*!*找到所有属性名是username并且属性值是jason的标签*!*/
background-color: orange;
}
input[username='jason'] { /*!*找到所有属性名是username并且属性值是jason的input标签*!*/
background-color: wheat;
}
字体属性
font-family: "Arial Black","微软雅黑","..."; !*第一个不生效就用后面的 写多个备用*!*/
font-size: 24px; /*字体大小*/
font-weight: inherit; /*bolder lighter 100~900 inherit继承父元素的粗细值*/
color: red; /*直接写颜色英文*/
color: #ee762e; /*颜色编号*!*/
color: rgb(128,23,45); /*三基色 数字 范围0-255*!*/
color: rgba(23, 128, 91, 0.9); /*第四个参数是颜色的透明度 范围是0-1*!*/
文字属性
text-align: center; /*居中*/*/
text-align: right;
text-align: left;
text-align: justify; /*两端对齐*/
text-decoration: underline;
text-decoration: overline;
text-decoration: line-through;
text-decoration: none;
/*在html中 有很多标签渲染出来的样式效果是一样的*/
a {
text-decoration: none; /*主要用于给a标签去掉自带的下划线 需要掌握*/
}
p {
background-color: red;
border-width: 5px;
border-style: solid;
border-color: green;
}
div {
/*左边框的宽度 颜色 样式*/
border-left-width: 5px;
border-left-color: red;
border-left-style: dotted;
/*右边框的宽度 颜色 样式*/
border-right-width: 10px;
border-right-color: greenyellow;
border-right-style: solid;
/*上边框的宽度 颜色 样式*/
border-top-width: 15px;
border-top-color: deeppink;
border-top-style: dashed;
/*下边框的宽度 颜色 样式*/
border-bottom-width: 10px;
border-bottom-color: tomato;
border-bottom-style: solid;
/*border: 3px solid red; !*三者位置可以随意写*!*/
}
/*画圆*/
#d1 {
background-color: greenyellow;
height: 400px;
width: 400px;
border-radius: 50%; /*直接写50%即可 长宽一样就是圆 不一样就是椭圆*/
}
display: none; /*隐藏标签不展示到前端页面并且原来的位置也不再占有了 但是还存在于文档上*/
display: inline; /*将标签设置为行内标签的特点*/
display: block; /*将标签设置成块儿级标签的特点*/
display: inline-block; /*标签即可以在一行显示又可以设置长宽*!*/
overflow: visible; /*默认就是可见 溢出还是展示*/
overflow: hidden; /*溢出部分直接隐藏*/
overflow: scroll; /*设置成上下滚动条的形式*/
overflow: auto;
margin
外边距border
padding
内边距 body {margin: 0;}
margin: 0; /*上下左右全是0
margin: 10px 20px; /* 第一个上下 第二个左右*/
margin: 10px 20px 30px; /*第一个上 第二个左右 第三个下*/
margin: 10px 20px 30px 40px; /*上 右 下 左*/
margin-left: 0;
margin-top: 0;
margin-right: 0;
margin-bottom: 0;
/*水平居中*/
margin: 0 auto; /*只能做到标签的水平居中*/
/*padding 和 margin 语法一样*/
#d1 {
margin-bottom: 50px;
}
#d2 {
margin-top: 20px; /*不叠加 只取大的*/
}
静态
所有的标签默认都是静态的static,无法改变位置
相对定位(了解)
相对于标签原来的位置做移动relative
绝对定位(常用)
相对于已经定位过的父标签做移动(如果没有父标签那么就以body为参照)
eg:小米网站购物车
当你不知道页面其他标签的位置和参数,只给了你一个父标签的参数,让你基于该标签左定位
固定定位(常用)
相对于浏览器窗口固定在某个位置
eg:右侧小广告
position: static; /*默认是static无法修改位置*/
position: relative;
/*相对定位
标签由static变为relative它的性质就从原来没有定位的标签变成了已经定位过的标签
虽然你哪怕没有动 但是你的性质也已经改变了
*/
position: absolute; /*绝对定位*/
position: fixed; /*写了fixed之后 定位就是依据浏览器窗口*/
文档流(原来的位置是否还保留)
<button type="button" onclick="alert('欢迎!')">点我!button>
<script type="javascript">
...
script>
<script type="javascript" src="myjs.js">script>
注释
// 单行注释
/*
多行注释
*/
注意
- js 和 python 一样,是动态类型的语言,不需要为此定义变量类型
声明变量的两种方式
var 变量名; // 全局变量
let 变量名; // 可以区分全局和局部变量
常量
const PI = 3.14; // 更改会报错
number
var a = 10;
typeof(a) // number
类型转换
parseInt()
parseFloat()
// 将字符串型转换为 number
parseInt('12312312') // 12312312
// 将字符串型转换为 number, 并保留小数
parseFloat('11.11') // 11.11
// 将字符串型转换为 number, 不保留小数
parseInt('11.11') // 11
// 对于有其他字符的,只保留前面的一部分
parseInt('123sdasdajs2312dasd') // 123
// 当前面不是字符串时,会返回 NaN
parseInt('asdasdad123sdasdajs2312dasd') // NaN
// NaN 是 number 类型
typeof NaN // number
string
var name = 'codeFun' // 单引号声明
var name = "codeFun" // 双引号声明
// 不支持三引号声明
模板字符串
name = 'codeFun';
age = 18;
str = `
my name is ${name}, age is ${age}
` // '\n\tmy name is codeFun, age is 18\n'
常用的字符串方法
//返回长度
.length
// 去除空白
.trim() // 移除空白
.trimLeft() // 移除左边的空白
.trimRight() // 移除右边的空白
// 字符切片
.charAt(n) // 返回第n个字符
.indexOf(substring, start) // 子序列位置
.substring(from, to) // 根据索引获取子序列
.slice(start, end) // 切片
.split(delimiter, limit) // 分割
// 转换大小写
.toLowerCase() // 小写
.toUpperCase() // 大写
Boolean
true
false // 空字符串、0、null、undefined、NaN
null 和 undefined
// 类似于 python 中的列表
var l = [11,22,33,44,55]
常用方法
.length // 获取长度
.push(element) // 向最后追加增加元素
.pop() // 弹出最后一个元素并返回
.unshift(element) // 在 0 索引添加元素
.shift() // 弹出 0 号索引的元素并返回
.reverse() // 反转
.join(连接符) // 使用连接符将列表连接起来并返回
.concat(list_name) // 连接两个数组返回新的数组
.sort() // 进行排序
.splice(index,delete_num) // 从 index 的位置,删除 delete_num 个元素
// 从 index 的位置,删除 delete_num 个元素,添加指定元素 element
.splice(index,delete_num,element)
遍历数组
l.forEach(function(value){console.log(value)}, l) // 遍历打印元素
// 遍历打印元素 和 索引
l.forEach(function(value, index){console.log(value,index)}, l)
// 遍历打印元素 索引 元素的数据来源
l.forEach(function(value,index,arr){console.log(value,index,arr)}, l)
// map 和 foreach 的用法差不多
var ll = [11,22,33,44,55,66]
ll.map(function (value) {
return value * 2
},ll)
// [22, 44, 66, 88, 110, 132]
// 算术运算符
// 加号在前先加后赋值 加号在后先赋值后加
var x = 10;
var res1 = x++; // res1 10
var res2 = ++x; // res2 12
// 比较运算符
1 == '1' # 弱等于 内部自动转换成相同的数据类型比较了
true
1 === '1' # 强等于 内部不做类型转换
false
if 判断
if(条件){
代码块;
}else if(条件){
代码块;
}else{
代码块;
}
Switch 判断
var num = 2;
switch (num){
case 0:
代码块;
break;
case 2:
代码块;
break;
...
default:
代码块
}
for 循环
for(起始位;条件;循环一次后对于起始位的操作){
代码块;
}
// 打印0~9
for(var i = 0;i < 10;i ++){
console.log(i)
}
while 循环
while(条件){
代码块;
}
函数的定义和调用
// 定义
function function_name([params]){
代码块;
[return return_value]
}
// 调用
// 调用函数时,传入参数的多或少都不会报错!
// 函数的返回值只能是一个,多个可以使用数组包括!
[return_vaule =] function_name([params])
限制调用函数的参数
function func2(a,b){
if(arguments.length<2){
console.log('传少了')
}else if (arguments.length>2){
console.log('传多了')
}else{
console.log('正常执行')
}
}
匿名函数
function([params]){
代码块;
}
箭头函数
var function_name = params => params;
// 上面和下面的等价
var function_name = function(params){
return params
}
"""第一种创建自定义对象的方式"""
var d = {'name':'jason','age':18}
typeof d // "object"
取值
d['name'] // "jason"
d.name // "jason"
"""第二种创建自定义对象的方式 需要使用关键字 new"""
var d2 = new Object() # {}
d2.name = 'jason' // {name: "jason"}
d2['age'] = 18 // {name: "jason", age: 18}
let date = new Date() // Thu Apr 20 2023 11:29:07 GMT+0800 (中国标准时间)
d3.toLocaleString() // '2023/4/20 11:29:07'
// 也支持自己手动输入时间
let d4 = new Date('2200/11/11 11:11:11')
d4.toLocaleString()
let d5 = new Date(1111,11,11,11,11,11)
d5.toLocaleString() # 月份从0开始0-11月
"1111/12/11 上午11:11:11"
# 时间对象具体方法
let d6 = new Date();
d6.getDate() 获取日
d6.getDay() 获取星期
d6.getMonth() 获取月份(0-11)
d6.getFullYear() 获取完整的年份
d6.getHours() 获取小时
d6.getMinutes() 获取分钟
d6.getSeconds() 获取秒
d6.getMilliseconds() 获取毫秒
d6.getTime() 时间戳
JSON.stringify() // 序列化 类似于 python 中的 dumps
JSON.parse() // 反序列化 类似于 python 中的 loads
// 实例:
var dict = {'name': 'codeFun', age: 18};
dict_json = JSON.stringify(dict) // '{"name":"codeFun","age":18}'
JSON.parse(dict_json) // {name: 'codeFun', age: 18}
// 创建对象
var reg_obj01 = new RegExp('^[a-zA-Z]{1,5}$'); // 匹配 1-5 个由大小写字母组成的字串
var reg_obj02 = /^[a-zA-Z]{1,5}$/; // 匹配 1-5 个由大小写字母组成的字串
// 匹配内容
reg_obj01.test(); // 什么不写,匹配 undefined
reg_objo1.test('codeFun'); // 返回 false
// 字符串匹配
var str01 = 'hello world';
var result_list = str01.match(/o/);
console.log(result_list) // ['o', index: 4, input: 'hello world', groups: undefined] 只能找到一个
var result = str01.match(/o/g) // 全局查找,能够找到两个
"""
全局匹配有一个 lastIndex 属性,匹配一次后指针就到最后了,下一次再匹配就是 false
"""
window 对象
window.innerHeight // 浏览器窗口的高度 910
window.innerWidth // 浏览器窗口的宽度 1589
// 新建窗口打开页面,第二个参数空着,第三个参数是新建窗口的大小和位置
window.open('https://www.baidu.com/','','height=500px,width=500px,top=400px,left=400px');
window.close() // 关闭当前页面
window 子对象 navigator
// 判断当前是否是浏览器 -- 爬虫和反爬能够用的上
window.navigator.userAgent
'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/112.0.0.0 Safari/537.36 Edg/112.0.1722.48'
// 获取操作系统
window.navigator.platform // 'Win32'
window 子对象 history
window.history.back() // 回退到上一页
window.history.forward() // 前进到下一页
window 子对象 location
window.location.href // 获取当前页面的 url
window.location.href = url // 跳转到指定页面
widow.location.reload() // 刷新当前页
// 警告框
alert('hello world') // 没有返回值,有确认按钮
// 确认框
confirm('你确定吗?') // 当点“确认”时,返回 true;反之点取消返回 false
// 提示框
prompt('提示标题','提示内容') // 当点击确认时,返回“提示内容”,点取消返回 null
一次性计时器
let t = setTimeout(function_name,3000) // 3 秒之后自动执行 function_name 函数
clearTimeout(t) // 取消定时任务
循环计时器
t = setInterval(function_name,3000) // 每隔 3 秒执行一次
clearInterval(t) // 清除定时器
查找标签
// 直接查找
document.getElementById("d1") // 根据 id 查找标签,返回标签
document.getElementsByClassName('c1') // 根据类名查找标签,返回列表
document.getElementsByTagName('div') // 根据标签名查找标签,返回列表
节点操作
/*
在页面指定位置添加图片
*/
// 创建标签
let imgEle = document.createElement('img')
// 给标签添加默认属性
imgEle.src = '111.png'
// 给标签添加自定义属性
imgEle.setAttribute('username','codeFun')
// 获取父标签元素
let divEle = document.getElementById('d2')
// 在父标签内添加 imgEle
divEle.appendChild(imgEle)
// 给 a 标签设置文本
aEle.innerText = 'hello world'
divEle.innerHTML = 'hello world' // 可以识别 html 语言
// 额外补充
.appendChild()
.removeChild()
.replaceChild()
.setAttribute() 设置属性
.getAttribute() 获取属性
.removeAttribute() 移除属性
获取值操作
// 获取用户数据标签内部的数据
let inputEle = document.getElementById('d1')
inputEle.value
// 获取用户上传的文件数据
fileEle.files // 获取一个有关文件的列表
fileEle.files[0] // 获取文件数据
class css 操作
let divEle = document.getElementById('d1')
divEle.classList // 获取标签所有的类属性
divEle.classList.remove('bg_red') // 移除某个类属性
divEle.classList.add('bg_red') // 添加类属性
divEle.classList.contains('c1') // 验证是否包含某个类属性 true
divEle.classList.toggle('bg_red') // 有则删除无则添加
// DOM操作操作标签样式 统一先用style起手
let pEle = document.getElementsByTagName('p')[0]
pEle.style.color = 'red'
pEle.style.fontSize = '28px'
pEle.style.backgroundColor = 'yellow'
pEle.style.border = '3px solid red'
绑定事件的两种方式
<button onclick="func1()">点我button>
<button id="d1">点我button>
<script>
// 第一种绑定事件的方式
function func1() {
alert(111)
}
// 第二种
let btnEle = document.getElementById('d1');
btnEle.onclick = function () {
alert(222)
}
script>
实时展示当前时间
<body>
<div>
<input type="text" id="d1" style="display: block;height: 50px;width: 200px">
<button id="d2">开始button>
<button id="d3">结束button>
div>
<script>
let t = null
let inputEle = document.getElementById('d1')
let startBtnEle = document.getElementById('d2')
let endBtnEle = document.getElementById('d3')
function getTime(){
let currentTime = new Date()
inputEle.value = currentTime.toLocaleTimeString()
}
startBtnEle.onclick = function (){
if (!t){
t = setInterval(getTime,1000)
}
}
endBtnEle.onclick = function (){
clearInterval(t)
t = null
}
script>
body>
将 jQuery 文件直接导入即可
<script src="jQuery-3.4.1.js">script>
也可以使用 cdn 服务
<script src="https://cdn.bootcdn.net/ajax/libs/jquery/3.4.1/jquery.min.js">script>
JQuery('选择器').操作()
JQuery 还可以简写为 $
即 JQuery('选择器').操作() === $('选择器').操作()
// 例如将 div 标签中的颜色变红
$('div').css('color','red')
// jQuery对象如何变成标签对象
$('#d1')[0]
// 标签对象如何转jQuery对象
document.getElementById('d1')
$(document.getElementById('d1'))
基本选择器
// id选择器
$('#d1')
// class选择器
$('.c1')
// 标签选择器
$('span')
组合选择器
$('div.c1') // 查找 div 中 class = c1 的
$('div#d1') // 查找 div 中 id = d1 的
$('*') // 查找全部
分组与嵌套
$('#d1,.c1,p') # 并列+混用
$('div span') // 后代
$('div>span') // 儿子
$('div+span') // 毗邻
$('div~span') // 弟弟
基本筛选器
$('ul li')
$('ul li:first') // 大儿子
$('ul li:last') // 小儿子
$('ul li:eq(2)') // 放索引
$('ul li:even') // 偶数索引 0包含在内
$('ul li:odd') // 奇数索引
$('ul li:gt(2)') // 大于索引
$('ul li:lt(2)') // 小于索引
$('ul li:not("#d1")') // 移除满足条件的标签
$('div')
$('div:has("p")') // 选取出包含一个或多个标签在内的标签
属性选择器
$('[username]') // 选择有 username 的标签
$('[username="jason"]') // 选择有 username = jason 的标签
$('p[username="egon"]') // 选择有 username 的 p 标签
表单筛选器
$('input[type="text"]')
$('input[type="password"]')
// 将上面的进行简写
$(':text') // 等价于上面第一个
$(':password') // 等价于上面第二个
// 下面的都可以简写:
:text
:password
:file
:radio
:checkbox
:submit
:reset
:button
表单对象属性
:enabled
:disabled
:checked
:selected
// 特例
$(':checked') // 它会将checked和selected都拿到
$(':selected') // 它不会 只拿selected
$('input:checked') // 添加一个限制条件
筛选器方法
$('#d1').next() // 同级别下一个
$('#d1').nextAll() // 同级别下面的所有
$('#d1').nextUntil('.c1') // 直到 class = c1 为止,不包括 c1
$('.c1').prev() // 同级别上一个
$('.c1').prevAll()
$('.c1').prevUntil('#d2')
$('#d2').siblings() // 同级别上下所有
$('#d3').parent() // 第一级父标签
$('#d3').parent().parent() // 父亲的父亲
$('#d3').parents() // 找到祖宗 HTML
$('#d3').parentsUntil('body')
$('#d2').children() // 儿子
$('div p')
// 上面等价于下面
$('div').find('p') // find从某个区域内筛选出想要的标签
// 下面的两两等价
$('div span:first')
$('div span').first()
$('div span:last')
$('div span').last()
$('div span:not("#d3")')
$('div span').not('#d3')
/*
js版本 jQuery版本
classList.add() addClass()
classList.remove() removeClass()
classList.contains() hasClass()
classList.toggle() toggleClass()
*/
// 将第一个 p 标签的颜色变成红色,将它的下一个变成绿色
$('p').first().css('color','red').next().css('color','green')
// jQuery的链式操作 使用jQuery可以做到一行代码操作很多标签
// jQuery对象调用jQuery方法之后返回的还是当前jQuery对象 也就可以继续调用其他方法
.offset() // 相对于浏览器窗口
.position() // 相对于父标签
.scrollTop()
$(window).scrollTop() // // 目前浏览的长度
$(window).scrollTop(0) # 加了参数就是设置
$('p').height() // 文本的高度
$('p').width() // 文本的宽度
$('p').innerHeight() // 文本+padding
$('p').innerWidth()
$('p').outerHeight() // 文本+padding+border
$('p').outerWidth()
/*
操作标签内部文本
js jQuery
innerText text() 括号内不加参数就是获取加了就是设置
innerHTML html()
*/
$('div').text()
$('div').html()
/*
js jQuery
.valu .val()
*/
$('#d1').val()
$('#d1').val('520快乐') # 括号内不加参数就是获取加了就是设置
// 获取文件
$('#d2')[0].files[0] //记两个对象之间的转换
/*
js中 jQuery
setAttribute() attr(name,value)
getAttribute() attr(name)
removeAttribute() removeAttr(name)
在用变量存储对象的时候 js中推荐使用
XXXEle 标签对象
jQuery中推荐使用
$XXXEle jQuery对象
*/
let $pEle = $('p')
$pEle.attr('id')
$pEle.attr('class','c1')
$pEle.removeAttr('password')
/*
对于标签上有的能够看到的属性和自定义属性用attr
对于返回布尔值比如checkbox radio option是否被选中用prop
*/
$('#d2').prop('checked')
$('#d3').prop('checked',true)
// 打印出所有的索引
$('div').each(function(index){console.log(index)})
// 打印所有的索引和对象
$('div').each(function(index,obj){console.log(index,obj)})
// 第二种方式
$.each([111,222,333],function(index,obj){console.log(index,obj)})
// 添加 info = hello world 的键值对
$('div').data('info','hello world')
// 根据键获取信息
$('div').data('info')
// 根据键删除信息
$('div').removeData('info')
按钮克隆
/*
js 函数内的 this 指代函数本身。
*/
<button id="d1">点击,复制我</button>
<script>
$('#d1').on('click',function () {
$(this).clone().insertAfter($('body'))
})
</script>
自定义登录校验
<body>
<p>
username:<input type="text" id="username">
<span style="color: red">span>
p>
<p>
password:<input type="text" id="password">
<span style="color: red">span>
p>
<button id="d1">提交button>
<script>
let $username = $('#username')
let $password = $('#password')
// 点击提交时会判断输入框内是否为空,如果为空则提示用户不能为空
$('#d1').on('click',function (){
let userName = $username.val()
let passWord = $password.val()
if (!userName){
$username.next().text('用户名不能为空')
}
if (!passWord){
$password.next().text('密码不能为空')
}
})
// 聚焦事件,将鼠标放到收入框内触发
$('input').focus(function () {
// 将红色提示字清空
$(this).next().text('')
})
script>
body>
input 框实时监控
<body>
<input type="text">
<script>
$('input').on('input',function () {
console.log($(this).val())
})
script>
body>
hover 事件
<script>
// $("#d1").hover(function () { // 鼠标悬浮 + 鼠标移开
// alert(123)
// })
$('#d1').hover(
function () {
alert('我来了') // 悬浮
},
function () {
alert('我溜了') // 移开
}
)
script>
阻止后续事件
点击它有默认事件:提交用户输入的内容和清空用户输入的内容return false
可以阻止默认事件的发生return false
还可以阻止事件冒泡
<body>
<form>
<span id="d1">span>
<input type="submit" id="d2">
form>
<script>
$('#d2').on('click',function () {
$('#d1').text('hello world')
return false
})
script>
body>
事件委托
<body>
<button>弹窗显示button>
<script>
// $('button').click(function () {
// alert(123)
// })
// 上面的点击事件在动态的新建按钮时触发
// 在指定范围内 将事件委托给某个标签 无论标签是事先写好的还是后面动态创建的
$('body').on('click','button',function () {
alert('hello world')
})
script>
body>
<table class="table table-hover table-striped">
<thead>
<tr>
<th>IDth>
tr>
thead>
<tbody>
{% for book_obj in book_queryset %}
<tr>
<td>{{ book_obj.pk }}td>
<td>
<a href="" class="btn-xs btn btn-primary">编辑a>
td>
tr>
{% endfor %}
tbody>
table>