JavaScript学习-入门篇
JavaScript的运行环境
开发环境就是开发JavaScript代码所需的环境,一般建议新手刚刚开始使用一些记事本工具(如sublime、editPlus、VScode),锻炼代码的手感。等学习到一定阶段,就可以使用集成开发工具IDE(如:Hbuilder、webstrom)。
js和HTML、css都是web前端的三大基本组件(也就是web前端三剑客),都是运行在浏览器上,所以只需要存在浏览器即可,同样的建议:使用Chrome浏览器。
基本语法
2.1 JavaScript的语法结构
if (condition) {// 代码块console.log("Condition is true");
} else {// 另一个代码块console.log("Condition is false");
}
var a = 10, b = 20; // 使用逗号分隔变量声明
console.log(a, b); // 使用逗号分隔参数
2.2 注释的使用
单行注释,使用双斜杠 // 开始单行注释。注释从双斜杠开始到该行结束。
多行,使用 /* 开始多行注释,使用 / 结束多行注释。
文档注释(通常以 /* 开始)用于生成文档或帮助工具可以理解的注释。这些注释通常包含函数、类或模块的描述。
2.3 变量和数据类型
变量用于存储数据值,可以在程序的执行过程中被读取和修改。
定义变量
使用 var、let 或 const 关键字来定义变量。var 是传统的变量声明方式,而 let 和 const 提供了更严格的变量作用域和不可变性。
var x = 10; // 使用 var 声明变量
let y = 20; // 使用 let 声明变量
const z = 30; // 使用 const 声明常量
声明变量时的注意事项
使用 var 声明的变量具有函数作用域或全局作用域。
使用 let 和 const 声明的变量具有块作用域。
const 声明的变量是不可变的,一旦赋值就不能再被改变。
2.4 基本数据类型与引用数据类型
基本数据类型
基本数据类型包括数值(Number)、字符串(String)、布尔值(Boolean)、null、undefined 和 NaN。
数值:表示数字,可以是整数或浮点数。
字符串:由字符组成的文本,用单引号、双引号或反引号(`)包围。
布尔值:只有两个值,true 和 false。
null:表示“无”,通常用于表示变量被初始化但尚未赋值。
undefined:表示变量未定义或未赋值。
NaN:表示“非数字”,通常在执行无效的数学运算时返回。
var num = 10; // 数值
var str = "Hello"; // 字符串
var bool = true; // 布尔值
var n = null; // null
var u; // undefined
var nan = NaN; // NaN
引用数据类型
引用数据类型包括数组(Array)和对象(Object)。
数组:用于存储多个值的有序集合。
对象:用于存储键值对集合。
var arr = [1, 2, 3]; // 数组
var obj = { name: "John", age: 30 }; // 对象
数据类型转换
JavaScript是弱类型语言,可以自动或手动转换数据类型。
自动类型转换:在某些操作中,JavaScript会自动将数据类型转换为另一种类型。
强制类型转换:使用 parseInt、parseFloat 等函数可以将字符串转换为数值类型。
var a = "10"; // 字符串
var b = parseInt(a); // 强制转换为数值
console.log(b); // 输出 10
运算符和表达式
3.1 算术运算符
算术运算符用于对数值进行数学运算。
基本算术运算符
加法(+):用于数值相加或连接字符串。
减法(-):用于数值相减。
乘法(*):用于数值相乘。
除法(/):用于数值相除,结果为浮点数。
取模(%):返回除法的余数。
var a = 10;
var b = 3;
console.log(a + b); // 13
console.log(a - b); // 7
console.log(a * b); // 30
console.log(a / b); // 3.3333333333333335
console.log(a % b); // 1
指数运算符(**)
ES2016引入了指数运算符,用于计算幂。
console.log(2 ** 3); // 8
3.2 关系运算符
关系运算符用于比较两个值。
等于(==):比较值是否相等,不考虑类型。
严格等于(===):比较值和类型是否都相等。
不等于(!=):比较值是否不相等,不考虑类型。
严格不等于(!==):比较值和类型是否都不相等。
大于(>):比较左侧值是否大于右侧值。
小于(<):比较左侧值是否小于右侧值。
大于等于(>=):比较左侧值是否大于或等于右侧值。
小于等于(<=):比较左侧值是否小于或等于右侧值。
console.log(10 == '10'); // true
console.log(10 === '10'); // false
console.log(10 != '10'); // false
console.log(10 !== '10'); // true
console.log(10 > 5); // true
console.log(10 < 5); // false
console.log(10 >= 10); // true
console.log(10 <= 5); // false
3.3 逻辑运算符
逻辑运算符用于组合多个条件。
逻辑与(&&):如果所有条件都为真,则结果为真。
逻辑或(||):如果至少一个条件为真,则结果为真。
逻辑非(!):反转条件的真假值。
var a = 10;
var b = 20;
console.log(a > 5 && b < 30); // false
console.log(a > 5 || b < 30); // true
console.log(!(a > 5)); // false
3.4 赋值运算符
赋值运算符用于将值赋给变量。
简单赋值(=):将右侧的值赋给左侧的变量。
加法赋值(+=):将右侧的值加到左侧变量的值上,然后赋值给左侧变量。
减法赋值(-=):将右侧的值从左侧变量的值中减去,然后赋值给左侧变量。
乘法赋值(*=):将右侧的值乘以左侧变量的值,然后赋值给左侧变量。
除法赋值(/=):将左侧变量的值除以右侧的值,然后赋值给左侧变量。
取模赋值(%=):将左侧变量的值除以右侧的值,然后取余数赋值给左侧变量。
指数赋值(**=):将左侧变量的值提升到右侧的幂,然后赋值给左侧变量。
var a = 10;
a += 5; // a = a + 5
console.log(a); // 15
a -= 3; // a = a - 3
console.log(a); // 12
a *= 2; // a = a * 2
console.log(a); // 24
a /= 4; // a = a / 4
console.log(a); // 6
a %= 3; // a = a % 3
console.log(a); // 0
a **= 2; // a = a ** 2
console.log(a); // 0
3.5 自增自减运算符
自增自减运算符用于增加或减少变量的值。
自增(++):将变量的值增加1。
自减(--):将变量的值减少1。
自增和自减运算符有前缀和后缀两种形式。
前缀(++i 或 --i):先增加或减少变量的值,然后返回变量的值。
后缀(i++ 或 i--):先返回变量的值,然后增加或减少变量的值。
var a = 10;
console.log(++a); // 11
console.log(a); // 11
console.log(a++); // 11
console.log(a); // 12
流程控制语句
4.1 条件语句(if…else)
条件语句用于基于特定条件执行不同的代码块。
if 语句
if 语句在条件为真时执行代码块。
var age = 18;
if (age >= 18) {console.log("成年人");
}
if…else 语句
if…else 语句在条件为真时执行一个代码块,在条件为假时执行另一个代码块。
if…else if…else 语句
if…else if…else 语句可以检查多个条件。
var score = 85;
if (score >= 90) {console.log("优秀");
} else if (score >= 75) {console.log("良好");
} else if (score >= 60) {console.log("及格");
} else {console.log("不及格");
}
switch 语句
switch 语句用于基于变量的值执行不同的代码块。
var day = "Monday";
switch (day) {case "Monday":console.log("开始新的一周");break;case "Friday":console.log("快到周末了");break;case "Sunday":console.log("休息日");break;default:console.log("普通的一天");
}
4.2 循环语句(for、while、do…while)
循环语句用于多次执行代码块,直到满足特定条件。
for 循环
for 循环在开始之前初始化变量,然后检查条件,如果条件为真,则执行代码块,并在每次循环结束时更新变量。
for (var i = 0; i < 5; i++) {console.log(i);
}
while 循环
while 循环在每次循环开始时检查条件,如果条件为真,则执行代码块。
var i = 0;
while (i < 5) {console.log(i);i++;
}
do…while 循环
do…while 循环至少执行一次代码块,然后检查条件,如果条件为真,则继续执行循环。
var i = 0;
do {console.log(i);i++;
} while (i < 5);
4.3 跳转语句(break、continue)
跳转语句用于控制循环的执行流程。
break 语句
break 语句用于立即退出循环。
for (var i = 0; i < 10; i++) {if (i === 5) {break;}console.log(i);
}
continue 语句
continue 语句用于跳过当前循环的剩余代码,并开始下一次循环。
for (var i = 0; i < 10; i++) {if (i % 2 === 0) {continue;}console.log(i);
}
JavaScript进阶
函数
5.1 函数的定义和调用
函数是JavaScript中封装代码的块,用于执行特定的任务。
定义函数
函数使用 function 关键字定义,后跟函数名、参数列表和函数体。
function greet(name) {console.log("Hello, " + name + "!");
}
调用函数
函数通过函数名和括号调用,括号中可以传递参数。
greet("World"); // 输出 "Hello, World!"
5.2 函数参数和返回值
函数可以接受参数,并且可以返回值。
参数
参数是函数调用时传递给函数的值。
function add(a, b) {return a + b;
}
返回值
return 语句用于从函数返回值。
var sum = add(3, 4); // sum 等于 7
5.3 匿名函数和箭头函数
匿名函数
匿名函数是没有名称的函数,通常用作回调函数。
var greet = function(name) {console.log("Hello, " + name + "!");
};
箭头函数
箭头函数是ES6引入的一种更简洁的函数语法。
var greet = (name) => {console.log("Hello, " + name + "!");
};
箭头函数可以省略参数括号(如果只有一个参数)和大括号(如果函数体只有一行代码)。
var add = (a, b) => a + b;
5.4 递归函数
递归函数是调用自身的函数。
递归示例
计算阶乘的递归函数。
function factorial(n) {if (n === 0) {return 1;} else {return n * factorial(n - 1);}
}
递归函数需要一个退出条件,以避免无限递归。
数组和对象
6.1 数组的基本操作
数组是一种特殊的数据结构,用于存储多个值。
创建数组
可以使用数组字面量或 Array 构造函数创建数组。
var fruits = ["Apple", "Banana", "Cherry"];
var numbers = new Array(1, 2, 3, 4, 5);
访问数组元素
使用索引访问数组元素,索引从0开始。
console.log(fruits[0]); // 输出 "Apple"
数组长度
使用 length 属性获取数组的长度。
console.log(fruits.length); // 输出 3
数组方法
JavaScript提供了许多数组方法,如 push、pop、shift、unshift、slice、splice 等。
fruits.push(“Date”); // 添加元素到数组末尾 fruits.pop(); // 移除数组末尾的元素
fruits.shift(); // 移除数组开头的元素 fruits.unshift(“Elderberry”); //
添加元素到数组开头 var partOfFruits = fruits.slice(1, 3); // 返回数组的一个片段
fruits.splice(1, 1); // 移除数组中的一个元素
6.2 对象的创建和属性访问
对象是一种存储键值对的数据结构。
创建对象
可以使用对象字面量或 new Object 创建对象。
var person = {name: "John",age: 30,greet: function() {console.log("Hello, my name is " + this.name);}
};
var person = new Object();
person.name = "John";
person.age = 30;
person.greet = function() {console.log("Hello, my name is " + this.name);
};
访问对象属性
使用点符号或方括号访问对象属性。
console.log(person.name); // 输出 "John"
console.log(person["age"]); // 输出 30
访问对象方法
访问对象方法与访问属性类似。
person.greet(); // 输出 "Hello, my name is John"
6.3 构造函数和原型链
构造函数
构造函数是一种特殊的方法,用于创建和初始化对象。
function Person(name, age) {this.name = name;this.age = age;this.greet = function() {console.log("Hello, my name is " + this.name);};
}
var person = new Person("John", 30);
原型链
每个对象都有一个内部链接到另一个对象的指针,称为原型。原型本身也是一个对象,并且有自己的原型。这个原型链一直延续到 null,null 的原型是 null。
console.log(person.__proto__ === Person.prototype); // 输出 true
console.log(Person.prototype.__proto__ === Object.prototype); // 输出 true
console.log(Object.prototype.__proto__ === null); // 输出 true
原型方法
所有对象都继承自 Object.prototype,因此它们都有 toString、valueOf 等方法。
console.log(person.toString()); // 输出 "[object Object]"
原型链的用途
原型链用于实现继承,一个对象可以继承另一个对象的属性和方法。
Person.prototype.sayHello = function() {console.log("Hello from " + this.name);
};
person.sayHello(); // 输出 "Hello from John"
DOM操作
7.1 DOM简介
DOM(Document Object Model,文档对象模型)是Web开发中一个非常重要的概念。它提供了一种方式,允许我们通过编程来访问和操作HTML文档中的元素。简单来说,DOM将HTML文档表示为一个节点树,每个HTML元素都是这棵树的一个节点。通过DOM,我们可以轻松地添加、删除或修改页面上的元素,实现动态的网页交互。
7.2 获取DOM元素
在JavaScript中,有多种方法可以获取DOM元素。以下是一些常用的方法:
通过id获取元素
每个HTML元素都可以有一个唯一的id属性。我们可以使用document.getElementById()方法通过id来获取元素。例如:
<div id="myDiv">这是一个div元素</div>
<script>var myDiv = document.getElementById('myDiv');console.log(myDiv); // 输出获取到的div元素
</script>
通过类名获取元素
如果要获取具有相同类名的所有元素,可以使用document.getElementsByClassName()方法。这个方法返回一个HTMLCollection对象,包含了所有具有指定类名的元素。例如:
<div class="myClass">元素1</div>
<div class="myClass">元素2</div>
<script>var myElements = document.getElementsByClassName('myClass');for (var i = 0; i < myElements.length; i++) {console.log(myElements[i]); // 输出所有具有类名'myClass'的元素}
</script>
通过标签名获取元素
使用document.getElementsByTagName()方法可以根据标签名获取元素。这个方法同样返回一个HTMLCollection对象,包含了页面上所有指定标签名的元素。例如:
<p>段落1</p>
<p>段落2</p>
<script>var paragraphs = document.getElementsByTagName('p');for (var i = 0; i < paragraphs.length; i++) {console.log(paragraphs[i]); // 输出所有<p>标签的元素}
</script>
通过querySelector和querySelectorAll获取元素
document.querySelector()方法可以使用CSS选择器来获取第一个匹配的元素,而document.querySelectorAll()方法则返回所有匹配的元素的NodeList对象。这两个方法都非常强大,因为它们允许我们使用复杂的CSS选择器来选择元素。例如:
<div id="myDiv">这是一个div元素</div>
<p class="myClass">这是一个段落</p>
<script>var myDiv = document.querySelector('#myDiv');console.log(myDiv); // 输出id为'myDiv'的div元素var myElements = document.querySelectorAll('.myClass');for (var i = 0; i < myElements.length; i++) {console.log(myElements[i]); // 输出所有具有类名'myClass'的元素}
</script>
7.3 修改DOM元素的属性和内容
一旦我们获取了DOM元素,就可以修改它们的属性和内容。以下是一些常用的方法:
修改元素的属性
可以使用element.setAttribute()方法来设置元素的属性,使用element.getAttribute()方法来获取元素的属性。例如:
<div id="myDiv" class="myClass">这是一个div元素</div>
<script>var myDiv = document.getElementById('myDiv');myDiv.setAttribute('title', '这是一个标题'); // 设置title属性console.log(myDiv.getAttribute('title')); // 输出title属性的值
</script>
修改元素的内容
可以使用element.innerHTML属性来设置或获取元素的HTML内容。例如:
<div id="myDiv">原始内容</div>
<script>var myDiv = document.getElementById('myDiv');myDiv.innerHTML = '新内容'; // 设置div的内容console.log(myDiv.innerHTML); // 输出div的内容
</script>
还可以使用element.textContent属性来设置或获取元素的纯文本内容。这个属性不会解析HTML标签,只会获取元素内部的纯文本。例如:
<div id="myDiv">原始内容</div>
<script>var myDiv = document.getElementById('myDiv');myDiv.textContent = '新内容'; // 设置div的纯文本内容console.log(myDiv.textContent); // 输出div的纯文本内容
</script>
7.4 事件处理
事件处理是DOM编程中的另一个重要方面。它允许我们响应用户的行为,如点击、鼠标移动、按键等。以下是一些常用的事件处理方法:
添加事件监听器
可以使用element.addEventListener()方法为元素添加事件监听器。这个方法接受两个参数:事件类型和事件处理函数。例如:
<button id="myButton">点击我</button>
<script>var myButton = document.getElementById('myButton');myButton.addEventListener('click', function() {alert('按钮被点击了!');});
</script>
移除事件监听器
如果需要移除之前添加的事件监听器,可以使用element.removeEventListener()方法。这个方法同样接受事件类型和事件处理函数作为参数。例如:
<button id="myButton">点击我</button>
<script>var myButton = document.getElementById('myButton');var clickHandler = function() {alert('按钮被点击了!');};myButton.addEventListener('click', clickHandler);// 在需要的时候移除事件监听器myButton.removeEventListener('click', clickHandler);
</script>
事件对象
当事件发生时,会创建一个事件对象(event object),它包含了关于事件的详细信息,如事件类型、目标元素、鼠标位置等。在事件处理函数中,可以通过event参数来访问这个对象。例如:
<div id="myDiv" style="width: 200px; height: 200px; background-color: lightblue;">鼠标移动到我这里
</div>
<script>var myDiv = document.getElementById('myDiv');myDiv.addEventListener('mousemove', function(event) {console.log('鼠标位置:', event.clientX, event.clientY);});
</script>
JavaScript 事件处理与 AJAX 数据交互
8.1 事件的基本概念
在Web开发中,事件是用户与网页交互的桥梁。例如,当用户点击按钮、提交表单、滚动页面或按下键盘时,都会触发不同的事件。JavaScript通过事件处理机制,允许我们对这些事件做出响应。
事件类型
JavaScript支持多种事件类型,包括但不限于:
鼠标事件:如click(点击)、mouseover(鼠标悬停)、mouseout(鼠标移出)、mousemove(鼠标移动)等。
键盘事件:如keydown(按键按下)、keyup(按键释放)、keypress(按键按下并释放)等。
表单事件:如submit(表单提交)、change(值改变)、focus(获得焦点)、blur(失去焦点)等。
窗口事件:如resize(窗口调整大小)、scroll(滚动)、load(页面加载完成)等。
事件处理程序
事件处理程序是响应事件的函数。当指定的事件发生时,就会调用这个函数。事件处理程序可以是匿名函数或已定义的函数。
8.2 事件冒泡和事件捕获
事件冒泡
事件冒泡是一种事件传播机制。当事件在一个元素上发生时,它会从该元素开始,逐级向上传播到文档的根节点。例如,如果你点击一个
事件捕获
与事件冒泡相反,事件捕获是从文档的根节点开始,逐级向下传播到事件源元素。事件捕获可以用来在事件到达目标元素之前进行一些处理。
事件传播阶段
在DOM2事件模型中,事件传播分为三个阶段:
捕获阶段:从根节点开始向下传播,直到目标节点。
目标阶段:在目标节点上触发事件。
冒泡阶段:从目标节点开始向上冒泡,直到根节点。
阻止事件冒泡和捕获
可以使用event.stopPropagation()方法阻止事件继续冒泡,使用event.stopImmediatePropagation()方法阻止事件继续冒泡并停止其他事件处理程序的执行。
8.3 事件监听器的使用
添加事件监听器
使用addEventListener()方法可以为元素添加事件监听器。这个方法接受三个参数:事件类型、事件处理函数和一个布尔值,表示是否在捕获阶段触发事件(默认为false,即冒泡阶段触发)。
element.addEventListener('click', function(event) {console.log('按钮被点击了');
}, false);
移除事件监听器
使用removeEventListener()方法可以移除之前添加的事件监听器。这个方法的参数与addEventListener()相同。
var clickHandler = function(event) {console.log('按钮被点击了');
};
element.addEventListener('click', clickHandler, false);
// 在需要的时候移除事件监听器
element.removeEventListener('click', clickHandler, false);
事件对象
事件对象event包含了关于事件的详细信息,如事件类型、目标元素、鼠标位置等。在事件处理函数中,可以通过event参数来访问这个对象。
element.addEventListener('click', function(event) {console.log(event.type); // 输出事件类型console.log(event.target); // 输出事件目标元素
}, false);
AJAX与数据交互
AJAX(Asynchronous JavaScript and XML)是一种在前端开发中用于异步数据交互的技术。它允许网页在不重新加载页面的情况下,与服务器进行数据交换和更新网页的局部内容。
AJAX的基本概念
AJAX通过XMLHttpRequest对象实现异步请求。这个对象允许网页与服务器进行异步通信,获取数据并更新网页内容,而不需要重新加载整个页面。
创建XMLHttpRequest对象
var xhr = new XMLHttpRequest();
打开请求
使用open()方法来初始化一个新的请求。这个方法接受四个参数:请求类型(如GET或POST)、请求URL、是否异步(布尔值)和用户名和密码(可选)。
xhr.open('GET', 'data.txt', true);
设置请求头(可选)
使用setRequestHeader()方法可以设置请求头。例如,设置Content-Type头来指定发送到服务器的数据类型。
xhr.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');
发送请求
使用send()方法发送请求。如果请求类型是GET,则不需要发送数据;如果是POST,则需要发送数据。
xhr.send('key1=value1&key2=value2');
处理响应
使用onreadystatechange事件处理程序来处理服务器的响应。当请求的状态发生变化时,这个处理程序会被调用。当请求完成且响应就绪时(xhr.readyState为4),可以检查HTTP状态码(xhr.status)来确定请求是否成功。
xhr.onreadystatechange = function() {if (xhr.readyState === 4 && xhr.status === 200) {console.log(xhr.responseText); // 输出服务器响应的文本}
};
示例:使用AJAX获取数据
<button id="loadData">加载数据</button>
<div id="dataContainer"></div>
<script>var loadDataButton = document.getElementById('loadData');loadDataButton.addEventListener('click', function() {var xhr = new XMLHttpRequest();xhr.open('GET', 'data.txt', true);xhr.onreadystatechange = function() {if (xhr.readyState === 4 && xhr.status === 200) {document.getElementById('dataContainer').innerHTML = xhr.responseText;}};xhr.send();});
</script>
使用 jQuery 进行 AJAX 操作
jQuery 提供了一个简洁的 AJAX 方法,使得 AJAX 操作更加简单和易于管理。jQuery 的 $.ajax 方法是一个功能强大的工具,它封装了 XMLHttpRequest 对象的复杂性。
基本的 $.ajax 方法
$.ajax 方法接受一个配置对象,其中包含请求的详细信息,如类型、URL、数据和回调函数。
$.ajax({url: 'data.txt', // 请求的 URLtype: 'GET', // 请求类型dataType: 'text', // 服务器响应的预期类型success: function(data) {$('#dataContainer').html(data); // 请求成功时的回调函数},error: function(xhr, status, error) {console.error('Error:', error); // 请求失败时的回调函数}
});
简化的 $.get 和 $.post 方法
对于简单的 GET 和 POST 请求,jQuery 提供了 $.get 和 $.post 方法,这些方法更加简洁。
使用 $.get 方法
$.get('data.txt', function(data) {$('#dataContainer').html(data);
}).fail(function(xhr, status, error) {console.error('Error:', error);
});
使用 $.post 方法
$.post('data.txt', {key1: 'value1', key2: 'value2'}, function(data) {$('#dataContainer').html(data);
}).fail(function(xhr, status, error) {console.error('Error:', error);
});
完整示例
以下是一个使用 jQuery 进行 AJAX 操作的完整示例:
<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>AJAX with jQuery</title><script src="https://ajax.googleapis.com/ajax/libs/jquery/3.5.1/jquery.min.js"></script>
</head>
<body><button id="loadData">加载数据</button><div id="dataContainer"></div><script>$('#loadData').click(function() {$.ajax({url: 'data.txt',type: 'GET',dataType: 'text',success: function(data) {$('#dataContainer').html(data);},error: function(xhr, status, error) {console.error('Error:', error);}});});</script>
</body>
</html>
在这个示例中,当用户点击“加载数据”按钮时,会发送一个 GET 请求到 data.txt,并将服务器的响应内容显示在 dataContainer 元素中
JavaScript库和框架
10.1 jQuery简介
jQuery是一个快速、小巧且功能丰富的JavaScript库。它简化了HTML文档操作、事件处理、动画和Ajax交互。jQuery的设计宗旨是“write less, do more”,即编写更少的代码,实现更多的功能。
jQuery的特点
简洁的语法:jQuery的语法非常简洁,易于学习和使用。
浏览器兼容性:自动处理浏览器之间的差异,开发者无需担心不同浏览器的兼容性问题。
丰富的插件:拥有大量的插件,可以轻松扩展功能。
强大的选择器:提供强大的选择器,可以轻松地选择和操作DOM元素。
动画和效果:内置了丰富的动画和效果,可以轻松实现复杂的动画效果。
如何引入jQuery
你可以通过CDN(内容分发网络)来引入jQuery,这样可以加快页面的加载速度。以下是一个示例:
<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.5.1/jquery.min.js"></script>
你也可以下载jQuery的源码,并将其包含在你的项目中。
10.2 使用jQuery进行DOM操作
jQuery提供了丰富的DOM操作方法,可以轻松地选择、添加、删除和修改DOM元素。
选择元素
jQuery的选择器与CSS选择器非常相似,可以轻松地选择页面上的元素。以下是一些常用的选择器:
基本选择器:$('#id')
选择具有指定id的元素,$('.class')
选择具有指定类的元素,$('tag')
选择指定的标签。
层级选择器:parent > child
选择直接子元素,parent child
选择所有后代元素。
属性选择器:[attribute]
选择具有指定属性的元素,[attribute=value]
选择具有指定属性值的元素。
修改元素内容
可以使用.html()
、.text()
和.val()
方法来修改元素的内容。.html()
方法用于获取或设置元素的HTML内容,.text()
方法用于获取或设置元素的文本内容,.val()
方法用于获取或设置表单元素的值。
$('#myElement').html('<p>新的HTML内容</p>');
$('#myElement').text('新的文本内容');
$('#myInput').val('新的输入值');
添加和删除元素
可以使用.append()
、.prepend()
、.after()
、.before()
、.remove()
等方法来添加和删除元素。
$('#myElement').append('<p>新的段落</p>'); // 在元素末尾添加内容
$('#myElement').prepend('<p>新的段落</p>'); // 在元素开头添加内容
$('#myElement').after('<p>新的段落</p>'); // 在元素之后添加内容
$('#myElement').before('<p>新的段落</p>'); // 在元素之前添加内容
$('#myElement').remove(); // 删除元素
修改元素属性
可以使用.attr()
方法来获取或设置元素的属性。
$('#myElement').attr('href', 'https://www.example.com'); // 设置href属性
var href = $('#myElement').attr('href'); // 获取href属性
10.3 使用jQuery进行动画和效果
jQuery提供了丰富的动画和效果方法,可以轻松地实现复杂的动画效果。
基本动画方法
jQuery的.show()
、.hide()
和.toggle()
方法可以用于显示、隐藏和切换元素的可见性。
$('#myElement').show(); // 显示元素
$('#myElement').hide(); // 隐藏元素
$('#myElement').toggle(); // 切换元素的可见性
自定义动画
可以使用.animate()
方法来创建自定义动画。这个方法接受一个包含要动画化的属性和值的对象,以及一个可选的持续时间参数。
$('#myElement').animate({width: '300px',height: '200px',opacity: 0.5
}, 1000); // 持续时间为1000毫秒
过渡效果
jQuery的.fadeIn()
、.fadeOut()
和.fadeToggle()
方法可以用于淡入、淡出和切换元素的透明度。
$('#myElement').fadeIn(); // 淡入元素
$('#myElement').fadeOut(); // 淡出元素
$('#myElement').fadeToggle(); // 切换元素的淡入淡出状态
滑动效果
jQuery的.slideDown()
、.slideUp()
和.slideToggle()
方法可以用于滑动显示、隐藏和切换元素的可见性。
$('#myElement').slideDown(); // 滑动显示元素
$('#myElement').slideUp(); // 滑动隐藏元素
$('#myElement').slideToggle(); // 切换元素的滑动状态
完整示例
以下是一个使用jQuery进行DOM操作和动画效果的完整示例:
<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>jQuery DOM and Animation</title><script src="https://ajax.googleapis.com/ajax/libs/jquery/3.5.1/jquery.min.js"></script>
</head>
<body><button id="showButton">显示</button><button id="hideButton">隐藏</button><div id="myElement" style="width: 100px; height: 100px; background-color: red;"></div><script>$('#showButton').click(function() {$('#myElement').show('slow'); // 慢速显示元素});$('#hideButton').click(function() {$('#myElement').hide('fast'); // 快速隐藏元素});$('#myElement').hover(function() {$(this).animate({width: '200px',height: '150px',opacity: 0.5}, 1000); // 鼠标悬停时改变元素的大小和透明度}, function() {$(this).animate({width: '100px',height: '100px',opacity: 1}, 1000); // 鼠标移出时恢复元素的原始大小和透明度});</script>
</body>
</html>
在这个示例中,点击“显示”按钮会显示myElement
元素,点击“隐藏”按钮会隐藏myElement
元素。当鼠标悬停在myElement
元素上时,元素会改变大小和透明度,鼠标移出时会恢复原始状态。
相关文章:
JavaScript学习-入门篇
JavaScript的运行环境 开发环境就是开发JavaScript代码所需的环境,一般建议新手刚刚开始使用一些记事本工具(如sublime、editPlus、VScode),锻炼代码的手感。等学习到一定阶段,就可以使用集成开发工具IDE࿰…...
今日头条ip属地根据什么显示?不准确怎么办
在今日头条这样的社交媒体平台上,用户的IP属地信息对于维护网络环境的健康与秩序至关重要。然而,不少用户发现自己的IP属地显示与实际位置不符,这引发了广泛的关注和讨论。本文将深入探讨今日头条IP属地的显示依据,并提供解决IP属…...
python之移动端测试---appium
Appium Appium介绍环境准备新版本appium的用法介绍元素定位函数被封装,统一使用By.xxx(定位方式):通过文本定位的写法 一个简单的请求示例APP操作api基础apk安装卸载发送,拉取文件uiautomatorviewer工具使用获取页面元素及属性模拟事件操作模…...
【网络安全实验室】基础关实战详情
须知少时凌云志,曾许人间第一流 1.key在哪里 url:http://rdyx0/base1_4a4d993ed7bd7d467b27af52d2aaa800/index.php 查看网页源代码的方式有4种,分别是:1、鼠标右击会看到”查看源代码“,这个网页的源代码就出现在你眼前了&…...
在DJI无人机上运行VINS-FUISON(PSDK 转 ROS)
安装ceres出现以下报错,将2版本的ceres换成1版本的ceres CMake did not find one.Could not find a package configuration file provided by "absl" with any ofthe following names:abslConfig.cmakeabsl-config.cmakeAdd the installation prefix of …...
MarkDown怎么转pdf;Mark Text怎么使用;
MarkDown怎么转pdf 目录 MarkDown怎么转pdf先用CSDN进行编辑,能双向看版式;标题最后直接导出pdfMark Text怎么使用一、界面介绍二、基本操作三、视图模式四、其他功能先用CSDN进行编辑,能双向看版式; 标题最后直接导出pdf Mark Text怎么使用 Mark Text是一款简洁的开源Mar…...
代码实战:基于InvSR对视频进行超分辨率重建
Diffusion Models专栏文章汇总:入门与实战 前言:上一篇博客《使用Diffusion Models进行图像超分辩重建》中讲解了InvSR的原理,博主实测的效果是非常不错的,和PASD基本持平。这篇博客就讲解如何利用InvSR对视频进行超分辨率重建。 目录 环境准备 代码讲解 环境准备...
解决HBuilderX报错:未安装内置终端插件,是否下载?或使用外部命令行打开。
版权声明 本文原创作者:谷哥的小弟作者博客地址:http://blog.csdn.net/lfdfhl 错误描述 在HBuilderX中执行npm run build总是提醒下载插件;图示如下: 但是,下载总是失败。运行项目时候依然弹出上述提醒。 解决方案 …...
邻接表深度优先遍历和广度优先遍历计算方法
DFS和BFS 一、 深度优先遍历次序(DFS)二、 深度优先遍历生成树三、 广度优先遍历次序(BFS)四、 广度优先遍历生成树示例说明1. DFS遍历2. BFS遍历 在图的遍历中,常用的两种算法是深度优先遍历(DFSÿ…...
计算机网络-数据链路层(CSMA/CD协议,CSMA/CA协议)
2.2 ppp协议 点对点协议ppp是目前使用最广泛的点对点数据链路层协议。 2.3 媒体接入控制基本概念 共享信道要着重考虑的一个问题就是如何协调多个发送和接收站点对一个共享传输媒体的占用,即媒体接入控制MAC。 2.3.1 静态划分信道 频分复用 时分复用 波分复用 码分复…...
网络安全的学习与实践经验(附资料合集)
学习资源 在线学习平台: Hack This Site:提供从初学者到高级难度的挑战任务,适合练习各种网络安全技术。XCTF_OJ:由XCTF组委会开发的免费在线网络安全网站,提供丰富的培训材料和资源。SecurityTube:提供丰…...
Navicat 17 for Mac 数据库管理软件
Mac分享吧 文章目录 效果一、准备工作二、开始安装1. 双击运行软件,将其从左侧拖入右侧文件夹中,等待安装完毕。2. 应用程序/启动台显示Navicat图标,表示安装成功。 二、运行测试运行后提示:“Navicat Premium.pp”已损坏&#x…...
Json与jsoncpp
目录 一、关于Json 1.数据类型 2.语法规则 二、写Json相关API 1.Json::Value类 2.append方法 3.toStyledString方法 三、读Json相关API 1.Json::Reader类 2.parse方法 3.类型判断方法 4.类型转换方法 5.getMemberNames方法 四、完整代码 一、关于Json Json是一种轻…...
Webpack、Vite区别知多少?
前端的项目打包,我们常用的构建工具有Webpack和Vite,那么Webpack和Vite是两种不同的前端构建工具,那么你们又是否了解它们的区别呢?我们在做项目时要如何选择呢? 一、工具定义 1、Webpack:是一个强大的静态模块打包工…...
以太网ICMP协议(ping指令)——FPGA学习笔记25
--素材来源原子哥 一、IP协议 1、IP简介 IP是Internet Protocol(网际互连协议)的缩写。IP 协议是 TCP/IP 协议簇中的核心协议,它为上层协议提供无状态、无连接、不可靠的服务。IP 协议规定了数据传输时的基本单元和格式 。 IP协议是 OSI 参考模型中网络层…...
ESP32自动下载电路分享
下面是一个ESP32系列或者ESP8266等电路的一个自动下载电路 在ESP32等模块需要烧写程序的时候,需要通过将EN引脚更改为低电平并将IO0引脚设置为低电平来切换到烧写模式。 有时候也会采用先将IO接到一个按键上,按住按键拉低IO0的同时重新上电的方式进入烧写…...
数据结构(ing)
学习内容 指针 指针的定义: 指针是一种变量,它的值为另一个变量的地址,即内存地址。 指针在内存中也是要占据位置的。 指针类型: 指针的值用来存储内存地址,指针的类型表示该地址所指向的数据类型并告诉编译器如何解…...
STM32-笔记32-ESP8266作为服务端
esp8266作为服务器的时候,这时候网络助手以客户端的模式连接到esp8266,其中IP地址写的是esp8266作为服务器时的IP地址,可以使用ATCIFSR查询esp8266的ip地址,端口号默认写333。 当esp8266作为服务器的时候,需要完成哪些…...
[Day 12]904.水果成篮
今天给带来的题目是滑动窗口的另一种题目,之前我们讲了滑动窗口题目中长度最小的子数组,今天这个题目实际上是求长度最长的子数组 题目描述:力扣链接 904.水果成篮 你正在探访一家农场,农场从左到右种植了一排果树。这些树用一个整…...
检查字符是否相同
给你一个字符串 s ,如果 s 是一个 好 字符串,请你返回 true ,否则请返回 false 。 如果 s 中出现过的 所有 字符的出现次数 相同 ,那么我们称字符串 s 是 好 字符串。 输入:s "abacbc" 输出:t…...
专家混合(MoE)大语言模型:免费的嵌入模型新宠
专家混合(MoE)大语言模型:免费的嵌入模型新宠 今天,我们深入探讨一种备受瞩目的架构——专家混合(Mixture-of-Experts,MoE)大语言模型,它在嵌入模型领域展现出了独特的魅力。 一、M…...
CSS3 框大小
CSS3 框大小 CSS3 是网页设计和开发中不可或缺的一部分,它为开发者提供了更多样化、更灵活的样式和布局选择。在 CSS3 中,框大小(Box Sizing)是一个重要的概念,它决定了元素内容的宽度和高度以及元素整体的大小。本文将详细介绍 CSS3 框大小的概念、用法以及最佳实践。 …...
Vue动态控制disabled属性
参考:https://blog.csdn.net/guhanfengdu/article/details/126082781 在Vue中disabled:的值是受布尔值影响的,false为关闭禁用,true为开启禁用效果。 结果就是true会让按钮禁用 相反false会让按钮重新可以使用 那如果想要通过id属性值来判断是否禁用…...
Python入门教程 —— 列表
1.列表的基本使用 列表的介绍 前面学习的字符串可以用来存储一串信息,那么想一想,怎样存储咱们班所有同学的名字呢? 定义100个变量,每个变量存放一个学生的姓名可行吗?有更好的办法吗? 列表 列表的格式 定义列的格式:[元素1, 元素2, 元素3, ..., 元素n] 变量tmp的类型…...
CSS2笔记
一、CSS基础 1.CSS简介 2.CSS的编写位置 2.1 行内样式 2.2 内部样式 2.3 外部样式 3.样式表的优先级 4.CSS语法规范 5.CSS代码风格 二、CSS选择器 1.CSS基本选择器 通配选择器元素选择器类选择器id选择器 1.1 通配选择器 1.2 元素选择器 1.3 类选择器 1.4 ID选择器 1.5 基…...
对一个双向链表,从尾部遍历找到第一个值为x的点,将node p插入这个点之前,如果找不到,则插在末尾。使用C语言实现
以下是一个用C语言实现的双向链表(Doubly Linked List)插入操作的代码。该代码从尾部遍历找到第一个值为x的节点,并在其前插入新节点p,或者在未找到时将其插入链表末尾。 #include <stdio.h> #include <stdlib.h>// 定…...
C语言string函数库补充之strstr
这次讲解一个函数strstr 它的功能是在一个字符串(称为“主字符串”)中查找另一个字符串(称为“子字符串”)的第一个出现位置。如果找到了子字符串,strstr 函数会返回一个指向子字符串在主字符串中首次出现位置的指针&…...
SpringBoot整合Mapstruct转换器使用教程(提供Gitee源码)
前言:MapStruct 主要是为了简化 Java 应用程序中不同对象之间(特别是 DTO(Data Transfer Object)、VO(Value Object)、BO(Business Object)和数据库实体类等)数据转换的过程。 目录 一、什么是Mapstruct 二、导入Maven依赖 三、创建数据模型 四、创建Mapper接口 …...
vue cli更新遇到的问题(vue -V查询版本号不变的问题)
1.镜像地址选择 npm会去默认的registry远程仓库中下载指定内容 该过程可能十分缓慢 因此我们可以切换默认仓库为镜像地址 npm config set registry https://registry.npmmirror.com 通过该指令可以从最新的镜像地址下载指定内容(镜像地址可能会有变 有变请重新查询) 2.下载 …...
CSP初赛知识学习计划
CSP初赛知识学习计划 学习目标 在20天内系统掌握CSP初赛所需的计算机基础知识、编程概念、数据结构、算法等内容,为初赛取得优异成绩奠定坚实基础。 资料收集 整理的CSP知识点文档。相关教材,如《信息学奥赛一本通》等。在线编程学习平台,…...
Python 中常见的数据结构之二推导式
Python 中常见的数据结构之二推导式 使用推异式列表推导式字典推导式集合推导式 使用推异式 推导式是一种从已存在的序列中快速构建列表(list)、集合(set) 和 字典(dictionary)方式。Python 支持 3 种不同类型的推导式: 列表推导式;字典推导式…...
java.lang.Error: FFmpegKit failed to start on brand:
如果你使用FFmpegKit的时候遇到了这个问题: java.lang.Error: FFmpegKit failed to start on brand: Xiaomi, model: MI 8, device: dipper, api level: 29, abis: arm64-v8a armeabi-v7a armeabi, 32bit abis: armeabi-v7a armeabi, 64bit abis: arm64-v8a.at c…...
Gateway服务网关
一、初识Gateway服务网关 1.为什么需要网关? 在微服务中,各个模块之间的调用,也可以称其为远程调用!但是,如果是外部(用户)对微服务进行访问时,发的请求能不加处理的直接访问微服务…...
windows终端conda activate命令行不显示环境名
问题: 始终不显示环境名 解决 首先需要配置conda的环境变量 确保conda --version能显示版本 然后对cmd进行初始化,如果用的是vscode中的终端,那需要对powershell进行初始化 Windows CMD conda init cmd.exeWindows PowerShell conda …...
【网络】ARP表、MAC表、路由表
ARP表 网络设备存储IP-MAC映射关系的表,便于快速查找和转发数据包 ARP协议工作原理 ARP(Address Resolution Protocol),地址解析协议,能够将网络层的IP地址解析为数据链路层的MAC地址。 1.主机在自己的ARP缓冲区中建立…...
5.1 冒泡排序与选择排序
5.1 冒泡排序与选择排序 在计算机科学中,排序算法是最基础且最常用的算法之一。在这个部分,我们将探讨两种基础的排序算法:冒泡排序和选择排序。 冒泡排序 冒泡排序是一种简单的排序算法。它的基本思想是通过重复地遍历需要排序的序列&…...
vip与haproxy构建nginx高可用集群传递客户端真实ip
问题 系统使用了vip与haproxy实现高可用以及对nginx进行负载均衡,但是发现在上游的应用服务无法拿到客户端的请求ip地址,拿到的是主haproxy机器的ip,以下是nginx与haproxy的缩减配置: location ~* ^/(xx|xx) {proxy_pass http:/…...
049_小驰私房菜_MTK Camera debug,通过adb 命令读写Camera sensor寄存器地址的值
一、读取/写入 某个寄存器地址的值 设备先adb root 1)读取寄存器地址的值 /proc/driver # echo "0x0a34" > camsensor && dmesg |grep -i a34 2)往寄存器地址写值 /proc/driver # echo "0x3304 0x66” > camsensor && dmesg |grep -…...
《深入浅出HTTPS》读书笔记(24):椭圆曲线密码学
《深入浅出HTTPS》读书笔记(24):椭圆曲线密码学 为了保证DH的密钥对不被破解,提升安全性的主要手段就是增加密钥对的长度,但是长度越长,性能越低。 为了解决性能问题,需要…...
MIPI_DPU 综合(DPU+MIPI+Demosaic+VDMA 通路)
目录 1. 简介 2. 创建 Platform 2.1 Block Design 2.1.1 DPU PFM Lite 2.1.2 DPU prj 2.1.3 DPU MIPI Platform 2.2 pin 约束 2.2.1 GPIO 约束 2.2.2 IIC 约束 2.1.3 DPHY 约束 3. 报错总结 3.1 AXI_M 必须顺序引用 3.2 DPU 地址分配错误 4. Design Example 4.…...
开源模型应用落地-qwen2-7b-instruct-LoRA微调-Axolotl-单机多卡-RTX 4090双卡(七)
一、前言 本篇文章将使用Axolotl去高效微调QWen2系列模型,通过阅读本文,您将能够更好地掌握这些关键技术,理解其中的关键技术要点,并应用于自己的项目中。 二、术语介绍 2.1. LoRA微调 LoRA (Low-Rank Adaptation) 用于微调大型语言模型 (LLM)。 是一种有效的自适应策略,…...
电商项目-基于ElasticSearch实现商品搜索功能(一)
一、根据关键字查询商品 (1) shangcheng_service_search项目创建SearchService接口 public interface SearchService { /*** 全文检索* param paramMap 查询参数* return*/public Map search(Map<String, String> paramMap) throws Exception; }(2) shangcheng_serv…...
Kafka集群部署与安装
一、什么是Kafka Kafka是一个Pub-Sub的消息系统,无论是发布还是订阅,都须指定Topic。 Kafka是一种高吞吐量的分布式发布订阅消息系统,它可以处理消费者大规模的网站中的所有动作流数据 二、JMS:Java Message Service Java消息服…...
基于深度学习的视觉检测小项目(二) 环境和框架搭建
一、环境和框架要求 SAM的环境要求: Python>3.7 PyTorch>1.7 torchvision>0.8 YOLO V8的环境要求:YOLO集成在ultralytics库中,ultralytics库的环境要求: Python>3.7 PyTorch>1.10.0 1、确定pytorch版本…...
JS (node) 的 ACM 模式 + debug方法 (01背包为例)
文章目录 JS 的 ACM 模式输入处理 JS dubug (01背包为例)动态输入在本地通过 Node.js 运行和调试 硬编码 Hard CodingVS Code JS 的 ACM 模式 在 JavaScript 中,ACM 模式一般通过 Node.js 的 readline 模块实现。 输入处理 使用 readline 模块监听输入。 将每行输…...
USB射频微波功率计的功能与优势-盛铂科技
USB射频功率计是一种用于测量射频信号(RF)功率的仪器,它通过USB接口与计算机或其他设备连接,以便于进行数据采集、处理和显示。 主要功能 功率测量:能够测量射频信号的功率,通常以毫瓦(mW&…...
基于单片机的公交车报站系统设计
引言:单片机应用实践是电类相关专业一门必修的专业技术基础课,其教学目的就是为了使学生能深入了解模拟电路、数字电路、EDA 技术、传感器、单片机原理及其相关接口的综合应用技术,为此我们选了一个典型的实践题目- 公交车报站系统设计&#…...
软考教材重点内容 信息安全工程师 第 12 章网络安全审计技术原理与应用
12.1.1 网络安全审计概念 网络安全审计是指对网络信息系统的安全相关活动信息进行获取、记录、存储、分析和利用的工作。网络安全审计的作用在于建立“事后”安全保障措施,保存网络安全事件及行为信息,为网络安全事件分析提供线索及证据,以便…...
Spring IOC
什么是spring 以前没有spring的时候,我们需要得到一个对象,都是自己主动去new一个对象,然后通过set方法给对象注入属性,但是这种动作其实是一个重复的动作,所以spring提供ioc的容器解决方案,在容器启动的时…...
Jmeter进阶篇(31)解决java.net.BindException: Address already in use: connect报错
📚前言 近期雪雪妹妹在使用Jmeter执行压测的时候,发现了一个非常让她头疼的问题,她使用20并发跑,正确率可以达到100%,但是一旦使用200并发,就会出现大量的报错,报错内容如下: java.net.BindException: Address already in use: connectat java.net.DualStackPlainSo…...