內部樣式
<script>
alert("hello");//彈窗
console.log("hello");//在瀏覽器控制檯輸出
document.write("hello");//在瀏覽器介面輸出
</script>
<input>
外部樣式
alert("hello");
==========================
<script src = "js/hello.js">
</script>
'user strict';
'use strict';
i = 3;
console.log(i);
使用該語句之前
i=3:表示是全域性變數
使用該語句之後
ES6
在es6中,區域性變數使用let表示。 let i = 3;
注意跳脫字元:\'
\n :換行符 \t:製表符
\u#### unicode編碼 \u4e2d:"中"
\x41 ASCII編碼 'A'
多行字串編寫(tab鍵上面的那個鍵)
var msg =`A
B
C`
模板字串:
let name ="zhangsan";
var msg ="你好,${name}"
subString方法擷取字串,從指定索引擷取,含頭不含尾
"你好啊張三".substring(3,5) //張三
var person = {
name:"張三",
age:18,
array:[1,2,3,4]
}
//獲取物件的屬性
console.log(person.name);
獲取變數的型別
<script>
var a = 3;
document.write(typeof(a));
//結果爲number
</script>
只有一個運算數的運算子
+(正號) -(負號)
++ -- 自增(自減)
++在前,先自增,再運算
++在後,先運算,再自增
<script>
var num = 3;
var a = num++;
//先運算,再自增,先把num賦值給a,num再自增。a=3,num=4
</script>
注意:
在JS中,如果運算數不是運算子所要求的型別,那麼js引擎會自動將運算數進行型別轉換 其他型別轉number:
String型別轉number,按字面值轉換,如果字面值不是數位,則轉爲NaN(不是數位的數位) NaN和任意數位進行運算,結果都是NaN
boolean轉number:true轉爲1,false轉爲0
+ - * / %
和java一樣
唯一不同是 / 結果可以爲小數
>, <, >=, <=, !=, ===
比較方式
型別相同:直接比較
字串:按照字典順序進行比較,按位元逐一比較,直到得到大小爲止。
型別不同:先進行型別轉化,再比較
==:型別不一致,值一樣也會返回true,比如1和"1"
=== 全等於,在比較之前,先判斷型別,如果型別不一樣,直接返回false
NaN與所有的數值都不相等,包括自己本身。NaN===NaN結果是false
isNaN(變數):通過該方法判斷一個變數是否是NaN
浮點數存在精度問題
(1/3)===1-(2/3):結果是false
&& || !
其他型別轉bollean
1.number:0或NaN爲假,其他爲真
2.string:除了空字串,其他都是true
3.null&undefined:都是false
4.物件:所有物件都是true
可以在後期判斷字串是否爲空
if(a){}等價於if(a != null & a.length>0){}
也可以用來判斷物件是否爲null
if(stu){}等價於if(stu != null){}
? : 表達式
var b = 3;
var a = 4;
var c = a > b ? 1 : 0;
document.write(c);
a是否大於b?如果大於b,將1賦值給c,否則將0賦值給c
//alert("hello,word")瀏覽器彈窗
//document.write("hello");//在瀏覽器介面顯示該內容
var score = 65;//定義變數
if(score>=0 && score<60){
alert("成績不合格");
}else if(score>=60 && score<=100){
alert("成績合格");
}else {
alert("請輸入正確成績")
}
var a = null;
switch (a) {
case 5:
document.write(a);
break;
case null:
document.write(a);
break;
case "a":
document.write(a);
break;
default:
document.write("輸入不符合規範");
}
//求1到100的總和
var a = 1;
var sum =0;
while(a<=100){
sum=sum+a;
a++;
}
document.write("1到100的總和爲:"+sum);
var a=1;
do {
a++;
}while (a>20)
document.write(a);//輸出結果是2
var sum=0;
for (var i=1; i<=100; i++){
sum+=i;
}
document.write("總和是"+sum)
//遍歷陣列
'use strict';
var arr =[2,6,4,89,235,45];
for (let i in arr){
//遍歷出來的i是陣列的索引
document.write(arr[i]+"<br/>");
}
如果需要使用全域性變數,建議:
var b;
function fun(){
b = 4;
}
fun();
alert(b);
JS中的所有鍵都是字串,值是任意物件
物件
建立物件
'use strict';
let student={
name:'zhangsan',
age:23,
score:60
}
物件賦值
student.name="張三";
document.write(student.address); //undefined
動態的刪減屬性
delete student.age; //刪除age屬性
student.address="北京";//新增一個address屬性
判斷屬性是否在一個物件中
1. document.write("age" in person); //包含繼承自上一級的屬性
2. person.hasOwnProperty("age"); //只判斷在自己本身中是否存在該屬性
建立
1.var fun = new Function(形式參數列表,方法體);//不需要掌握
如:var fun1 = new Function("a","b","alert(a);");
2.function 方法名稱(形參列表){ //常用
方法體
}
3.var 方法名=function(形參列表){
方法體;
}
屬性和特點
特點
如:求任意個數的和
function add(){
var sum = 0;
for(var i = 0; i< argument.length;i++){
sum = sum + argument[i];
}
return sum;
}
//呼叫該方法
var sum = add(1,2,3);
建立
1.var arr = new Array(元素列表);
2. var arr = new Array(預設長度);
3.var arr = [元素列表];
方法
join(參數):將陣列中的元素按照指定的分隔符拼接爲字串
push() 向陣列的末尾新增一個或更多元素,並返回新的長度
unshift()向陣列的頭部新增一個或多個元素
pop()將最後一個元素彈出陣列
shift()從陣列的頭部彈出一個元素
slice():擷取Array的一部分,返回一個新的陣列,類似於string中的substring方法。
sort()排序
reverse()反轉陣列
concat([1,2]):將陣列1,2新增到原陣列後面返回一個新陣列。原陣列不變
var arr = new Array(10,20,30,40);
var length = arr.length;
document.write("陣列的長度:"+length+"<br/>");//陣列的長度:4
document.write(arr.join("@"));//10@20@30@40
arr.push(50,60,70);
document.write(arr);//10,20,30,40,50,60,70
屬性和特點
特點
建立
var date = new Date();
方法
var date = new Date();
date.getMonth();//獲取當前的月份。0-11,通常加1
var start = date.getTime();
document.write(start+"<br/>");
for (var i = 0; i < 10000; i++) {
document.write(i);
}
date=new Date(); //更新時間
var end = date.getTime();
document.write("<br/>"+end)
var time = end-start;
document.write("程式共耗時"+time+"毫秒");
建立
特點:Math物件不用建立,直接使用即可,和java一樣。 Math.方法名();
屬性和方法
document.write(「π=」+Math.PI);
π=3.141592653589793
方法:
隨機生成1到100之間的整數
步驟:
1.Math.random()返回0到1之間的數
2.Math.random()*100返回0到100之間的數,不包括100
3.Math.floor(Math.random()*100)返回0到99之間的整數
4.Math.floor(Math.random()*100+1)返回1到100之間的整數
document.write("1到100之間的整數"+Math.floor(Math.random()*100+1));
正則表達式概述
正則表達式:定義字串的組成規則
單個字元:[ ]
如:[a] [ab][a-zA-Z0-9_]
特殊符號代表特殊含義的單個字元
\d:單個數字字元[0-9]
\w:單個單詞字元[a-zA-Z0-9_]
量詞符號:
?:出現0次或1次
*:出現0次或多次
+:出現1次或多次
{m,n}表示 m<=數量<=n
m如果預設:{,n}最多n次
n如果預設:{m,}最少m次
開始結束符號:
開始:^
結束:$
建立
1.var reg = new RegExp(「正則表達式」);
2.var reg = /正則表達式/;
方法
test(參數):驗證指定的字串是否符合正則定義的規範,符合規範返回true,不符合false
var reg2 = /^\w{6,12}$/;
var username = "zhangsan";
var flag = reg2.test(username);
document.write(flag);
結果爲true
特點:這個Global中封裝的方法不需要物件就可以直接呼叫。 方法名();
方法
encodeURI:url編碼
decodeURI:url解碼
encodeURIComponent:url編碼
decodeURIComponent:url解碼
'use strict';
let map =new Map([["張三",100],["李四",50],["王五",100]]);
let score = map.get("張三"); //獲取指定key的值
map.set("二狗",50);//新增或修改鍵值對
map.delete("張三");//刪除鍵值對
document.write(score);
let arr =[1,2,3,4,5];
for(let i of arr){
document.write(i);
}
let map =new Map([["張三",20],["李四",25]]);
for(let p of map ){
document.write(p);
}
let set = new Set([1,2,3,4,4]);
for (let a of set){
document.write(a);
}
function abs(x) {
if(x>=0){
return x;
}else {
return -x;
}
}
一旦執行到return代表方法結束,返回結果
如果沒有執行return語句,函數也會返回結果,(形參沒有賦值)返回值是undefined
var abs=function(x) {
if(x>=0){
return x;
}else {
return -x;
}
}
如何限制傳入參數的型別符合要求(手動拋出異常)
var abs =function(x) {
if(typeof x !== 'number'){
throw 'not a number';
} else if(x>=0){
return x;
}else {
return -x;
}
}
rest函數(es6新特性)
作用:用來獲取除了已經定義的參數之後的其他參數,將其封裝到一個數組中
function f(x,...rest) {
console.log("x:"+x);
console.log("rest:"+rest);
}
呼叫函數:f(‘a’,‘c’,‘s’,‘d’)
結果:x:a
rest:c,s,d
在javascript中用var定義變數是有作用域的。
在函數間定義變數,在函數體外不能使用該變數(非要使用的話需要瞭解閉包的知識)
function f() {
var x=1;
x = x+1;
}
x = x + 2; //Uncaught ReferenceError: x is not defined
內部函數可以使用外部函數的屬性變數,反之不行
function f() {
var x = 1;
function f1() {
var y = x+1;
}
}
如果內部函數與外部函數定義的變數重名,則在內外部函數使用自己函數的成員變數。
function f() {
var x = 1;
function f1() {
var x = 2;
console.log("內部x:"+x); //2
}
console.log("外部x:"+x); //1
f1();
}
建議:所有的變數都定義到函數的頭部,需要使用該變數時,直接使用即可,便於程式碼維護。
規範
由於我們使用的所有全域性變數都會系結到window物件上,如果不同的js檔案,使用了相同的全域性變數名稱,會發生衝突。
//定義該js檔案的唯一全域性變數
var rm ={};
//定義全域性變數
rm.name ="rm";
rm.add = function (a,b) {
return a+b;
}
Jquery就是這樣做的,(Jquery.屬性等價於$.屬性)
區域性作用域let
function f() {
for(var i = 1; i<10;i++){
document.write(i);//1-9
}
//11,i等於10的時候退出回圈,此時i=10,再加1是11
document.write("i+1:"+(i+1)); //11
}
f();
解決方法:es6新加入let關鍵字,解決區域性作用域衝突問題
function f() {
for(let i = 1; i<10;i++){
document.write(i);//1-9
}
//Uncaught ReferenceError: i is not defined
document.write("i+1:"+(i+1)); //控制檯報錯
}
f();
建議使用let定義區域性作用域的變數
const用來定義常數
const a =10; //只讀變數
a = 20; //編譯不通過,直接報錯
var rm = {
name:"rm",
birthYear:1998,
age:function () {
let now = new Date().getFullYear();
return now - this.birthYear;
}
}
使用物件中的方法(方法名後面加括號,屬性不用加)
rm.age();
this就是呼叫者。如果沒物件呼叫預設就是window物件呼叫
在JAVA中,this是無法指向的,預設指向呼叫它的哪個物件
apply
function getAge() {
let now = new Date().getFullYear();
return (now - this.birthYear);
}
var rm = {
name:"rm",
birthYear:1998,
age : getAge
};
//表示這個方法中的this指向rm物件,參數爲空
getAge.apply(rm,[]);//等價於rm.getAge();
格式:
方法:
var person={
name:"張三",
age:25
}
let s = JSON.stringify(person);
document.write(s);//{"name":"張三","age":25}
===============================
//傳遞是參數是一個字串,需要用單引號括起來*斜體樣式*
JSON.parse('{"name":"張三","age":25}');
var obj={name:"zhangsan",age:24}
var json='{"name":"zhangsan","age":24}'
類:模板
物件:具體的範例
proto:原型,A物件原型指向B物件。A物件就能使用B物件中的屬性和方法
ES6 class
//定義類
class student{
constructor(name){
this.name =name;
}
run(){
console.log(this.name+"在跑");
}
}
//建立物件
let student1 = new student("小明");
student1.run();
let student2 = new student("小紅");
student2.run();
//定義類
class student{
constructor(name){
this.name =name;
}
run(){
console.log(this.name+"在跑");
}
}
//繼承
class primary extends student{
constructor(name,grade){
super(name);
this.grade=grade;
}
getGrade(){
console.log(this.name+"是一名"+this.grade+"學生");
}
}
//建立一個primary物件
let p1 = new primary("小新","三年級");
p1.getGrade();//小新是一名三年級學生
本質還是使用的物件原型
BOM:瀏覽器物件模型
瀏覽器內核:IE Chrome Safari FireFox
三方瀏覽器:QQ 360 UC
window
window代表瀏覽器視窗
Navigator(不建議使用)
navigator.appName
"Netscape"
navigator.appVersion
"5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/85.0.4183.26 Safari/537.36"
navigator.userAgent
"Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/85.0.4183.26 Safari/537.36"
screen代表螢幕
screen.width
1440 px
screen.height
960 px
location(重要)
host: "www.baidu.com"
href: "https://www.baidu.com/"
origin: "https://www.baidu.com"
protocol: "https:"
reload: ƒ reload() //重新整理網頁
//設定新的地址
location.assign('url地址')
document
document代表當前的頁面,HTML DOM文件樹
<ul id="ul">
<li>JAVA</li>
<li>JAVASE</li>
<li>JAVAEE</li>
</ul>
history(不建議使用)
history.back() //後退一個頁面
history.forward() //前進
核心
瀏覽器網頁就是一個DOM樹形結構
核心:要操作一個DOM節點,就必須要獲得這個DOM節點。
<div id="father">
<h1>標題一</h1>
<p id="p1">p1</p>
<p class="p2">p2</p>
</div>
<script>
//分別獲取這三個節點
var h1 = document.getElementsByTagName("h1");
var p1 = document.getElementById("p1");
var p2 = document.getElementsByClassName("p2");
var father = document.getElementById("father");
var children = father.children;
</script>
注意:獲取節點的script標籤一定要寫在標籤內容下面 下麪,不然獲取不到
更新節點
<div id="div1"></div>
<script>
let div1 = document.getElementById('div1');
//該方法不會解析標籤內容,輸入標籤也是字串形式
div1.innerText = "Hello World";
//該方法會解析html標籤內容
div1.innerHTML = "<strong>Hello world</strong>";
</script>
<div id="div1"></div>
<script>
let div1 = document.getElementById('div1');
div1.innerText="Hello"; //屬性值都使用字串包裹
div1.style.fontSize = "30px"; //下劃線轉駝峯命名
div1.style.color = "red";
div1.style.padding= "50px";
</script>
刪除節點
先獲取父節點,然後通過父節點刪除自己。不能自己刪除自己
<div id="div1">
<span class="span1">Hello</span>
</div>
<script>
//要刪除span1節點,需要先獲取其父節點
let span1 = document.getElementsByClassName("span1");
let father = span1.parentElement;
father.remove(span1);
//刪除是一個動態的過程
father.removeChild(father.children[0]);
father.removeChild(father.children[1]);
father.removeChild(father.children[2]);
</script>
注意:刪除多個節點時,children是在時刻變化的,刪除節點時要注意
插入節點
追加前
<li id="js">javascript</li>
<ul id="ul">
<li>javase</li>
<li>javaee</li>
<li>javame</li>
</ul>
<script>
//將以存在的標籤追加到一個標籤後面
let ul = document.getElementById("ul");
let js = document.getElementById("js");
ul.appendChild(js); /追加
</script>
追加後
建立一個新的標籤,實現插入
<ul id="ul">
<li>javase</li>
<li>javaee</li>
<li>javame</li>
</ul>
<script>
let ul = document.getElementById("ul");
//建立一個新的標籤
let newP = document.createElement("li");
newP.id="p";
newP.innerText="php1"
ul.appendChild(newP);
//建立一個標籤節點
let img= document.createElement("img");
img.setAttribute("src","a.jpg"); //等價於<img src="a.jpg">
</script>
form表單
獲取和修改輸入框的值
<form>
<span>使用者名稱:<input id="username"></span>
<span>
<p>性別:</p>
<input type="radio" name="sex" value="boy" id="boy">男
<input type="radio" name="sex" value="girl" id="girl">女
</span>
</form>
<script>
let user = document.getElementById("username");
console.log(user.value);
user.value="123456";
//對於單選框,多選框等固定的值,只能獲取到當前的值
let boy = document.getElementById("boy");
let girl = document.getElementById("girl");
boy.checked;//檢視返回的結果,true表示被選中
girl.checked=true;//修改選擇的結果
</script>
提交表單
使用md5加密,使用隱藏輸入框接收使用者密碼輸入的密碼並對其進行加密
<body>
<!--表單系結提交事件
οnsubmit=系結一個提交檢測的函數,返回值是true,false
將這個結果返回給表單,使用onsubmit接受,true通過提交,false阻止提交
-->
<!--onclick單擊事件-->
<form action="demo2.html" method="post" onsubmit="return check()">
<p>
使用者名稱:<input type="text" name="username" id="username">
</p>
<p>
密碼:<input type="password" id="pwd"> <!--提交的不是使用者直接輸入的密碼-->
</p>
<input type="hidden" name="pwd" id="md5_pwd"><!--提交的是加密後的密碼-->
<input type="submit" value="登錄" >
</form>
<script>
function check() {
let pwd = document.getElementById("pwd");
let md5_pwd = document.getElementById("md5_pwd");
//md5方法就是對參數進行加密返回加密後的結果,提交上去的是加密後的密碼
md5_pwd.value =md5(pwd.value);
return true;
}
</script>
通過md5加密後提交的數據
JQuery庫,裏面存在大量的JS方法
匯入JQuery
<!--通過js檔案匯入-->
<script src="../../lib/js/jquery-3.3.1.js"></script>
<!--通過cdn線上匯入-->
<script src="https://lib.baomitu.com/jquery/3.5.0/jquery.js"></script>
公式:$ (選擇器).事件 $ 就代表JQuery
<body>
<a href="#" id="a1">點我</a>
<script>
$("#a1").click(function () {
alert("Hello,JQuery")
})
</script>
選擇器
<script>
//JS原生態
let p1 = document.getElementsByTagName("p");
let a1 = document.getElementById("a1");
let div1 = document.getElementsByClassName("div1");
//JQuery CSS中的選擇器都能用
$("p").click(); //標籤選擇器
$(".a1").click();//id選擇器
$("#div1").click();//class選擇器
</script>
文件工具站: https://jquery.cuishifeng.cn/index.html
事件
滑鼠事件,鍵盤事件
當網頁載入完畢之後,響應事件
<script>
$(document).read(function () {
//網頁載入完畢之後執行的指令,JS程式碼寫在這裏面
})
</script>
<script>
$(function () {
//網頁載入完畢之後執行的指令,JS程式碼寫在這裏面
})
</script>
<style>
#mouseFrame{
width: 300px;
height: 300px;
border: solid 1px red;
}
</style>
滑鼠:<span id="mouse"></span>
<div id="mouseFrame">在這裏移動滑鼠試試</div>
<script>
$(function () {
$("#mouseFrame").mousemove(function (e) {
$("#mouse").text("x:"+e.pageX+"y:"+e.pageY);
})
})
</script>
操作DOM
節點文字操作
<ul id="ul">
<li id="python">python</li>
<li name="java">java</li>
<li class="c">c</li>
</ul>
<script>
//修改節點中的內容
$(function () {
let text = $("#ul li[name='java']").text(); //獲取值
$("#ul li[name='java']").text("JAVA");//設定值
let html = $("#ul .python").html();//獲取值
$("#ul #python").html("<strong>PYTHON</strong>");//設定值
})
</script>
<script>
//修改css
$(function () {
$("#ul li[name='java']").css({"color":"red","font-size":"50px"});
})
</script>
<script>
//修改css
$(function () {
$("#ul li[name='java']").show();//顯示該節點
$("#ul li[name='java']").hide();//隱藏該節點
$("#ul li[name='java']").toggle();//將該節點顯示改爲隱藏,隱藏改爲顯示
})
</script>