1. javascript基础
- javascript 在网页中占据很重要的地位
- 解释型语言。与网页交互的语言
- Node.js
- html描述的网页结构、css描述网页样式、js网页交互
- ECMA4.1(浏览器上最多) ECMASript5.0
1. js的引入方式
1.1 行内
- console.log(a)相当于print
//鼠标点击后执行
<p id="" class="" onclick="console.log(2)">onclick</p>
1.2 内嵌
- 可以写在html中的任意位置
- // 单行注释,/**/ 多行注释
<script type='text/javascript'></script>
1.3 外接
<script type='text/javascript' src='js文件路径'></script>
2. js语法(分号结束)
- 变量名是由数字、字母、下划线和$组成
2.1 global 对象
- window
console.log('hello world'); //window.log+tab,window是全局对象
alert('hello world');
var weather = prompt(message:'请输入今天天气');
2.2 基本数据类型(5)
- 基本数据类型:栈存储
- number、字符串、boolean、undefined、 null
var a = 2; //num
var b = '2' + a; // string
var c = true; // boolean
console.log(typeof(a));
var e; //先声明后定义
console.log(e); //值和类型都是undifined
var f = null;
console.log(f) // 类型是undefiend,数值为null
console.log(typeof(f)) //空对象
- 如果s中有其他字符,则会报错NaN
// str转num
var s = '123';
new_s = Number(s);
- 数字转换为字符串
var num = 123;
new_s = num.toString();
2.3 引用数据类型(3)
- heap存储,复杂数据类型
- 把变量置为None即销毁
- 全局作用域、函数作用域
- Array
//Array
var arr = ['henry' 'echo' 'dean'];
// 修改元素
arr[2] = 'diane';
arr.length;
- Object类型
//Object,定义在对象中的函数,即对象的方法
var obj = {name:'echo', age:19,
fav:function(){
console.log(this)
}};
obj.fav()
- 函数类型
- 定义函数方式1
//function,定义在对象中的函数即对象的方法,{}表示作用域,也是对象
function add(形参1, 形参2){
var c = 2;
return a+b;
};
console.log(add{2, 5});
- 函数表达式
var add = function() {
};
- 自执行函数
(function(){})();
2.4 数字和运算符
- ++a 和 a++
//递增、递减
var a = 1;
a += 1;
a++;
console.log(a);
// a++ 的迷惑
var a = 4;
//先赋值后++
var c = a++;
console.log(c);
console.log(a);
// ++a 的迷惑
var a = 4;
//先++后赋值
var c = ++a;
console.log(c);
console.log(a);
2.5 str拼接
var name = 'henry', age = 19;
var str = name + '今年是' + age + '岁';
//es6的模版string,必须是反引号
var str = `${name}今年${age}岁`;
2.6 array
- 解释器遇到var声明的变量,会把var声明的变量提升到全局变量作用域下,js文件最上方
- 函数名也会有此现象,函数中的变量没有
- 数组的创建
var arr = [1, 2, 'henry'];
// 索引取值
arr[0];
// 遍历
// 预解释,变量提升
// var c=2;
for (var i = 0; i < arr.length; i++){
console.log(arr[i]);
}
- 多维数组
- 数组中包含数组的话称之为多维数组。(数组的嵌套)
- 可以通过将两组方括号链接在一起来访问数组中的另一个数组。
arr[2][2]; //取到第二行,第二列
2.7 流程控制
- 与或非
&&;
||;
!;
- If…else
var score = 70;
if (score > 80){
console.log('play');
}else if(score > 60){
console.log('stay at home');
}else{
console.log('study');
};
- switch
var weather = prompt('weather');
switch(weather){
case 'nice':
console.log('nice');
break;
case 'rain':
console.log('rain');
break;
default:
console.log('bye')
break;
}
- == 和 ===
- == 比较的是值,与数据类型无关 2 == '2' 为true
- === 比较的是值和数据类型(即内存地址) 2 === '2' 为false
// true
var a = 1 == '1';
// false
var a = 1 == 2;
var a = 1 == '1';
- 循环
- 初始化循环变量、循环条件、更新循环变量
// for循环
arr = [8, 9, 0]
for (var i = 0; i < arr.length; i++){
}
// while循环
var a = 1;
while (a < 100){
console.log(a);
a++;
}
// do...while
do{
}while(a < 100);
2.8 函数
- 在Javascript中另一个基本概念是函数,它允许你在一个代码块中存储一段用于处理一个任务的代码,然后在需要的时候用一个简短的命令来调用
- 一个函数定义(也称为函数声明,或函数语句)由一些列的function关键字组成。
// function也会有变量提升现象
function fun(){
console.log(arguments);
switch(arguments.length){
case 2:
console.log(2);
break;
case 3:
console.log(3);
break;
default:break;
}
}
fun(1, 2);
fun(3, 4, 5);
- 构造函数new
new Object();
new Array();
new String();
new Number();
3. js常用对象
3.1 object
- 字面量创建方式
var Person = {
name:'henry',
age:19,
fav:function(){
console.log(this);
}
};
Person.fav();
console.log(Person.name);
console.log(Person.age);
- 点语法,set&get
- 函数中的this不一定是widow
- 对象和绑定事件中的this指向当前obj
- 全局this指向window
- 一切皆对象
var obj = {};
obj.name = 'henry';
console.log(obj.name)
obj.fav = function(){
console.log(this); // this 指向obj对象
};
obj.fav();
console.log(this); // this window
- es6用class来创建对象
var obj = {name:'echo'};
var name = 'henry';
function add(x, y){
this.x = x;
this.y = y;
console.log(this.name);
console.log(this);
console.log(x);
console.log(y);
};
add(); // 不可以改变this指向
add.call(obj, 1, 2); // 可以改变this指向
add.apply(null, [1, 2]); // 可以改变this指向
console.dir(add);
- 构造函数创建对象
function Point(x, y) {
this.x = x;
this.y = y;
}
Point.prototype.toString = function () {
return '(' + this.x + ', ' + this.y + ')';
};
var p = new Point(1, 2);
3.2 Array
- new关键字实例化对象
- 构造函数
- 字面量和构造函数
var obj = new Array();
console.log(obj);
var = arr['red', 'yellow', 'green'];
- 检测数组
// if 内只有一行代码是可以省略大括号
if (Array.isArray(arr))
console.log('true');
3.3 Array(10)
- join
var arr = ['red', 'green']
Array.isArray(arr); // 判断arr是否是数组,返回true则是
arr.toString(); // 把数组中内容取出,用逗号拼接
num = 123;
num.toString(); // 数字转字符串
arr.join('||'); // 以||拼接
- 栈方法
push()
pop()
var val = arr.pop(); // 返回删除的内容
console.log(val); // val是pop的返回值
console.log(arr);
console.log(arr.push('xixixi'));; // 返回值为res,最新数组长度
console.log(arr);
- unshift方法
shift()
unshift()
var val = arr.unshift('heiheihei', 'hahaha');// 往数组的前面填充内容
console.log(arr);
console.log(val); // 返回数组最新长度
console.log(arr.shift()); // 删除第一个
- splice
var names = ['henry', 'echo', 'dean'];
var val = names.splice(1, 0, 'diane'); // 在索引1位置添加
console.log(names);
console.log(val);
names.splice(1, 1); // 从索引1位置删除1个值
names.splice(1, 1, 'xixixi'); // 从索引1位置替换1个
- reverse
var num = [5, 2, 3];
num.reverse();
- sort
// 会转换成字符串进行比较
a = [2,1,13,4,56,6, 'henry'];
console.log(a.sort()); // [1, 13, 2, 4, 56, 6, "henry"]
- concat
// 数组拼接,并不改变原来值
var new_num = num.concat(1, 2, 3);
- slice
// 不会更改初始值
num = [1,2,3,4,5,4,3,2,1]
num.slice(5) // 索引5之后的所有值
num.slice(5,7) // 索引5-7 不包扩7
num.slice(-3,-1) // 倒数第三个到倒数第一个
num.slice(-3,-4) // 取不到值
- 位置方法indexOf(0)
- 返回索引
- 查不到返回-1
- lastIndexof();
num = [1,2,3,4,5,4,3,2,1]
var a = num.indexOf(4); // 3
var a = num.lastIndexOf(4); // 5
- 迭代方法
- every
- some
- filter
- map
- forEach
// 回调函数
arr.forEach(function(item, index){
console.log(index);
console.log(item);
});
function fn(){
console.log(arguments); // arguments不是数组,伪数组
for (var i = 0; i < arguments.length; i++){
console.log(arguments[i]);
}
}
fn(2,3,4);
fn.length; // 形参个数
3.4 string方法(11)
- length
s = 'henry';
console.log(s.length);
- charAt(2);
console.log(s.charAt(2));
- charCodeAt(2); 字符编码
console.log(s.charCodeAt(2));
- concat(),继承
console.log(s.concat('&echo'));
- slice(3, 7)
- 索引3-7
s = 'henry&echo';
s.slice(3,7);
- substring(3, 7)
- 索引3-7
s = 'henry&echo';
s.substring(3,7);
- substr(3, 7)
- 取7个
s = 'henry&echo';
s.substr(3,7);
- indexof
s = 'henry&echo';
s.indexof('o'); // 数据类型要一致
- lastIndexof
s = 'henry&echo';
s.lastIndexOf('o'); // 数据类型要一致
- trim
s = ' he nry ';
s.trim();
s.trimLeft();
s.trimRight();
s.trimEnd();
- toLowerCase(), toUpperCase()
s = 'henry';
s.toLowerCase();
s.toUpperCase();
3.5 date内置对像
- 创建日期对象
var time = new Date();
- getDate(): 1-31
time.getDate(); // 返回日期对象的第几天
- getMonth()
time.getMonth(); // 返回月份,需要 + 1
- getFullYear()
time.getFullYear();
- getDay():星期几的第几天,星期天是0
- document.write(getDay());
time.getDay();
- getHours():0-23
time.getHours();
- getMinutes():0-59
time.getMinutes();
- getSeconds():0-59
time.getSeconds();
- 格式化方法 tolocalString
1.time.toString();
// Sun Jun 09 2019 17:13:35 GMT+0800 (CST)
2.time.toLocaleString();
//6/9/2019, 5:13:35 PM
3.time.toDateString();
// "Sun Jun 09 2019"
4.time.toLocaleDateString();
// "6/9/2019"
5.time.toTimeString()
// "17:27:04 GMT+0800 (CST)"
6.time.toLocaleTimeString()
// "5:27:04 PM"
7.time.toGMTString();
// "Sun, 09 Jun 2019 09:27:04 GMT"
- 时间综合示例
var time = new Date();
console.log(time);
console.log(time.getDate());
console.log(time.getFullYear());
console.log(time.getMonth()+1);
console.log(time.getDay());
console.log(time.getHours());
console.log(time.getMinutes());
console.log(time.getSeconds());
console.log(time.toLocaleString()); //2019/6/3 下午11:50:36
var weeks = ['星期天','星期一','星期二','星期三','星期四','星期五','星期六'];
console.log(weeks[date.getDay()]);
var day = weeks[date.getDay()];
document.write(`<a href="#">${day}</a>`)
var a = 1 < 2 ? "yes": "no";
console.log(a);
3.6 三元运算
var a = 1 > 2 ? 'yes': 'no';
3.7 定时器
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<h2 id="time"></h2>
<script>
var timeObj = document.getElementById('time');
console.log(time);
function getNowTime() {
var time = new Date();
var hour = time.getHours();
var minute = time.getMinutes();
var second = time.getSeconds();
var temp = "" + ((hour > 12) ? hour - 12 : hour);
if (hour == 0) {
temp = "12";
}
temp += ((minute < 10) ? ":0" : ":") + minute;
temp += ((second < 10) ? ":0" : ":") + second;
temp += (hour >= 12) ? " P.M." : " A.M.";
timeObj.innerText = temp;
}
setInterval(getNowTime, 20);
</script>
</body>
</html>
3.8 字符串和数值转换(6)
- parseInt('123.123');
var s = '123';
parseInt(s); // 如果s中包含非数字,则只保留其数字部分,第一个字符为非数字则会报NaN
- parseFloat('123.123');
var s = '123.123';
parseFloat(s);
- Var c = 6/0; infinity
var c = 6/0; // 会出现infinity
- Number('123ad')
Number('123d'); // NaN: not a number
Number('123');
- String(123);
String(123);
- toString(123);
var a = 2;
a = a + '';
// 或者
a.toString();
3.9 Math
- Math.E
- Math.LN10
- min(), max()
arr = [1,2,3,4,5]
var max = Math.max.apply(null, arr);
- Math.ceil(), Math.floor(), Math.round():四舍五入
var num = 25.7;
var num2 = 25.2;
alert(Math.ceil(num)); //26
alert(Math.floor(num)); //25
alert(Math.round(num)); //26
alert(Math.round(num2)); //25
- random :(0-1)
- 产生min-max之间的随机数
function random(lower, upper) {
return Math.floor(Math.random() * (upper - lower)) + lower;
}
3.10 Global对象
- 不属于任何其他对象的属性和方法,最终都是window的属性和方法
- isNaN()、isFinite()、parseInt()以及 parseFloat(),实际上全都是 Global 对象的方法。
- Global 对象还包含其他一些方法。
- window.say
- encodeURI(Componet)
- 一般来说,我们使用 encodeURIComponent()方法的时候要比使用 encodeURI()更多,因为在实践中更常见的是对查询字符串参数而不是对基础 URI 进行编码。
var url = 'https://www.bai du.com';
var a1 = encodeURI(url);
var a2 = encodeURIComponent(url);
console.log(a1);
console.log(a2);
console.log(decodeURI(a1));
console.log(decodeURIComponent(a2))
// 使用 encodeURI()编码后的结果是除了空格之外的其他字符都原封不动,只有空格被替换成了 %20。
// 而 encodeURIComponent()方法则会使用对应的编码替换所有非字母数字字符
3.11 window
var color = "red";
function sayColor(){
alert(window.color);
}
window.sayColor(); // red
3.12 示例
- 获取随机颜色
// 获取0-256之间的随机数
function random(min, max){
return min + Math.floor(Math.random() * max);
}
function randomColor(){
var r = random(0, 256),
g = random(0, 256),
b = random(0, 256);
return `rag(${r},${g},${b} )`;
}
var color = randomColor();
console.log(color);
- 随机验证码
function creationCode(){
var code = '';
var code_l = 4;
var s_code = Array(0,1,2,3,4,5,6,7,8,9,'A','B','C','D','E','F','G','H','I','J','K','L','M','N','O','P','Q','R', 'S','T','U','V','W','X','Y','Z');
for (var i = 0; i < code_l; i++){
s = s_code[random(0,37)]
code += s;
}
return code;
}
var code = creationCode();
console.log(code);
2. BOM&DOM
1. BOM
- browser object model
- 系统对话框
- 顶层对象是window(核心对象)
1.1 alert()
var a = window.alert('确定离开了');
1.2 confirm()
// 有返回值,确定为true或取消为false
var a = window.confirm('确定删除?');
1.3 prompt()
var a = window.promopt('今天天气怎么样?')
1.4 定时方法(重点)
- 一次性任务
- setTimeout()
// 延时2秒,异步、非阻塞
var i = 0;
timer = setTimeout(function(){
console.log('hello world');
}, 2000);
// 清除定时器
clearTimeout(timer);
timer = setTimeout(function(){
console.log('test your speed');
}, 2000);
console.log('看看阻不阻塞')
- 周期性循环
- 垃圾回收机制,这里回收不了
- 网页动画
var i = 0;
timer = setInterval(function(){
i++;
console.log(i);
if (i === 10){
// 清除定时器
clearInterval(timer);
}
}, 1000);
1.5 Location对象
- window中的属性
- 浏览器自带缓存和记录功能
- hash模式:带#
- histroy模式:不带#
console.log(window.location);
console.log(window.location.host);
console.log(window.location.hostname);
console.log(window.location.herf);
console.log(window.location.origin);
console.log(window.location.port);
// console.log(window.location.reload());
reload: f reload(); // 方法
location.reload();
- ajax在不重载页面的情况下,对网页就进行操作
// 刷新
setInterval(function(){
// 一般用于测试
// ajax用于局部刷新
locatoin.reload();
}, 2000);
2. DOM
- document object model
- 对象:用户自定义对象、内建对象(native object)、宿主对象(window)(浏览器提供)
- node节点。元素节点(p, a, div...)
- 节点对象(元素节点(属性节点)(文本节点) (注释节点))
- document.body document.documentElement
2.1 获取元素节点(3)
- window.document
- 通过id获取单个节点对象
var box = document.getElementById('box');
console.log(box);
console.dir(box); // 查看box所有属性和方法
- 通过标签获取节点对象
- 结果为伪数组
var box = document.getElementsByTagName('div');
// 使用拍它思想,操作标签,点击任意一个改变样式,即改变类名
var li = document.getElementsByTagName('li');
for (var i = 0; i < li.length; i++){
// console.log(li[i]);
// 这里的this指向当前对象
this.onclick = function(){
for (var j = 0; j < li.length; j++){
this.className = '';
}
this.className='active-li';
};
- 通过类名获取
var lis = document.getElementsByClassName('active');
// 通过id获取时,
var box = document.getElementById('box');
console.log(box.children);
- 事件
- onclick()
- onmouseover()
- onmouseout()
2.2 文档、body、html
// 当前文档啊
console.log(document);
// html中的body
console.log(document.body);
// html
console.log(document.documentElement);
2.3 样式操作
// 属性全部使用驼峰式
box.style.color
box.style.backgroudColor
- 或者通过类名,利用索引找到具体某一个元素
var box = window.document.getElementById('box');
console.log(box);
// 绑定事件
box.onmouseover = function(){
this.style.backgroundColor = 'red';
}
box.onmouseout = function(){
this.style.backgroundColor = 'yellowgreen';
}
- flag标志
var isRed = true;
// 绑定事件
box.onclick = function(){
if (isRed){
this.style.backgroundColor = 'yellow';
isRed = false;
}else{
this.style.backgroundColor = 'red';
isRed = true;
}
}
// 设置周期定时, 此时不能用this,因为this指向window
setInterval (function(){
if (isRed){
box.style.backgroundColor = 'yellow';
isRed = false;
}else{
box.style.backgroundColor = 'red';
isRed = true;}
},1000);
2.4 属性设置(2)
- 追加类
var p = window.document.getElementById('p1');
console.dir(p);
p.className += ' b';
// 会覆盖之前的类
p.className = 'b';
- 设置属性方法
setAttribute(name, value);
getAttribute(name);
var p = document.getElementById('p1');
p.setAttribute('class', 'active');
// 自定义属性设置,只能在节点对象上
p.setAttribute('self', 'active');
// 不会显示到页面中的elements中
p.self = '123';
p.class;
p.title;
- 示例
var p = window.document.getElementById('p1');
console.dir(p);
// p.className += ' b';
// p.className = 'b';
p.self = '123';
// p.setAttribute('self', 'active');
isTrue = true;
p.onmouseover = function(){
if (isTrue){
this.className += ' b';
isTrue = false;
}else{
this.className = 'a';
isTrue = true;
}
}
2.5 节点操作
var ul = document.getElementById('box');
// 创建节点
var li1 = document.createElement('li');
var li2 = document.createElement('li');
// 只设置文本
li1.innerText = '123';
// 设置li中的html内容
li1.innerHTML = '<a herf = ''>123</a>';
// 设置类名
l1i.setAttribute('class', 'active');
// 设置样式
li1.children[0].style.color = 'red';
li1.children[0].style.fontSize = 20px;
// 追加节点
ul.appendChild(li1);
// 在li1前插入li2
ul.insertBefore(li2, li1);
// 删除节点
ul.removeChild(li1);
- 示例
var box = document.getElementById('box');
// 创建节点对象
var li1 = document.createElement('li');
var li2 = document.createElement('li');
// 设置节点内容和属性(2中设置内容方式)
li1.innerText = '123';
li1.innerHTML = "<a href=''>456</a>";
li1.setAttribute('class', 'active')
// 添加节点到父节点
box.appendChild(li1);
box.insertBefore(li2, li1);
// 删除孩子节点li1
box.removeChild(li1);
2.6 遍历操作节点
var data = [
{id:1, name:'henry', age:19},
{id:2, name:'echo', age:18},
{id:3, name:'dean', age:28},
{id:4, name:'oleg', age:26},
{id:5, name:'diane', age:27}
]
for (var i = 0; i < data.length; i++){
console.log(data[i].name);
var li = document.createElement('li');
li.innerHTML = `<p>${data[i].id}</p> <p>${data[i].name}</p><p>${data[i].age}</p>`;
box.appendChild(li)
}
2.7 示例
var box = document.getElementById('imgBox');
var prev = document.getElementById('prev');
var next = document.getElementById('next');
num = 1;
next.onclick = function(){
nextImg();
}
function nextImg(){
if (num===4){
num = 1;
}
imgBox.src = `images/${num}.jpg`;
num++;
}s
setInterval(function(){
nextImg();
}, 1000);
3. 节点属性
- 在文档对象模型(DOM)中,每一个节点都是一个对象。DOM节点有三个重要的属性:
- nodeName: 节点的名称
- nodeValue:节点的值
- nodeType: 节点的类型
3.1 nodeName属性
- 节点的名称,是只读
- 元素节点的nodeName与标签名相同
- 属性节点的nodeName与属性的名称相同
- 文本节点的nodeName永远是#text
- 文档节点的nodeName永远是#document
3.2 nodeValue属性
- 节点的值
- 元素节点的 nodeValue 是 undefined 或 null
- 文本节点的 nodeValue 是文本自身
- 属性节点的 nodeValue 是属性的值
3.3 nodeType 属性
- 节点的类型,是只读的。
以下常用的几种结点类型:
元素类型 | 节点类型 |
---|---|
元素 | 1 |
属性 | 2 |
文本 | 3 |
注释 | 8 |
文档 | 9 |
- attributes属性是获取到该节点对象上的所有属性的集合
- childNodes属性是获取到该节点对象的所有子节点的集合
3.4 示例
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>节点属性</title>
</head>
<body>
<div id="box">我是一个文本节点<!-- 我是注释 --></div>
<script type="text/javascript">
// 1.获取元素节点
var divNode = document.getElementById('box');
console.log(divNode.nodeName + '|' + divNode.nodeValue + "/" + divNode.nodeType);
// 2.获取属性节点
var attrNode = divNode.attributes[0];
console.log(attrNode.nodeName + '|' + attrNode.nodeValue + "/" + attrNode.nodeType);
// 3.获取文本节点
var textNode = divNode.childNodes[0];
console.log(textNode.nodeName + '|' + textNode.nodeValue + "/" + textNode.nodeType);
// 4.获取注释节点
var commentNode = divNode.childNodes[1];
console.log(commentNode.nodeName + '|' + commentNode.nodeValue + "/" + commentNode.nodeType);
// 5.文档节点
console.log(document.nodeName + '|' + document.nodeValue + "/" + document.nodeType);
</script>
</body>
</html>
- onchange
- onselect
- onsubmit
- onload
- onfocus
- onblur
3. jquery
1. jQuery
- bootstrap(twitter)
- bootCDN(前端,在线外接资源)
- vue:没有html结构(ssr、nuxt)
1.1 简介
- html文档遍历和操作、事件处理、动画和Ajax
- 操作:获取节点元素、属性、样式、类名、节点对象创建删除添加和替换
- 基于面向对象、封装大量方法到对象(长度属性)
- js包含jQery(write less,do more)
1.2 jquery的使用
- jquery.js(开发) / jquery.min.js(生产)
- 生产环境会对代码优化
- jquery.min.js代码文件大小会进行压缩
- 严格模式和非严格模式(this指向问题)
// 非严格模式
function fn(){
// this是window
console.log(this);
}
// 严格模式
function fn(){
'use strict';
// this是undifinded
console.log(this);
}
- 基础选择器
- id、类、标签
console.dir($); // jquery包含大量方法的对象
console.log($('#box')); // jquery对象,伪数组
console.log($('#box')[0]); // jquery对象转节点对像
var box = document.getElementById('box'); // js对象
$(box); // js转jq对象
- 高级选择器
- 子代、后代、组合、交集
- 没有值代表没有获取到
console.log($('.box>p')) // 子代选择器,jquery对象
console.log($('.box>p')[1])
// 组合选择器
$('box,active')
// 交集选择器
$('div.active')
// js对象
console.log($('input[type=text]')); // 属性选择器
- 绑定事件
- 样式操作是css方法
- $('#box.active').click(function(){})
- 绑定事件中的this指向当前的对象
$('#box.active').click(function(){
// this指向当前js节点对象
console.log(this);
// 样式操作
this.style....
// js转换为jq,操作样式,不会覆盖
$(this).css('color', 'red');
$(this).css('font-size'(或使用驼峰), '20px');
// 或使用对象传值,遍历对象进行赋值
$(this).css({'color':'red', 'font-size':40});
console.log($(this).css('color'));
});
- 样式修改之css()
- css('color'):是获取属性
- css({'color':'red', …}):设置属性
// 单独设置样式。不同种类的样式不会覆盖
$(this).css('font-size', '40px');
$(this).css('color','lightblue');
// 共同设置样式
$(this).css({
'font-size':'40px',
'color':'red',
})
// 获取属性值
console.log($(this).css('color'));
- 过滤选择器
// eq,gt,lt,odd,even,first,last
console.log($('ul li')[1]; // js对象
console.log($('ul li:eq(1)')); // jq对象
console.log($('ul li:gt(1)')); // 。。。
console.log($('ul li:lt(1)')); // 。。。
console.log($('ul li:odd')); // 。。。
console.log($('ul li:even')); // 。。。
console.log($('ul li:first')); // 。。。
console.log($('ul li:last')); // 。。。
- 筛选选择器
- find、children、parent
- 获取索引方法:$(选择器).index()
// 选中后代所有的span/a .find()
console.log($('ul').find('span'));
console.log($('ul').find('a'));
// 选中子代中的元素
console.log($('ul').children());
// parent(), document-html-body-...
console.log($('span').parent());
//
console.log($('ul li').eq(1));
// siblings(),实现选项卡,排他性
console.log($('li').addClass('active').siblings('button').removeClass('active'));
// 当前点击元素索引
var index = $(this).index();
$('p').eq($(this).index()).addClass('active').siblings('p').removeClass('active')
- 链式编程
console.log($('span').parent().parent().parent().parent().parent());
- 选项卡
- let可以把this限制在局部作用域中
// 选项卡方法一
for (var i = 0; i < btns.length; i++){
btns[i].index = i;
btns[i].onclick = function(){
for (var j = 0; j < btns.length; j++){
// console.log(this);
btns[j].className = '';
p[j].className = '';
}
this.className = 'active';
p[this.index].className = 'active';
}
}
// 选项卡方法二
for (let i = 0; i < btns.length; i++){
btns[i].onclick = function(){
for (var j = 0; j < btns.length; j++){
btns[j].className = '';
p[j].className = '';
}
this.className = 'active';
p[i].className = 'active';
}
}
- jq实现选项卡
- addClass('类1 类2...')
- removeClass('类1 类2...')
- toggoleClass('类'):开关式切换类名
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>jq实现选项卡</title>
<style type="text/css">
button.active{
color: red;
}
p{
display: none;
}
p.active{
display: block;
}
</style>
</head>
<body>
<button class="active">热门</button>
<button>电脑影音</button>
<button>电脑</button>
<button>家电</button>
<p class="active">热门</p>
<p>电脑影音</p>
<p>电脑</p>
<p>家电</p>
<script type="text/javascript" src="js/jquery.js"></script>
<script type="text/javascript">
console.log($('button'));
$('button').click(function(){
// 处理点击的选项卡
console.log($(this));
$(this).addClass('active').siblings('button').removeClass('active');
// 获取当前对象的索引
console.log(($(this).index()));
$('p').eq($(this).index()).addClass('active').siblings('p').removeClass('active');
});
</script>
</body>
</html>
2. 动画
2.0 操作值的方法
- $('#btn').text('显示'):修改btn的text内容为显示
- 没有参数则是获得
- $('#btn').html(
hello
)- html():既获得标签,又获得文本
- $('#btn').val()
- 只针对于表单控件
2.1 show/hide(毫秒,回调)
- 左上角,改变宽高
$('#button').click(function(){
// $('#box').show(2000);
if($(this).text() === '显示'){
$('#box').show(2000 function(){
$('#button').text() === '隐藏');
});
})else{
$(this).text() === '显示');
$('#box').hide(2000);
}
2.2 slideDown/Up(毫秒,回调)
- 卷帘门,只改变盒子的高度
// 在开启定时器时,需要先停止之前的定时器
$('#box').stop().toggle(2000);
$('#box').slideDown(2000);
$('#box').slideUp(2000);
2.3 fadeIn/Out(毫秒,回调)
- 淡入淡出,快速显示,通过透明度控制
- opacity:0-1 透明(0)
$('#box').fadeIn(2000);
$('#box').fadeOut(2000);
// 动画不支持背景色,需要插件支持
$('#box').animater([params], speed, callback);
2.4 toggle(毫秒,回调)
- 动画开关
- slideToggole()
$('#box').toggle(2000, function(){});
2.5 自定义动画
- animate({样式属性},毫秒,callback())
- display中的block和none的切换
<!DOCTYPE html>
<html>
<head lang="en">
<meta charset="UTF-8">
<title></title>
<style>
div {
position: absolute;
left: 20px;
top: 30px;
100px;
height: 100px;
background-color: green;
}
</style>
<script src="js/jquery.js"></script>
<script>
jQuery(function () {
$("button").click(function () {
var json = {"width": 500,
"height": 500,
"left": 300,
"top": 300,
"border-radius": 100};
var json2 = {
"width": 100,
"height": 100,
"left": 100,
"top": 100,
"border-radius": 100,
"background-color": "red"
};
//自定义动画
$("div").animate(json, 1000, function () {
$("div").animate(json2, 1000, function () {
alert("动画执行完毕!");
});
});
})
})
</script>
</head>
<body>
<button>自定义动画</button>
<div></div>
</body>
</html>
4. jquery之ajax
1. 属性操作
1.1 attri/removeAttr
- setAttribute/get...
- 只能获取标签上的属性
// 文档加载jq中
$(document).ready(function(){$('p')});
// 文档加载完成后,调用回调函数,无覆盖现象
jQuery(function(){});
$(function(){
$('p').attr('title', 'henry');
$('p').attr({'title':'henry',
'color':'red'});
// 获得属性,需要一个属性名
$('p').attr('title');
// 移除(一个或多个)
$('p').removeAttr('title id a');
});
// js中使用,js中的事件有覆盖现象
window.onload = function(){
console.log(222);
};
window.onload = function(){
console.log(111);
}
1.2 prop/removeProp
- 只能在对象内部可以看到(console中)
- 用于input
- 获取当前对象的属性
$(function(){
$('input[type=radio]').eq(0).prop('checked');
$('input[type=radio]').eq(0).prop('type');
// 只能操作标签上的属性
$('input[type=radio]').eq(0).attr('a', 1);
// 可以操作对象内部的属性
$('input[type=radio]').eq(0).prop('type');
});
1.3 h5
- jq22.com
<h2>视频</h2>
<video width="" height="" controls="controls">
<source src="知乎.mp4" type="video/mp4"></source>
</video>
// controls表示播放按钮
<h2>音频</h2>
<audio src="海贼王%20-%20ビンクスの酒(独唱).mp3" controls="controls">音频</audio>
2. 文档方法
2.1 插入
- append
- 父元素.append(子元素);
- 通常谁调用返回值就是那个对象
$('#box').append('henry');
// 追加一个标签
$('#box').append('<h2>echo</h2>');
$('#box').append(js对象);
// 如果参数是jq对象相当于移动操作
$('#box').append(jq对象);
- appendTo
- 子元素.appendTo(父元素);
$('<a href="">百度一下 </a>').appendTo('#box');
// 链式编程思想,可以直接修改样式
$('<a href="">百度一下 </a>').appendTo('#box').css('yellow');
- prepend
- 前置添加
- 用户最新数据的插入(博客园)
$('#box').prepend('<h2>echo</h2>');
- prependTo
- 前置添加
$('<a href="">百度一下 </a>').prependTo('#box');
- before/after
$('h2').before('henry');
- insertBefore/After
$('<a href="">百度一下 </a>').insertBefore('h2');
2.2 替换
- replace
- 创建一个标签并替换
$('#box ul').replaceWith('<a href="">百度一下</a>');
// .replaceAll()和.replaceWith()功能类似,但是目标和源相反。
$('<a href="">百度一下</a>').replaceAll('#box ul');
2.3 删除
- remove
- 既移除标签又移除事件
// 删除
$('button').click(function(){
alert(111);
$(this).css('color', 'red');
$('#box').append($(this).remove());
})
2.4 detach
- 保留事件
// 不删除事件
$('button').click(function(){
alert(111);
$(this).css('color', 'red');
$('#box').append($(this).detach());
})
2.5 清空
$('#box').empty();
$('#box').html('');
3. 事件
3.1 click()
- 单击事件
3.2 dblclick()
- 双击事件
- 解决单双击的冲突问题
- setTimeout
3.3 mousedown()/up()
- 鼠标按下/弹起触发事件
3.4 mouseover()/out()
- 父元素设置,会波及到自元素
- 鼠标穿过父元素和子元素都会调用
$('#box').mouseover(function(){
console.log('进来了');
})
$('#box').mouseout(function(){
console.log('出去了');
})
// mouseover的传播效应
$('#box').mouseover(function(){
console.log('进来了');
$('#child').stop().slideDown(1000);
})
$('#box').mouseout(function(){
console.log('出去了');
$('#child').stop().slideUp(1000);
})
3.5 mouseenter()/leave()
- 鼠标移入、移出事件
- 只对绑定元素有效
- 使用动画时,先使用stop()在使用动画
// mouseenter
$('#box').mouseenter(function(){
console.log('进来了');
$('#child').stop().slideDown(1000);
})
$('#box').mouseleave(function(){
console.log('出去了');
$('#child').stop().slideUp(1000);
})
3.6 合成事件
$('#box').hover(function(){
},function(){})
3.7 聚焦和失焦
// 默认加载页面,聚焦
$('input[type=text]').focus();
// 聚焦事件
$('input[type=text]').focus(function(){
console.log('聚焦了');
})
// 失焦事件
$('input[type=text]').blur(function(){
console.log('失焦了');
})
3.8 键盘按下
- e为jQuery对像,称为jq事件对象
- keyCode为按键的code
$('input[type=text]').keydown(function(e){
console.log(e.keyCode);
switch (e.keyCode){
case 8:
$(this).val('');
break;
default:
break;
}
})
3.9 change
- 表单元素发生改变
3.10 select
3.11 submit
- 表单提交事件,默认的表单提交会优先响应
- sumit会触发form中的action行为
- preventDefault
// 阻止默认事件方法1
<a href='javascript:void(0);'>;
<a href='javascript:;'>;
<form action='javascript:;'>;
// 阻止默认事件方法2
<script type="text/javascript">
$('form').submit(function(e){
e.preventDefault();
console.log('11111');
})
</script>
4. ajax的使用
- 绑定事件需要等待响应后
- 请求头/体
- 响应头/体
- XHR
- ajax实现前后端分离
4.1 ajax的使用
// ajax,只针对与当前页面的局部进行刷新
var name = $('input[type=text]').val();
var pwd = $('input[type=password]').val();
$.ajax({
url:'',
method:'post';
data:{
a:name,
b:pwd
},
success:function(res){
// {data:200}
if (res.data==200){
setTimeout(function(){
windown.open('网址', '_self')
},3000)
}
}
});
4.2 ajax实例
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title></title>
<script src="js/jquery.js" type="text/javascript" charset="utf-8"></script>
</head>
<body>
<div id="box">
</div>
<script type="text/javascript">
$(function(){
$.ajax({
url:'https://api.apeland.cn/api/banner/',
methods:'get',
success:function(res){
console.log(res);
// 根据响应中的data,判断响应是否成功,以及就数据进行操作
if (res.code === 0 ){
var name = res.data[0].name;
var cover = res.data[0].cover;
$('#box').append(`<img src=${cover} alt=${name}>`);
}
},
// 出现错误时的操作
err:function(err){
console.log(err);
},
})
})
</script>
</body>
</html>
- ajax练习
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>ajax练习</title>
<script src="js/jquery.js" type="text/javascript" charset="utf-8"></script>
</head>
<body>
<div id="box">
<ul type='none'></ul>
</div>
<div id="content">
<ul></ul>
</div1>
<script type="text/javascript">
// 获取导航头
$.ajax({
url:'https://www.luffycity.com/api/v1/course_sub/category/list/',
methods:'get',
success:function(res){
console.log(res);
$(`<li style='font-weight:bold')>全部</li>`).appendTo('#box ul').attr('id', 0);
if (res.error_no===0){
res.data.forEach(function(item,index){
$(`<li type='none' style='font-weight:bold')>${item.name}</li>`).appendTo('#box ul').attr('id', item.id);
})
}
}
})
// 获取课程
var sub_category = 0;
function get_course_list(sub_category){
$.ajax({
url:`https://www.luffycity.com/api/v1/courses/?sub_category=${sub_category}&ordering=`,
method:'get',
success:function(res){
$('#content ul').empty();
if (res.error_no===0){
res.data.forEach(function(item, index){
$(`<li>${item.name}</li>`).appendTo('#content ul').attr('id', item.id);
})
}
}
})
}
get_course_list(sub_category);
// jq中的事件委托
$('#box ul').on('click', 'li', function(){
var sub_category = $(this).attr('id');
get_course_list(sub_category);
});
</script>
</body>
</html>