前端三剑客之JavaScript
一、 JavaScript 介绍
1、组成
● 核心(ECMAScript) ------------>基础语法---------->必须要会的 ● 文档对象模型(DOM) Document object model (整合js,css,html)----------->重要 ● 浏览器对象模型(BOM) Broswer object model(整合js和浏览器)------------>不重要 简单地说,ECMAScript 描述了JavaScript语言本身的相关内容。 JavaScript 是脚本语言 JavaScript 是一种轻量级的编程语言。 JavaScript 是可插入 HTML 页面的编程代码。 JavaScript 插入 HTML 页面后,可由所有的现代浏览器执行。
2、
1. 书写位置 # js文件 # 浏览器控制台 # script标签 2. 注释(注释是代码之母:快捷键:ctrl + ?(单行), 多行的(ctrl+shift+?)) # 单行注释 // # 多行注释 // 这是单行注释 /* 这是 多行注释 */ 3. 结束符 JavaScript中的语句要以分号(;)为结束符。 4. 变量声明 es5: var name = 'kevin'; es6: let name='kevin' 5. 变量的命名 # 基本上遵循python的变量命名规则即可 # 下划线、驼峰体、大驼峰、小驼峰 6. 常量 # python没有真正意义上的常量,全大写就是常量 # js中有真正意义上的常量 # 如何定义常量 const pi = 3.14 7. 保留字 break case catch class const continue debugger default delete do else export extends finally
3、
字符串、数字、布尔值、空值(null)、未定义(undefined)
对象、函数、数组、日期、正则
a = 1 a = 'kevin' // 如何查看数据类型:typeof var a = 1; var b = 1.11; console.log(typeof a); console.log(typeof b); 1. 数值(Number) var a = 1; var b = 1.11; 2. 数据类型的转换 var a = '123'; 还有一种NaN,表示不是一个数字(Not a Number) 3. 字符串(String) var s = 'hello'; var ss = "hello"; // var sss = '''aaaa''' console.log(s + ss); 4. 常用方法: .length 返回长度 .trim() 移除空白 .trimLeft() 移除左边的空白 .trimRight() 移除右边的空白 .charAt(n) 返回第n个字符 .indexOf(substring, start) 子序列位置 .substring(from, to) 根据索引获取子序列 .slice(start, end) 切片 .toLowerCase() 小写 .toUpperCase() 大写 .split(delimiter, limit) 分割 5. ES6中引入了模板字符串(重要)############################################### var name = 'kevin'; var age = 18; var s = `my name is ${name}, my age is ${age}`; console.log(s); 6. 布尔值(Boolean) true、false # True False # js中有哪些是假? ""(空字符串)、0、null、undefined、NaN都是false。 7. null和undefined ● null表示值是空,一般在需要指定或清空一个变量时才会使用,如 name=null; ● undefined表示当声明一个变量但未初始化时,该变量的默认值是undefined。还有就是函数无明确的返回值时,返回的也是undefined。 8. 数组------>列表 常用方法: 方法 说明 .length 数组的大小 .push(ele) 尾部追加元素 .pop() 获取尾部的元素 .unshift(ele) 头部插入元素 .shift() 头部移除元素 .slice(start, end) 切片 .reverse() 反转 .join(seq) 将数组元素连接成字符串 .concat(val, ...) 连接数组 .sort() 排序 .forEach() 将数组的每个元素传递给回调函数 .splice() 删除元素,并向数组添加新元素。 .map() 返回一个数组元素调用函数处理后的值的新数组
4、运算符
> >= < <= != == === !== == # ===(强等于,即比较数值,又比较类型) !== 逻辑运算符 &&(and) ||(or) !(not) 赋值运算符 = += -= *= /= 流程控制 let age = 20; if (age < 18) { console.log("未成年人"); } else if (age >= 18 && age < 60) { console.log("成年人"); } else { console.log("老年人"); } switch 语句 let day = 2; let dayName; switch (day) { case 1: dayName = "星期一"; break; case 2: dayName = "星期二"; break; case 3: dayName = "星期三"; break; default: dayName = "未知"; break; } console.log(dayName); // 输出:"星期二"
5、对象
自定义对象
var a = {"name": "Alex", "age": 18};
date对象
const currentDate = new Date(); // 当前日期和时间 const specificDate = new Date("2023-07-21"); // 使用日期字符串创建Date对象 const millisecondsDate = new Date(1635619200000); // 使用毫秒数创建Date对象 const customDate = new Date(2023, 6, 21, 12, 0, 0, 0); // 使用年、月、日、时、分、秒、毫秒创建Date对象
JSON对象
在js中如何序列化和反序列化 JSON.stringify() # json.dumps JSON.parse() # json.loads
使用
<script> var a = 'zjz' var b = JSON.stringify(a) console.log(JSON.stringify(a)) console.log(JSON.parse(b)) </script>
RegExp对象
<script> // var reg1 = new RegExp("^[a-zA-Z][a-zA-Z0-9]{5,11}"); # 第一种定义方式 var reg2 = /^[a-zA-Z][a-zA-Z0-9]{5,11}/ // 第二种定义方式 // 正则校验数据 var res = reg2.test('jason66688888888888') console.log(res); // 全局匹配 var s1 = 'egondsb dSb;' var res1 = s1.match(/s/gi) // 全局匹配 global, i: ignore---->忽略------> .ignore------ console.log(res1); </script>
Math对象
abs(x) 返回数的绝对值。 exp(x) 返回 e 的指数。 floor(x) 对数进行下舍入。 log(x) 返回数的自然对数(底为e)。 max(x,y) 返回 x 和 y 中的最高值。 min(x,y) 返回 x 和 y 中的最低值。 pow(x,y) 返回 x 的 y 次幂。 random() 返回 0 ~ 1 之间的随机数。 round(x) 把数四舍五入为最接近的整数。 sin(x) 返回数的正弦。 sqrt(x) 返回数的平方根。 tan(x) 返回角的正切。
二、BOM(浏览器对象模型)
1、BOM的作用
它提供了与浏览器交互的接口,允许JavaScript代码与浏览器窗口、页面以及浏览器本身进行通信和控制。BOM主要包含以下几个核心对象:
-
Window对象: Window对象表示浏览器窗口或标签页,它是BOM的顶层对象。在全局作用域中,可以直接访问Window对象的属性和方法。提供了很多用于控制浏览器窗口和页面的方法,如打开、关闭新窗口,导航到不同的URL,获取窗口尺寸和位置等。
-
Navigator对象: Navigator对象提供了有关浏览器的信息,如浏览器的名称、版本、厂商等。它还可以用于检测浏览器的特定特性和功能是否支持。
-
Screen对象: Screen对象表示用户的屏幕信息,如屏幕分辨率、像素深度等。通过Screen对象,可以根据用户的屏幕信息来调整网页的布局和显示效果。
-
Location对象: Location对象表示当前页面的URL信息,可以通过它来获取或修改当前页面的URL,实现页面的跳转和导航。
-
History对象: History对象用于管理浏览器的历史记录,可以通过它在用户的浏览历史中向前或向后导航。
window对象常用方法: # 一些常用的Window方法: ● window.innerHeight - 浏览器窗口的内部高度 ● window.innerWidth - 浏览器窗口的内部宽度 ● window.open() - 打开新窗口 ● window.close() - 关闭当前窗口 # navigator对象(了解即可) navigator.appName // Web浏览器全称 navigator.appVersion // Web浏览器厂商和版本的详细字符串 navigator.userAgent // 客户端绝大部分信息 navigator.platform // 浏览器运行所在的操作系统 # history对象(了解即可) history.forward() // 前进一页 history.back() // 后退一页 # location对象------------------->掌握重要 location.href 获取URL location.href="URL" // 跳转到指定页面 location.reload() 重新加载页面 # 弹出框 alert("你看到了吗?"); confirm("你确定吗?") prompt("请在下方输入","你的答案")
注⚠️:
重点记忆location的用法
获取当前页面的URL:
const currentURL = location.href; console.log(currentURL); // 输出当前页面的URL
使用 location.href 跳转到新的 URL
location.href = "https://www.example.com";
使用location.href
属性进行页面跳转时,浏览器会将新页面添加到浏览器的历史记录中,这意味着用户可以通过浏览器的后退按钮返回到前一个页面。如果你想要在不添加历史记录的情况下导航到新页面,可以使用location.replace()
方法代替location.href
属性。
查看历史记录,在浏览器console处分别执行看效果
console.log("当前页面的URL:" + location.href); // 后退一页 history.back(); console.log("后退后的页面URL:" + location.href); // 前进一页 history.forward(); console.log("前进后的页面URL:" + location.href);
2、定时器
# 开一个定时器 var t1=setTimeout("JS语句",毫秒) # 清除定时器 clearTimeout(t1); # 开一个间歇性执行的定时器 var t2 = setInterval("JS语句",毫秒); # 清除定时器 clearInterval(t2);
案例
<script> // 创建一个周期性定时器,每1秒执行一次打印 function f1() { console.log("Interval is running!"); } var t1 = setInterval(f1, 1000); // 5秒后取消定时器 function f2() { clearInterval(t1); // 使用 clearInterval 取消定时器 console.log("Interval is canceled!"); } var t2 = setTimeout(f2, 5000) </script>
应用场景很多
-
延时执行:使用
setTimeout
延时执行某个函数或代码块。比如在用户触发某个操作后,等待一定时间再执行对应的任务,例如显示一个提示框或动画效果。 -
周期性执行:使用
setInterval
定时周期性执行某个函数或代码块。比如每隔一段时间执行一次轮询操作、刷新数据(支付宝支付页面)、更新UI等。 -
倒计时:倒计时功能常用于实现验证码倒计时、时间限制、竞拍等功能,通过定时器不断更新倒计时显示。
-
轮播图:实现网站中的图片轮播效果,通过定时器定时切换图片。
-
自动保存:在编辑内容时,定时自动保存用户的输入内容,防止用户丢失数据。
-
动画效果:实现动态效果,通过定时器定时更新元素的属性,例如移动、渐变、旋转等动画效果。
-
消息提示:在一定时间后自动隐藏弹出框或消息提示,提高用户体验。
-
轮询数据:在Web开发中,有时需要定时从服务器获取最新数据,更新页面内容。
-
游戏开发:定时器在游戏开发中也有重要应用,用于控制游戏元素的移动、动作和更新游戏状态。
-
定时任务:实现定时触发某些任务,例如定时发送邮件、定时备份数据库等。
三、DOM(文档对象模型)
1、作用(动态交互效果)
用来表示和操作网页文档的编程接口。它将网页文档(HTML或XML文档)转换为一个由节点(元素、属性、文本等)组成的树状结构,使开发者可以通过JavaScript来访问和修改网页内容、结构和样式。
-
文档节点(Document Nodes): 代表整个文档
-
元素节点(Element Nodes): 表示HTML标签,如
<div>
、<p>
、<h1>
等。可以通过DOM方法获取和操作元素节点的属性和内容。 -
文本节点(Text Nodes): 表示HTML标签中的文本内容。可以通过DOM方法获取和修改文本节点的内容。
-
属性节点(Attribute Nodes): 表示HTML元素的属性,如
id
、class
、src
等。可以通过DOM方法获取和修改属性节点的值。 -
DOM树(DOM Tree): 将整个HTML文档表示为一个树状结构,每个节点都是DOM树的一个分支,相互之间有父子关系。
-
选择元素: 可以通过选择器(如ID、类名、标签名等)来获取元素节点。常用的方法包括
getElementById
、getElementsByClassName
、getElementsByTagName
、querySelector
、querySelectorAll
等。 -
操作元素: 可以使用DOM方法来创建、插入、删除和修改元素节点。例如
createElement
、appendChild
、removeChild
、setAttribute
等。 -
事件处理: 可以通过DOM来添加事件处理程序,例如点击、鼠标移动、键盘按键等事件。
DOM的优势在于它可以让开发者动态地更新和交互网页内容,从而实现更丰富的用户体验。通过DOM,可以实现动态改变页面内容、样式和结构,响应用户的交互行为,以及与服务器进行数据交换,从而实现各种交互效果和功能。
3、查找标签
JavaScript 可以通过DOM创建动态的 HTML: ● JavaScript 能够改变页面中的所有 HTML 元素 ● JavaScript 能够改变页面中的所有 HTML 属性 ● JavaScript 能够改变页面中的所有 CSS 样式 ● JavaScript 能够对页面中的所有事件做出反应 # js如何学习 1. 先学习如何查找标签 2. 找到标签之后再对其做一些操作 # 先学习如何查找标签 直接查找 id、class、标签 // js如何查找标签、 var div = document.getElementById('d1'); console.log(div); var div1 = document.getElementsByClassName('c1')[1]; // 返回的 是数组,因为class可以有多个的,所有,放在一个数组中 console.log(div1); var div2 = document.getElementsByTagName('div')[0]; // 找到所有的div标签 console.log(div2); var div3 = document.getElementsByName('username'); // 通过input的name属性获取 间接查找 parentElement 父节点标签元素 children 所有子标签 firstElementChild 第一个子标签元素 lastElementChild 最后一个子标签元素 nextElementSibling 下一个兄弟标签元素 previousElementSibling 上一个兄弟标签元素 <div id="parentDiv"> <h2>Hello, World!</h2> <p>This is a paragraph.</p> <span>This is a span.</span> </div> // Get the parent element (父节点标签元素) const parentElement = document.getElementById('parentDiv'); console.log(parentElement); // Output: <div id="parentDiv">...</div> // Get all children elements (所有子标签) const childrenElements = parentElement.children; console.log(childrenElements); // Output: [ <h2>, <p>, <span> ] // Get the first child element (第一个子标签元素) const firstChildElement = parentElement.firstElementChild; console.log(firstChildElement); // Output: <h2>
4、节点操作
动态创建一个img标签
<body> <div id="d2"></div> <script> var img = document.createElement('img'); var div = document.getElementById('d2'); img.src = '4.jpeg' img.alt = 'haha' img.width = 1600; img.height = 800; img.setAttribute('username', 'k1'); console.log(img.getAttribute('username')); // img.removeAttribute('username'); console.log(img); div.appendChild(img); </script> </body>
效果:
注意事项:
1、需要提前准备好一个div标签
2、创建一个img标签后需要设置属性,比如图片的宽和高,不带px
3、div.appendChild(img);表示把img标签追加到 div 标签中
动态创建一个a标签
</head> <body> <div id="d1"> </div> <script> var a = document.createElement('a'); a.href = 'https://pic1.zhimg.com/v2-4daeb107fd150521b9f52a6a28ac5fbd_r.jpg?source=172ae18b'; a.title = '这是一个提示语'; a.innerHTML = '<h1>点我看西藏美景</h1>'; console.log(a); var div = document.getElementById('d1'); div.appendChild(a); </script> </body>
注:a.innerHTML 等价于 <a href="">点我看西藏</a>
5 、获取值操作
<body> <div class="c1"> </div> <select name="" id="city"> <option value="beijing" selected>北京</option> <option value="shanghai">上海</option> </select> <textarea name="" id="textarea" cols="30" rows="10">文本区域</textarea> <script> var iEle = document.getElementById("city"); console.log(iEle.value); var text = document.getElementById("textarea") console.log(text.value); </script>
6、修改class
<body> <div id="myElement" class="c1, c2, c3"> <p class="c1"> 言入黄花川,每逐青溪水。 </p> <p class="c2"> 声喧乱石中,色静深松里。 </p> <p class="c3"> 随山将万转,趣途无百里。 </p> </div> <script> // 根据id获取所有的类名, 前提是id和class要是同时标注的 const element = document.getElementById('myElement'); const allClassNames = element.className; console.log(allClassNames); // 获取数组,包含所有的类 const element = document.getElementById('myElement'); const classList = element.classList; console.log(classList); // 添加类名 const element = document.getElementById('myElement'); element.classList.add('c4'); // 删除类名 const element = document.getElementById('myElement'); element.classList.remove('c4'); // 输出 true 或 false,取决于元素是否包含 c3 类名 const element = document.getElementById('myElement'); const hasClass = element.classList.contains('c3'); console.log(hasClass); // 有class4则删除,没有则添加 const element = document.getElementById('myElement'); element.classList.toggle('class4'); </script>
⚠️:重点记忆
classList.toggle(cls) 存在就删除,否则添加
7、指定CSS操作
// 指定CSS操作 var div = document.getElementById('d1'); div.style.color = 'red'; // div.style.border = '1px solid red'; div.style.backgroundColor = 'green'; // div.style.borderLeftColor = 'red'; // div.style.borderLeftStyle = 'dashed'; // div.style.borderLeftWidth = '5px'; div.style.borderLeft = '5px dashed red';
四、DOM事件
满足某个条件之后,触发的动作
1、常用的事件
常用的事件: onclick 当用户点击某个对象时调用的事件句柄。 ondblclick 当用户双击某个对象时调用的事件句柄。 onfocus 元素获得焦点。 // 练习:输入框 onblur 元素失去焦点。 应用场景:用于表单验证,用户离开某个输入框时,代表已经输入完了,我们可以对它进行验证. onchange 域的内容被改变。 应用场景:通常用于表单元素,当元素内容被改变时触发.(select联动) onkeydown 某个键盘按键被按下。 应用场景: 当用户在最后一个输入框按下回车按键时,表单提交. onkeypress 某个键盘按键被按下并松开。 onkeyup 某个键盘按键被松开。 onload 一张页面或一幅图像完成加载。 onmousedown 鼠标按钮被按下。 onmousemove 鼠标被移动。 onmouseout 鼠标从某元素移开。 onmouseover 鼠标移到某元素之上。 onselect 在文本框中的文本被选中时发生。 onsubmit 确认按钮被点击,使用的对象是form。
2、绑定事件的几种方式
方式一:内联事件绑定":这是将事件处理程序直接绑定到HTML标签的事件属性上的过程
<body> <button class='btn' onclick='f();'>点击按钮</button> <script> function f() { alert('这是一个通知') } </script>
方式二:事件监听器(Event Listener)来绑定一个事件
<body> <button id="d1">点击按钮</button> <script> const element = document.getElementById('d1'); element.addEventListener('click',function(){ // 在这里编写当点击事件发生时要执行的代码 alert('点击事件被触发') } ) </script> </body>
方式三:通过js代码在页面加载后动态添加事件监听器
使用window.onload
绑定事件的方式在早期Web开发中比较常见,因为在过去,将脚本放置在<head>
标签内,而不是在<body>
标签底部。
<body> <button id="d1">点击按钮</button> <script> window.onload=function() { var d1 = document.getElementById("d1"); // 获取到d1后,d1绑定上onclick事件 d1.onclick = function() { alert('点击事件被触发!') } } </script> </body>
3、绑定事件
开关灯案例
<head> <meta charset="UTF-8"> <title>开关灯</title> <!-- css 样式--> <style> .c1 { height: 400px; width: 400px; border-radius: 50%; } .bg_green { background-color: black; } .bg_red { background-color: #EEEEEE; } </style> </head> <body> <!--// html--> <div id="d1" class="c1 bg_red bg_green" ></div> <button id="d2">变色</button> <!--// js--> <script> // 获取html标签 let btnEle = document.getElementById('d2') let divEle = document.getElementById('d1') // 标签和事件onclick绑定 btnEle.onclick = function() { // 动态的修改div标签的类属性 divEle.classList.toggle('bg_red') } </script> </body>
省市联动案例
</head> <body> <select id="province"> <!-- 选择文字提示--> <option>请选择省:</option> </select> <select id="city"> <!-- 选择文字提示--> <option>请选择市:</option> </select> <script> // js中的对象及python中的字典 data = { "河北省": ["廊坊", "邯郸"], "北京": ["朝阳区", "海淀区"], "山东": ["威海市", "烟台市"]}; // js 根据id获取省份和城市两个标签做赋值操作 var p = document.getElementById("province"); var c = document.getElementById("city"); // 每一次循环取到的值是k,即省份 for (var i in data) { // 创建option标签,赋值给到optionP var optionP = document.createElement("option"); optionP.innerHTML = i; // i赋值给 optionP标签调用innerHTML方法(即下拉框的文本内容) p.appendChild(optionP); // p是上文的省份变量,向父元素添加子元素(即<select>为父,<option>为子) } // 给id为"province"的下拉框元素添加一个"onchange"事件处理函数 p.onchange = function () { var pro = (this.options[this.selectedIndex]).innerHTML; var citys = data[pro]; // data是对象,通过key取值得到citys // 清空option c.innerHTML = ""; for (var i=0;i<citys.length;i++) { var option_city = document.createElement("option"); option_city.innerHTML = citys[i]; c.appendChild(option_city); } } </script> </body>
注:
1、.appendChild() 是 js 中用于向父元素添加子元素的方法。它用于在指定父元素的末尾添加一个新的子元素。这个方法常用于 DOM 操作,用于动态地创建和插入元素到页面中。
2、p.onchange
: 这是给id为"province"的下拉框元素添加一个"onchange"事件处理函数。"onchange"是一个事件,当元素的值发生改变时触发该事件。
3、function () { ... }
: 这是一个匿名函数,作为"onchange"事件的处理函数。当"onchange"事件被触发时,这个匿名函数将被执行。
4、var pro = (this.options[this.selectedIndex]).innerHTML;
:
在函数中,通过this
来引用当前触发事件的元素,即id为"province"的下拉框。this.selectedIndex
表示选中的选项的索引,通过this.options[this.selectedIndex]
来获取选中的选项元素。.innerHTML
用于获取选项元素的内部文本内容,也就是选项的显示
文字。最后,将该选项的文本内容(省份名称)存储在变量"pro"中。
5、var citys = data[pro];
: 这里使用之前定义的"data"对象,通过省份名称"pro"来获取对应的城市数组(列表)。"data[pro]"表示从"data"对象中根据省份名称来查找对应的城市数组,并将结果存储在变量"citys"中。
6、c.innerHTML = "";
: 这行代码用于清空id为"city"的下拉框中原有的选项。将其内部的HTML内容置为空,相当于清空了所有选项。
五、js中创建对象
1、使用对象字面量(Object Literal):
const person = { name: "John", age: 30, job: "Developer", };
2、使用构造函数(Constructor Function):
function Person(name, age, job) { this.name = name; this.age = age; this.job = job; } const person = new Person("John", 30, "Developer");
3、使用 ES6(ECMAScript 6) 的类(Class):
class Person { constructor(name, age, job) { this.name = name; this.age = age; this.job = job; } } const person = new Person("John", 30, "Developer");
4、使用 Object.create() 方法:
const personPrototype = { sayHello() { console.log(`Hello, my name is ${this.name} and I am ${this.age} years old.`); } }; const person = Object.create(personPrototype); person.name = "John"; person.age = 30; person.job = "Developer";
5、使用工厂函数(Factory Function):
function createPerson(name, age, job) { return { name, age, job, }; } const person = createPerson("John", 30, "Developer");