javascript
1.javascript曆史
2.快速入門
2.1引入JavaScript
- 内部标簽
<script>
alert('hello world');
</script>
- 外部标簽
- 注意script标簽需要都寫完,不要寫自閉和
- 測試代碼
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>我的第一個JavaScript</title>
<!-- script裡面寫,JavaScript腳本 -->
<!--
<script>
alert('hello.world');
</script>
-->
<!--
外部引入
script标簽要成對出現
-->
<script src="yt.js"></script>
</head>
<body>
</body>
</html>
2.2 基本文法入門
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>js基本文法</title>
<script>
/*
JavaScript,區分大小寫
console.log(num) 浏覽器控制台列印變量
*/
// 變量 變量類型 變量名 = 初始值;
var num = 1;
var name = "yt";
// alert(name);
//條件控制
if(num>-5){
alert("haha");
}else if(num<10){
alert("haha1111111");
}
/* 多行注釋 */
</script>
</head>
<body>
</body>
</html>
- 浏覽器調試須知
- Element 元素
- Console 控制台、可以輸入指令
- Sources 源碼,用于調試
- Network 網絡請求檢視
- Application 檢視網頁在浏覽器的緩存,cookie
2.3資料類型
數值、文本、音頻、視訊…
- 變量
- var
- 不能以,數字開頭
//全局變量
i = 1;
- number
- js不區分小數和整數
122 //整數 122.3 //浮點數 2e3 //科學計數法 NaN //not a number Infinity //無限大
- 字元串
- ‘asd’
- “qwe”
- 布爾值
- true
- false
- 邏輯運算
- &&
- ||
- !
- 比較運算符
- = 指派
- == 等于(類型可以不一樣、數值相同就相等)
- === 絕對等于(類型一樣、數值一樣、結果為true)
- null和undefined
- null,空
- undefined,未定義
- 數組
- java數組是相同的類型集合,JavaScript不要求類型一緻
- 數組下标越界了就會,undefine
var a = [1,2,3,"hello",true];
new Array(1,2,5,'hello',false);
- 對象
- 對象大括号,對象中括号
- 每個屬性之間用逗号隔開,最後一個不用加逗号
var person = {
name : "yutang",
age : 3,
tag : ['java','mysql','javascript']
}
//使用對象中的資料
person.name
"yutang"
- 注意
- 盡量使用、=== ,不要使用,==
- NaN,與所有的數值都不想等,包括自己
- isNaN(NaN),通過這個方法來判斷是否為NaN
- 盡量避免浮點數的運算、比較因為存在浮點數的精度問題
<script>
//false 浮點數精度問題
console.log(1/3===(1-2/3));
//true 用這個方法來避免
console.log(Math.abs(1/3===(1-2/3))<0.00001);
</script>
2.4嚴格檢查模式
<script>
//嚴格檢查模式,預防JavaScript的随意性産生問題,必須寫在第一行
//局部變量建議就是用,let
'use strict'
//非嚴格模式認為是全局變量,嚴格模式報錯
i = 1;
//es6中,局部變量用let
let a = 2;
</script>
3.資料類型
3.1字元串
- 正常字元串用,單、雙引号包裹
- 單、雙引号輸出,需要轉義字元(\)
- 多行字元串
<script>
//多行字元串,使用反引号括起來
var a = `
hello world!
i need happy!
`;
alert(a);
</script>
- 模闆字元串
//模闆字元串
let name = "yutang";
let age = 3;
let b = `你好,${name}`;
alert(b);
- 字元串長度
- .length
- 字元串無可變性
- 大小寫轉化
console.log(name.toUpperCase())
VM98:1 YUTANG
undefined
console.log(name.toLowerCase())
VM168:1 yutang
- javascript無單個字個字元,單個字元認為是長度為1的字元串
- substring,左開右閉
3.2數組
- Array可以包含任何資料類型
- 給數組的長度指派,過大會出現空的位置,過小會把多餘的數值丢棄
<script>
//定義數組
var a = [1,2,3,4,5,6];
//數組的長度
alert(a.length);
</script>
//給長度指派
a.length=10
10
a
(10) [1, 2, 3, 4, 5, 6, empty × 4]
//根據元素找位置
a.indexOf(1)
0
//截取數組
a.slice(2,4)
(2) [3, 4]
//push、尾部添加,pop、彈出最後一個
a
(6) [1, 2, 3, 4, 5, 6]
a.push('q','e')
8
a
(8) [1, 2, 3, 4, 5, 6, "q", "e"]
a.pop()
"e"
//shift、彈出頭部,unshift、添加頭部
a
(7) [1, 2, 3, 4, 5, 6, "q"]
a.shift()
1
a.unshift(9)
7
//sort、排序
//revert、反轉
//concat,數組拼接,不會在原始的資料上改動,隻是傳回了新的
a.concat(0.6)
(7) [1, 2, 3, 4, 5, 6, 0.6]
//join、連接配接符
a.join("--")
"1--2--3--4--5--6"
//fill、填充
3.3對象
- 若幹個鍵值對
- 用大括号括起來,屬性之間用逗号隔開,最後一個屬性後面不用加逗号
- 使用一個不存在的對象屬性,不會報錯顯示undefined
//對象
//最後一個不用逗号
var person = {
name : "yutang",
age : 3,
tag : ['java','mysql','javascript']
}
- javascript可以用delete動态删除屬性
- Javascript可以動态添加
person
{name: "yutang", age: 3, tag: Array(3)}
person.haha="huhdiuh"
"huhdiuh"
person
{name: "yutang", age: 3, tag: Array(3), haha: "huhdiuh"}
delete person.haha
true
person
{name: "yutang", age: 3, tag: Array(3)}
- 判斷某個對象是否有某屬性 “xxx” in 對象
- javascript中對象中的屬性都是字元串
- javascript中對象中的值是其相應的類型
"name" in person
true
//繼承自父類的方法
"toString" in person
true
3.4流程控制
//if語句
if(){
}else if(){
}
//循環,避免死循環
while(){
}
for( ; ; ){
}
do{
}while()
//周遊對象裡的元素,類似java中的增強for循環,
//es6的新特性
for( of ){
}
//便利下标
for( in ){
}
3.5Map和Set
<script>
//嚴格文法
"use strict"
//es6的最新産品
//map,通過key來擷取value
var map = new Map([["zhangsan",100],["lisi",78],["wangwu",90]]);
console.log(map.get("lisi"));
//添加鍵值對
map.set("hsuhdj",68);
map.delete("lisi");
//set,無序不重複的集合會去重
var set = new Set([3,1,1,1,1,1]);
console.log(set);
set.add(2); //添加
set.delete(1); //會删去所有的1
set.has(1) //判斷是否包含某個值
// Set(2) {3, 1}
// [[Entries]]
// 0: 3
// 1: 1
// size: (...)
// __proto__: Set
</script>
3.6 iterator
- es6新特性
- 周遊set、map用for-of
4.函數
- 方法,對象裡面的函數
4.1定義函數
- 執行到return就代表函數執行結束。未執行到return函數也會結束,結果為undefined
<script>
//定義方式一
//絕對值函數
function abs(x) {
if(x<0){
x=-x;
}
return x;
}
//定義方式二
var abs = function(x) {
if(x<0){
x=-x;
}
return x;
}
//調用函數
abs(10); //10
abs(-10); //10
</script>
- 參數問題
- JavaScript可以不傳遞參數,也可以傳遞多個參數
<script> //絕對值函數 function abs(x) { //判斷傳入參數的值,手動抛出異常 if(typeof x !== "number"){ throw "not a number"; } if(x<0){ x=-x; } return x; } </script>
- arguments
- 是JavaScript免費贈送的關鍵字
- 它表示函數接受的所有的參數,是一個數組
- 會包含所有的參數,使用未包含的參數需要排除已有的參數
- rest
- 擷取除了已經擷取的參數,剩餘的參數
- 隻能放在參數清單的最後面,前面加…
//使用格式 function aaa(a,d,...rest) { console.log(rest); }
4.2變量的作用域
- javascript中的,var有作用域
- 假設在函數體中申明,在函數體外不能使用 (若想使用則用,閉包)
- 如果函數内部申明了相同的變量,使用不沖突
- 内部函數變量與外部函數變量名相同,則先在自生函數内向外查找
- 先用後定義,不會出錯。隻是變量未指派。js引擎,自動提升y的定義,為提升指派。
- 變量都在最前面進行指派
<script>
function f() {
var x = 0;
x = x + 1;
}
x = x + 2; //Uncaught ReferenceError: x is not defined
</script>
<!-- 申明相同變量 -->
<script>
function f() {
var x = 0;
x = x + 1;
}
function f1() {
var x = "0";
x = x + 1;
}
</script>
<!-- 内部函數能使用外部的變量,反之不可以 -->
<script>
function f() {
var x = 0;
x = x + 1;
function f1() {
var y = x + 1;
}
x = y;//Uncaught ReferenceError: x is not defined
}
</script>
<!-- 内部函數變量與外部的變量相同 -->
<!-- 内部函數變量與外部函數變量名相同,則先在自生函數内向外查找 -->
<script>
function f() {
var x = 0;
x = x + 1;
function f1() {
var x = x + 1;
}
f1();
}
</script>
<!-- 先用後定義 -->
<script>
var a = 1 + y;
var y = "1";
// x is not defined
//等價于
var y;
var a = 1 + y;
y = "1";
</script>
- 全局變量 var
- window,全局對象
- 由于js所有的全局變量都是綁定window上的,是以會引發沖突。我們可以通過綁定在别的對象上解決沖突。
//全局變量
var a = 1;
alert(a);
alert(window.a);//全局變量綁定在windosw對象下
<script>
//唯一全局變量
var yt = {};
//定義全局變量
yt.a = 1;
yt.aaa function (x) {
console.log(x);
}
</script>
- 局部變量 let
<script>
function aaa(){
for (var i = 0; i < 100; i++) {
console.log(i);
}
console.log(i+1); //會輸出 i 為 101
}
</script>
<script>
function aaa(){
for (let i = 0; i < 100; i++) {
console.log(i);
}
console.log(i+1); //i is not defined
}
</script>
- es6,關鍵字let,用于解決沖突問題。
- 常量 const
- es6之前,全是大寫命名的變量是常量
- 現在用const,就可以不改變了
4.3方法
- 方法就是把函數放在對象内
- js中apply可以控制this的指向
<script>
var me = {
name : "jjsji",
birth : 2010,
//方法
age : function () {
var now = new Date().getFullYear();
return now - this.birth;
}
}
//屬性
me.name
//方法
me.age()
//等價于上面
<script>
function getage() {
var now = new Date().getFullYear();
return now - this.birth;
}
var me = {
name : "jjsji",
birth : 2010,
//方法
age : getage
}
var meeee = {
name : "jjsjirrfff",
birth : 2010,
//方法
age : getage
}
// me.age() 可以調用
//getage().apply(me,[]) 可以調用
//getage() NaN 因為直接調用的方法是window的方法
</script>
5.内部對象
- 标準對象
5.1 Date
<script>
var now = new Date(); //Fri Apr 02 2021 18:09:49 GMT+0800 (中國标準時間) 裝置的時間
now.getFullYear(); //年
now.getMonth(); //月 1--11
now.getDate(); //日期
now.getDay(); //星期幾
now.getHours(); //時
now.getMinutes(); //分
now.getSeconds(); //秒
now.getTime(); //時間戳,從1970-1.1-00:00:00,開始計算全世界統一
now = new Date(時間戳);
now.toLocaleString(); //轉換為當地時間
</script>
5.2 json
- 早期用XML進行資料傳輸,json用于替代XML
- 輕量級的資料傳輸格式
- JavaScript一切都是對象,任何js支援的類型都可以用json來表示
- json是一種格式化的字元串,以鍵值對的形式存在
- 格式
- 對象 {}
- 數組 []
- 所有的鍵值對,key:value
<script>
var person = {
name : "zhamnjh",
age : 3,
tall : 175
}
//對象轉化為json
var userjosn = JSON.stringify(person);
//json轉化為對象 參數為json字元串
var user = JSON.parse(userjosn);
</script>
- json與js對象的差別
//json
var josn = '{"name":"yt","age":"18"}';
//js對象
var obj = {name:"yt",age:18};
5.3 Ajax
- 原生的js寫法,xhr異步請求
- jQuery封裝好的方法,$("#name").ajax("")
- axios請求
6.面向對象程式設計
6.1 什麼是面向對象
JavaScript的面向對象與Java、c#等有一些差別
- 類:原指模闆
- 對象:指執行個體
在JavaScript中有以下的不同
- 原型
<script>
var person = {
name : "qwe",
age : 3,
run : function () {
console.log(this.name+"---run...");
}
};
var yt = {
name : "yt"
};
//原型
yt.__proto__ = person;
</script>
<!--
yt
{name: "yt"}name: "yt"
__proto__:
age: 3name:
"qwe"run:
ƒ ()
__proto__: Object
yt.run()
yt---run...
-->
- class繼承
- es6的新特性
<script>
//定義一個類
class student{
//構造器
constructor(name) {
this.name = name;
}
//方法
hello(){
console.log(this.name+"---hahaha");
}
}
//繼承
var yt = new student("yt");
class xiaostudent extends student{
constructor(name,age) {
super(name);
this.age = age;
}
myage(){
console.log("我是一名"+this.age+"歲的國小生");
}
}
var xiaohong = new xiaostudent("xiaohong",1);
</script>
- 原型鍊 (__proto__)
7.操作BOM對象(重要)
BOM:浏覽器對象模型
- IE6-11
- Chrome
- Safari
- Firefox
- Opera
- window對象(重要)
- window代表浏覽器視窗,視窗的寬高n
- navigation
- 封裝了浏覽器的資訊,平台、版本、使用者資訊
- 一般我們不會使用這個對象,因為可以進行人為修改
- scree
- 擷取螢幕的寬高
- location(重要)
- 代表目前網頁指向的URL
host: "www.bilibili.com"
href: "https://www.bilibili.com/video/BV1JJ41177di?p=19&spm_id_from=pageDriver"
protocol: "https:" //協定
reload: ƒ reload() //重新加載
- document
- 代表目前頁面,HTML的DOM樹
- 擷取具體的文檔樹節點
- 擷取網頁的cookie
- history
- history.back(); //浏覽器曆史記錄後退
- history.forward(); //浏覽器曆史記錄前進
8.操作DOM對象
DOM;文檔對象模型
浏覽器的網頁就是一個Dom樹形結構
- 更新Dom節點
- 周遊Dom節點
- 删除Dom節點
- 添加新的節點
8.1擷取Dom節點
- 除了通過id擷取到的值是單個值,其他(class、tag)都是數組
<div id="div">
<h1>一級标題</h1>
<p id="p1">jdjdkj</p>
<p class="p2">jdkjdkljdlkj</p>
</div>
<script>
//擷取标簽屬性
document.getElementsByTagName("h1");
//擷取id屬性
document.getElementById("p1");
//擷取class屬性
document.getElementsByClassName("p2");
//擷取父節點下的子節點
var div = document.getElementById("div");
div.children
</script>
8.2更新節點
<body>
<div id="div">123</div>
<script>
var div = document.getElementById("div");
//修改文本内容
div.innerText = "nihai";
//修改HTML
div.innerHTML = "<strong>hdjhdjhdjdhj</strong>";
//修改css樣式
//樣式屬性全為,駝峰命名。
//屬性值全為,字元串
div.style.fontSize = "30px";
</script>
</body>
8.3删除節點
- 删除是一個動态的過程,删除多個節點時children是一直變化的
- 先擷取父節點
- 再通過父節點删除掉自己
<body>
<div id="div">
<h1>一級标題</h1>
<p id="p1">jdjdkj</p>
<p class="p2">jdkjdkljdlkj</p>
</div>
<script>
//删除子節點
var self = document.getElementById("p1");
var father = self.parentElement;
father.removeChild(self);
//下面是錯誤的,因為删除過程是動态的
father.removeChild(father.children[0]);
father.removeChild(father.children[1]);
father.removeChild(father.children[2]);
</script>
</body>
8.4插入節點
我們獲得某個DOM節點。如果此節點是一個空節點,我們可以使用innerHTML、innerText,這兩個方法進行填充。但是如果此節點不是空節點,那麼我們就會把節點中已有的内容進行覆寫,此時不能用這個方法。
- append,插入到父節點的最後面
- insert,插入到節點之前
- 追加
<body>
<p id="js">javascript</p>
<div id="div">
<p id="se">javase</p>
<p id="ee">javaee</p>
<p id="me">javame</p>
</div>
<script>
//把js追加到div中,移動節點
var js = document.getElementById("js");
var div = document.getElementById("div");
div.appendChild(js);
</script>
</body>
- 建立一個新标簽,插入
<body>
<p id="js">javascript</p>
<div id="div">
<p id="se">javase</p>
<p id="ee">javaee</p>
<p id="me">javame</p>
</div>
<script>
//建立一個新節點
var newp = document.createElement("p");
newp.innerText = "nihjjsjhjh";
newp.setAttribute("id","newp"); //newp.id = "newp";
//插入想要的位置
var div = document.getElementById("div");
div.appendChild(newp);
</script>
</body>
- 插入到子節點之前
<body>
<p id="js">javascript</p>
<div id="div">
<p id="se">javase</p>
<p id="ee">javaee</p>
<p id="me">javame</p>
</div>
<script>
//把js追加到div中,移動節點
var js = document.getElementById("js");
var div = document.getElementById("div");
//插入到某節點之前
var ee = document.getElementById("ee");
div.insertBefore(js,ee);
</script>
</body>
9.操作表單
- 表單
- form
- input
<body>
<form action="#">
<P>
<span>使用者名:</span><input type="text" id="username">
</P>
<p>
<input type="radio" name="sex" id="boy">男
<input type="radio" name="sex" id="girl">女
</p>
</form>
<script>
//擷取使用者名輸入框内容
var un = document.getElementById("username");
un.value;
//修改輸入框内容
un.innerText = "qwer";
//擷取單選框是否被選中
var boy = document.getElementById("boy");
boy.checked;
//修改單選框的值
boy.checked = true;
</script>
</body>
- 送出表單、md5加密
<!-- 低級玩法,不安全 -->
<body>
<form action="">
<p>
<span>賬戶:</span>
<input type="text" id="username" name="username">
</p>
<p>
<span>密碼:</span>
<input type="password" id="pwd" name="pwd">
</p>
<p>
<button type="submit" onclick="tj()">送出</button>
</p>
</form>
<script>
function tj() {
var username = document.getElementById("username");
var pwd = document.getElementById("pwd");
console.log(username.value);
console.log(pwd.value);
//md5加密
pwd.value = md5(username.value);
console.log(pwd.value);
}
</script>
</body>
<!-- 進階玩法 -->
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>表單驗證</title>
<!-- MD5工具類 -->
<script src="https://cdn.bootcss.com/blueimp-md5/2.10.0/js/md5.min.js"></script>
</head>
<body>
<!--
onsubmit 綁定送出檢測函數
将結果傳回給表單,使用onsubmit接受
οnsubmit="return tj()"
-->
<form action="" onsubmit="return tj()">
<p>
<span>賬戶:</span>
<input type="text" id="username" name="username">
</p>
<p>
<span>密碼:</span>
<input type="password" id="pwd" name="input-pwd">
</p>
<p>
<span>密碼:</span>
<input type="hidden" id="md5pwd" name="md5-pwd">
</p>
<p>
<button type="submit">送出</button>
</p>
</form>
<script>
function tj() {
var username = document.getElementById("username");
var input_pwd = document.getElementById("input-pwd");
var md5_pwd = document.getElementById("md5-pwd");
//md5加密
md5_pwd.value = md5(input_pwd.value);
console.log(pwd.value);
//可以在此處校驗表單内容,true表示送出通過,false表示阻止送出
return true;
}
</script>
</body>
</html>
10.jQuery
- jQuery庫,裡面存在着大量的javascript函數
- 可以引入jQuery的js檔案來使用
- 可以使用jQuery的連結來使用
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>引入jQuery</title>
<!-- cdn引入 -->
<!-- <script src="http://libs.baidu.com/jquery/2.0.0/jquery.min.js"></script>-->
<!-- 本地引入-->
<script src="../js/jquery-3.6.0.min.js"></script>
<!--
選擇器就是css選擇器
公式 $(selector).action()
-->
</head>
<body>
<a href="https://www.baid.com" id="a">111</a>
<script>
$("#a").click(
function () {
alert("jdijfoijfoi");
}
);
</script>
</body>
</html>
10.1選擇器
<script>
//https://jquery.cuishifeng.cn/
//jQuery使用手冊,不會就去看下
//就是原生選擇器
//标簽
document.getElementsByTagName();
//類
document.getElementsByClassName();
//id
document.getElementById();
//jQuery能使用所有的css選擇器
//标簽
$("p").click();
//類
$(".pp").click();
//id
$("#ppp").click();
</script>
10.2jQuery事件
- 事件有很多,不會就去上方網站查找
<script>
//滑鼠移動事件
$().onmousemove();
//滑鼠按下事件
$().onmousedown();
//網頁加載完畢事件
$(document).ready(function () {}); //簡化為 $(function () {});
</script>
10.3jQuery操作DOM
<body>
<ul id="ul">
<li name="li1">java</li>
<li class="li2">python</li>
</ul>
<script>
//擷取值
$('#ul li[name=\"li1\"]').text(); //$().html();
//修改文本内容
$('#ul li[name=\"li1\"]').text("hduqwhjdiuhio"); //$('#ul li[name=\"li1\"]').text("<P>huhuh</p>")
//修改css樣式
$('#ul li[name=\"li1\"]').css("color","red");
//隐藏,本質---------display : none;
$('#ul li[name=\"li1\"]').hide();
//顯示
$('#ul li[name=\"li1\"]').show();
</script>
</body>