JavaScript的對象
在JavaScript中除了null和undefined以外其他的數據類型都被定義成了對象,也可以用創建對象的方法定義變量,String、Math、Array、Date、RegExp都是JavaScript中重要的內置對象,在JavaScript程序大多數功能都是基於對象實現的。
<script language="javascript">
var aa=Number.MAX_VALUE;
//利用數字對象獲取可表示最大數
var bb=new String("hello JavaScript");
//創建字符串對象
var cc=new Date();
//創建日期對象
var dd=new Array("星期一","星期二","星期三","星期四");
//數組對象

String對象
字符串對象創建
字符串創建(兩種方式)
① 變量 = “字符串”
② 字串對象名稱 = new String (字符串)
var str1="hello world";
var str1= new String("hello word");
字符串對象的屬性和函數
x.length ----獲取字符串的長度 x.toLowerCase() ----轉為小寫 x.toUpperCase() ----轉為大寫 x.trim() ----去除字符串兩邊空格 ----字符串查詢方法 x.charAt(index) ----str1.charAt(index);----獲取指定位置字符,其中index為要獲取的字符索引 x.indexOf(findstr,index)----查詢字符串位置 x.lastIndexOf(findstr) x.match(regexp) ----match返回匹配字符串的數組,如果沒有匹配則返回null x.search(regexp) ----search返回匹配字符串的首字符位置索引
示例:
var str1="welcome to the world of JS!";
var str2=str1.match("world");
var str3=str1.search("world");
alert(str2[0]); // 結果為"world"
alert(str3); // 結果為15
----子字符串處理方法
x.substr(start, length) ----start表示開始位置,length表示截取長度
x.substring(start, end) ----end是結束位置
x.slice(start, end) ----切片操作字符串
x.replace(findstr,tostr) ---- 字符串替換
x.split(); ----分割字符串
x.concat(addstr) ---- 拼接字符串
示例:
var str1="abcdefgh";
var str2=str1.slice(2,4);
var str3=str1.slice(4);
var str4=str1.slice(2,-1);
var str5=str1.slice(-3,-1);
alert(str2); //結果為"cd"
alert(str3); //結果為"efgh"
alert(str4); //結果為"cdefg"
alert(str5); //結果為"fg"
var str1="一,二,三,四,五,六,日";
var strArray=str1.split(",");
alert(strArray[1]);//結果為"二"
Array對象
數組創建
創建數組的三種方式:
方式一:var arrname = [元素0,元素1,….];
var arr1=[1,2,3];
console.log(arr1); //[1, 2, 3]
方式二:ar arrname = new Array(元素0,元素1,….);
var arr2=new Array("hello",12,"3",true);
console.log(arr2); //["hello", 12, "3", true]
方式三:var arrname = new Array(長度);
var arr3=new Array(3);
arr3[0]="周日";
arr3[1]="周六";
arr3[2]="周三";
console.log(arr3); //["周日", "周六", "周三"]
創建二維數組
var week=new Array(3);
for(var i=0;i<=2;i++){
week[i]=new Array(2);
}
week[0][0]="周日";
week[0][1]="Sunday";
week[1][0]="周六";
week[1][1]="Saturday";
week[2][0]="周三";
week[2][1]="Wednesday";
console.log(week[0]); //["周日", "Sunday"]
數組對象的屬性和方法
join方法
x.join(bystr) ----將數組元素拼接成字符串 var arr= new Array(11,22,33); var arr1=arr.join("-"); console.log(arr1); //11-22-33 concat方法 var arr=[1,2,3]; var b=arr.concat(4,5); console.log(b); //[1, 2, 3, 4, 5] console.log(arr.toString(),typeof(arr.toString())); //1,2,3 string console.log(b.toString(),typeof(b.toString())); //1,2,3,4,5 string 數組排序-reverse sort: var x=[12,33,43,56]; x.reverse();//顛倒數組元素 console.log(x); //[56, 43, 33, 12] var x=[120,33,43,56]; x.sort();//排序數組元素 console.log(x); // [120, 33, 43, 56] 比較數字大小,而不是根據ASCII碼值比較 arr=[1,4,2,100]; arr.sort(); console.log(arr); //[1, 100, 2, 4] function intSort(a,b){ if(a>b){ return 1; } else if(a<b){ return -1; } else{ return 0; } } arr.sort(intSort); //不懂 console.log(arr); function IntSort(a,b){ return a-b; } 數組切片操作
x.slice(start, end)
//x代表數組對象,start表示開始位置索引,end是結束位置索引
//第一個數組元素索引為0,最后一個數組元素索引為-1
//start、end可為負數
//end省略則相當於從start位置截取以后所有數組元素
var arr1=["h","e","l","l","o"]; var arr2=arr1.slice(1,3); var arr3=arr1.slice(2); var arr4=arr1.slice(2,-1); console.log(arr2); //["e", "l"] console.log(arr3); //["l", "l", "o"] console.log(arr4); //["l", "l"] 刪除子數組
x. splice(start, deleteCount, value, ...)
//x代表數組對象
//splice的主要用途是對數組指定位置進行刪除和插入
//start表示開始位置索引
//deleteCount刪除數組元素的個數
//value表示在刪除位置插入的數組元素
//value參數可以省略
var arr=[1,"23","hello",true]; arr.splice(1,2); console.log(arr); // [1, true] arr.splice(1,1); console.log(arr); //[1, "hello", true] var a = [1,2,3,4,5,6,7,8]; a.splice(1,0,22,33); alert(a.toString()); //1,22,33,2,3,4,5,6,7,8 數組的push和pop
//x代表數組對象 //value可以為字符串、數字、數組等任何值
push是將value值添加到數組x的結尾
pop是將數組x的最后一個元素刪除
var arr=[1,2,3];
arr.push(44,55);
console.log(arr); // [1, 2, 3, 44, 55]
arr.pop();
console.log(arr); //[1, 2, 3, 44]
數組的shift和unshift
//x代表數組對象 //value可以為字符串、數字、數組等任何值
unshift是將value值插入到數組x的開始 shift是將數組x的第一個元素刪除 var arr=[3,4,5]; arr.unshift(11,22); console.log(arr); //[11, 22, 3, 4, 5] arr.shift(); console.log(arr); // [22, 3, 4, 5] js中數組的特性 js中的數組特性1: js中的數組可以裝任意類型,沒有任何限制. js中的數組特性2: js中的數組,長度是隨着下標變化的.用到多長就有多長. var arr=["abc",1,1.23,true,null,undefined,new String("hello")]; console.log(arr.length); //7 arr[10]=1; console.log(arr.length); //11
Date對象
創建Date對象
方法一:不指定參數
var d1=new Date();
console.log(d1); //Tue Aug 08 2017 17:12:56 GMT+0800 (中國標准時間)
console.log(d1.toLocaleString()); //2017-8-8 17:13:44
方法二:參數為日期字符串
var d2=new Date("2008/05/12 12:00");
console.log(d2.toLocaleString()); //2008-5-12 12:00:00
var d3=new Date("08-05-12 12:00");
console.log(d3.toLocaleString()); //2012-8-5 12:00:00
方法三:參數為毫秒數
var d4=new Date(5000);
console.log(d4.toLocaleString()); //1970-1-1 08:00:05
console.log(d4.toUTCString()); //Thu, 01 Jan 1970 00:00:05 GMT
方法四:參數為年月日時分秒毫秒
var d5=new Date(2012,5,12,12,0,0,5000);
console.log(d5.toLocaleString()); //2012-6-12 12:00:05
Date對象的方法—獲取日期和時間
function getCurrentDate(){
//1.創建Date對象
var date=new Date();
//2.獲取當前年份
var year=date.getFullYear();
var year2=date.getYear();
//3.獲取當前月份
var month=date.getMonth()+1;
//4.獲取當前日
var day=date.getDate();
//5.獲取當前時
var hour=date.getHours();
//6.獲取當前分
var minute=date.getMinutes();
//7.獲取當前秒
var second=date.getSeconds();
//8.獲取當前毫秒
var millisecond=date.getMilliseconds();
//9.獲取當前星期
var week=date.getDay();
//10.獲取累計毫秒數(從1970/1/1午夜)
var time=date.getTime();
return year+"年"+changeNum(month)+"月"+day+"日 "+hour+":"+minute+":"+second+" "+parseWeek(week);
}
console.log(getCurrentDate()); //2017年08月8日 18:35:44 星期二
//解決自動補齊成兩位數字的方法
function changeNum(num){
if(num<10){
return "0"+num;
}
else{
return num;
}
}
//將數字0~6轉換成 星期日到星期六
function parseWeek(week){
var arr=["星期日","星期一","星期二","星期三","星期四","星期五","星期六"]; return arr[week];}
Date對象的方法—設置日期和時間
設置日期和時間
var x=new Date();
// console.log(x); //Tue Aug 08 2017 18:43:51 GMT+0800 (中國標准時間)
x.setFullYear(1997); //設置年
x.setMonth(7); //設置月
x.setDate(1); //設置日
x.setHours(12); //設置時
x.setMinutes(38); //設置分
x.setSeconds(54); //設置秒
x.setMilliseconds(300); //設置毫秒(0-999)
document.write(x.toLocaleString()+"<br>");
x.setTime(8000000000000); //設置累計毫秒數(從1970/1/1午夜)
document.write(x.toLocaleString()+"<br>");
1997-8-1 12:38:54
2223-7-6 22:13:20
Date對象的方法—日期和時間的轉換
日期和時間的轉換: getTimezoneOffset():8個時區×15度×4分/度=480; 返回本地時間與GMT的時間差,以分鍾為單位
var x=new Date();
console.log(x); //Tue Aug 08 2017 18:58:21 GMT+0800 (中國標准時間)
x1=x.toLocaleString(); //返回本地格式時間字符串
console.log(x1); //2017-8-8 18:58:58
time1=Date.parse(x1); //返回累計毫秒數(從1970/1/1午夜到本地時間)
console.log(time1); //1502189712000
x2=x.toUTCString(); //返回國際標准時間字符串
console.log(x2); //Tue, 08 Aug 2017 11:00:15 GMT
time2=Date.UTC(2017,8,8); //返回累計毫秒數(從1970/1/1午夜到國際時間)
console.log(time2); //1504828800000
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) 返回角的正切。
console.log(Math.abs(-4)); //4(返回數的絕對值。)
console.log(Math.exp(0)); //1(返回 e 的指數。括號里邊表示e的多少次方)
console.log(Math.floor(3.9)); //3(對數進行向下取整)
console.log(Math.log(1)); //0(返回數的自然對數(底為e))
console.log(Math.max(2,3)); //3(返回數中的最高值。)
console.log(Math.min(2,3)); //2(返回數中的最低值。)
console.log(Math.pow(2,3)); //8(返回 x 的 y 次冪。)
console.log(Math.random()); //0.21343409927353818(返回 0 ~ 1 之間的隨機數。)
console.log(Math.round(3.4)); //3(把數四舍五入為最接近的整數)
sin(x) 返回數的正弦。
console.log(Math.sqrt(4)); //2(返回數的平方根)
tan(x) 返回角的正切。
練習:獲取1-100的隨機整數,包括1和100
var num=Math.random();
num=num*100;
num=Math.round(num);
console.log(num);
Function 對象(重點)
函數
函數就是重復執行的代碼片。
函數的定義
function 函數名 (參數){
<br> 函數體;
return 返回值;
}
功能說明:
可以使用變量、常量或表達式作為函數調用的參數
函數由關鍵字function定義
函數名的定義規則與標識符一致,大小寫是敏感的
返回值必須使用return
Function 類可以表示開發者定義的任何函數。
用 Function 類直接創建函數的語法如下:
var 函數名 = new Function("參數1","參數n","function_body");
函數'return'關鍵字
函數中'return'關鍵字的作用:
1、返回函數執行的結果
2、結束函數的運行
3、阻止默認行為
函數定義與執行
<scrip>
// 函數定義
function aa(){
alert('hello!');
}
// 函數執行
aa();
</script>
代碼示例:
<script>
function func1(name){
alert('hello'+name);
return 8
}
ret=func1("yuan");
alert(ret);
var func2=new Function("name","alert(\"hello\"+name);");
func2("egon")
</script>
運行結果:
先alert:helloyuan
再alert:8
最后alert:helloegon
注意:js的函數加載執行與python不同,它是整體加載完才會執行,所以執行函數放在函數聲明上面或下面都可以:
<script>
function f(){
console.log("hello")
}
f()
</script>
<script>
f();
function f(){
console.log("hello")
}
</script>
即:上面兩段代碼都會正常執行,打印正確結果
Function 對象的屬性
上面我們用 Function 類直接創建函數的行為有助於我們理解函數只不過是一種引用類型,它們的行為與用 Function 類明確創建的函數行為是相同的。
所以它們也有屬性和方法。
比如,ECMAScript 定義的屬性 length 聲明了函數期望的參數個數。
alert(func1.length)
Function 的調用
<script>
function func1(a,b){
alert(a+b);
}
func1(1,2); //3
func1(1,2,3); //3
func1(1); //NaN
func1(); //NaN
</script>
//發現只要函數名寫對即可,參數怎么填都不報錯.
<script>
//-------------------面試題-----------
function a(a,b){
alert(a+b);
}
var a=1;
var b=2;
a(a,b);
</script>
運行結果:報錯
Uncaught TypeError: a is not a function
at test.html?_ijt=hfb5ihhe3hm95n2m512oubh98t:18
函數的內置對象arguments
<script>
function add(a,b){
console.log(a+b); //3
console.log(arguments.length); //2
console.log(arguments); //(2) [1, 2, callee: function, Symbol(Symbol.iterator): function]
}
add(1,2)
</script>
<script>
//------------------arguments的用處1 ------------------
function add(){
var result=0;
for(var num in arguments){
result+=arguments[num]
}
alert(result)
}
add(1,2,3,4,5)
</script>
運行結果:15(統計函數所有參數的和)
<script>
//------------------arguments的用處2 ------------------
function f(a,b,c) {
if (arguments.length!=3){
throw new Error("function f called with "+arguments.length+" arguments,but it just need 3 arguments")
}
else{
alert("參數個數剛好")
}
}
f(1,2,3,4,5)
</script>
運行結果:
Uncaught Error: function f called with 5 arguments,but it just need 3 arguments
at f (test.html?_ijt=hfb5ihhe3hm95n2m512oubh98t:15)
at test.html?_ijt=hfb5ihhe3hm95n2m512oubh98t:21
匿名函數
定義的函數可以不給名稱,這個叫做匿名函數,可以將匿名函數直接賦值給元素綁定的事件來完成匿名函數的調用。
<script>
var ele_btn=document.getElementById("btn1");
ele_btn.onclick=myalert;
function myalert() {
alert("ok")
}
</script>
<script>
var ele_btn=document.getElementById("btn1");
// 直接將匿名函數賦值給綁定的事件
ele_btn.onclick=function (){
alert("ok")
}
</script>
<script>
// 匿名函數的應用
(function(){
alert("tony");
})();
(function (arg) {
console.log(arg);
})("123")
</script>
運行結果:
alert:tony
顯示123
BOM對象
window對象
所有瀏覽器都支持 window 對象。
概念上講.一個html文檔對應一個window對象.
功能上講: 控制瀏覽器窗口的.
使用上講: window對象不需要創建對象,直接使用即可.
Window 對象方法
alert() 顯示帶有一段消息和一個確認按鈕的警告框。 confirm() 顯示帶有一段消息以及確認按鈕和取消按鈕的對話框。 prompt() 顯示可提示用戶輸入的對話框。 open() 打開一個新的瀏覽器窗口或查找一個已命名的窗口。 close() 關閉瀏覽器窗口。 scrollTo() 把內容滾動到指定的坐標。
定時器:
setTimeout() 只執行一次的定時器
clearTimeout() 關閉只執行一次的定時器
setInterval() 反復執行的定時器
clearInterval() 關閉反復執行的定時器
方法使用
1、alert confirm prompt以及open函數
<script>
alert("hello kaylee");
//
var result1=confirm("確認刪除嗎?");
alert(result1); //true或者false(確認是true,取消是false)
//
//prompt 參數1 : 提示信息. 參數2:輸入框的默認值. 返回值是用戶輸入的內容.
var result2=prompt("請輸入一個數字","haha");
alert(result2); //輸入的內容
//open方法 打開一個新的窗口 並進入指定網址.參數1 : 網址.
open("http://www.baidu.com");
//參數1 什么都不填 就是打開一個新窗口. 參數2.填入新窗口的名字(一般可以不填). 參數3: 新打開窗口的參數.
open("","","width=400,resizable=no,height=400");
//close方法 將當前文檔窗口關閉.
close();
</script>
猜數字:
<script>
var num=Math.round(Math.random()*100);
function foo(){
var userNum=prompt("請輸入一個0~100的數字","0");
if(isNaN(+num)){
alert("請輸入有效數字");
foo();
}
else if(userNum>num){
alert("輸入的數字大了");
foo();
}
else if(userNum<num){
alert("輸入的數字小了");
foo();
}
else{
var result=confirm("恭喜答對,是否繼續?")
if(result){
num=Math.round(Math.random()*100);
foo()
}
else{
close()
}
}
}
foo();
</script>
2、setInterval,clearInterval
setInterval() 方法會不停地調用函數,直到 clearInterval() 被調用或窗口被關閉。由 setInterval() 返回的 ID 值可用作 clearInterval() 方法的參數。
語法:<br> setInterval(code,millisec) 其中,code為要調用的函數或要執行的代碼串。millisec周期性執行或調用 code 之間的時間間隔,以毫秒計。
定時器案例:
<input type="text" id="ID1">
<button onclick="start()">開始</button>
<button onclick="stop()">停止</button>
<script>
function showTime(){
var nowd=new Date().toLocaleString();
var temp=document.getElementById("ID1");
temp.value=nowd;
}
var ID;
function start() {
if(ID==undefined){
showTime();
ID=setInterval(showTime,1000);
console.log(ID);
}
}
function stop(){
clearInterval(ID);
ID=undefined;
}
</script>
DOM對象
什么是HTML DOM
- HTML Document Object Model(文檔對象模型)
- HTML DOM 定義了訪問和操作HTML文檔的標准方法
- HTML DOM 把 HTML 文檔呈現為帶有元素、屬性和文本的樹結構(節點樹)
DOM樹

畫dom樹是為了展示文檔中各個對象之間的關系,用於對象的導航。
DOM節點
節點類型
HTML 文檔中的每個成分都是一個節點。
DOM 是這樣規定的:
整個文檔是一個文檔節點
每個 HTML 標簽是一個元素節點
包含在 HTML 元素中的文本是文本節點
每一個 HTML 屬性是一個屬性節點

其中,document與element節點是重點。
節點關系
節點樹中的節點彼此擁有層級關系。
父(parent),子(child)和同胞(sibling)等術語用於描述這些關系。父節點擁有子節點。同級的子節點被稱為同胞(兄弟或姐妹)。
- 在節點樹中,頂端節點被稱為根(root)
- 每個節點都有父節點、除了根(它沒有父節點)
- 一個節點可擁有任意數量的子
- 同胞是擁有相同父節點的節點

訪問 HTML 元素等同於訪問節點,我們能夠以不同的方式來訪問 HTML 元素。
節點查找
直接查找節點
document.getElementById(“idname”)
document.getElementsByTagName(“tagname”) //獲取的是一個選擇集,不是數組,但是可以用下標的方式操作選擇集里面的dom元素。
document.getElementsByName(“name”)
document.getElementsByClassName(“name”)
局部查找
<script>
var div1=document.getElementById("div1");
var ele=div1.getElementsByTagName("p");
console.log(ele.length); //1
console.log(ele[0]); //<p>hello p</p>
var ele2=div1.getElementsByClassName("div2"); console.log(ele2.length); //1
console.log(ele2[0]); //<div class="div2">i am div2</div>
var ele3=document.getElementById("div4"); console.log(ele3); //<div id="div4">i am kaylee</div> var ele4=document.getElementsByName("div3"); console.log(ele4.length); //1
console.log(ele4[0]); //<div name="div3">i am div3</div>
</script>
注意:涉及到尋找元素,注意<script>標簽的位置!
<script>
var ele_div=document.getElementById("div1");
ele_div.onclick=function(){
alert(123)
}
</script>
<div id="div1">這是一個div元素</div>
運行結果:報錯
Uncaught TypeError: Cannot set property 'onclick' of null
at test.html?_ijt=hfb5ihhe3hm95n2m512oubh98t:12
上面的語句,如果把javascript寫在元素的上面,就會出錯,因為頁面上從上往下加載執行的,javascript去頁面上獲取元素div1的時候,元素div1還沒有加載,解決方法有兩種:
第一種方法:將javascript放到頁面最下邊
<div id="div1">這是一個div元素</div>
<script>
var ele_div=document.getElementById("div1");
ele_div.onclick=function(){
alert(123)
}
</script>
第二種方法:將javascript語句放到window.onload觸發的函數里面,獲取元素的語句會在頁面加載完后才執行,就不會出錯了。
<script>
window.onload=function(){
var ele_div=document.getElementById("div1");
ele_div.onclick=function(){
alert(123)
}
}
</script>
<div id="div1">這是一個div元素</div>
導航節點屬性
parentElement // 父節點標簽元素 children // 所有子標簽 firstElementChild // 第一個子標簽元素 lastElementChild // 最后一個子標簽元素 nextElementtSibling // 下一個兄弟標簽元素 previousElementSibling // 上一個兄弟標簽元素
注意,js中沒有辦法找到所有的兄弟標簽!
節點操作
創建節點:
createElement(標簽名) :創建一個指定名稱的元素。
例如:
<script>
var tag=document.createElement("input");
tag.setAttribute("type","text");
console.log(tag); //<input type="text">
</script>
添加節點:
追加一個子節點(作為最后的子節點) 父節點.appendChild(被追加的子節點) 把增加的節點放到某個節點的前邊 somenode.insertBefore(newnode,某個節點);
刪除節點:
父節點.removeChild(要被刪除的子節點)
替換節點:
父節點.replaceChild(新節點, 被替換的舊節點);
節點屬性操作:
1、獲取文本節點的值:innerText innerHTML
innerHTML可以讀取、寫入標簽或者文本,例如: tag.innerHTML = “<p>要顯示內容</p>”;
iinnerText只可以讀取或者寫入文本
2、attribute操作
elementNode.setAttribute(name,value) 建議使用:element.屬性名=屬性值
elementNode.getAttribute(屬性名) <-------------->elementNode.屬性名(DHTML)
elementNode.removeAttribute(“屬性名”);
3、value獲取當前選中的value值
1.input
2.select (selectedIndex)
3.textarea
<select id="sel">
<option>山西省</option>
<option>河北省</option>
<option>河南省</option>
<option>山東省</option>
<option>江蘇省</option>
</select>
<script>
var ele_select=document.getElementById("sel");
ele_select.options.length=0; //清空操作
console.log(ele_select);
</script>
<select id="sel" type="checkbox">
<option>山西省</option>
<option>河北省</option>
<option>河南省</option>
<option>山東省</option>
<option>江蘇省</option>
</select>
<script>
var ele_select=document.getElementById("sel");
ele_select.onchange=function () {
console.log(this.selectedIndex); //選中option的索引值
}
</script>
4.關於class的操作:
elementNode.className
elementNode.classList.add("class值")
elementNode.classList.remove("class值")
5.改變css樣式:
<p id="p1">hello world</p>
<script>
var ele_p=document.getElementById("p1");
p1.style.color="red";
p1.style.fontSize="48px";
</script>
DOM Event(事件)
事件類型
onclick 當用戶點擊某個對象時調用的事件句柄。 ondblclick 當用戶雙擊某個對象時調用的事件句柄。 onfocus 元素獲得焦點。 練習:輸入框 onblur 元素失去焦點。 應用場景:用於表單驗證,用戶離開某個輸入框時,代表已經輸入完了,我們可以對它進行驗證.
onchange 域的內容被改變。 應用場景:通常用於表單元素,當元素內容被改變時觸發.(三級聯動)
onkeydown 某個鍵盤按鍵被按下。 應用場景: 當用戶在最后一個輸入框按下回車按鍵時,表單提交. onkeypress 某個鍵盤按鍵被按下並松開。 onkeyup 某個鍵盤按鍵被松開。
onload 一張頁面或一幅圖像完成加載。
onmousedown 鼠標按鈕被按下。 onmousemove 鼠標被移動。 onmouseout 鼠標從某元素移開。 onmouseover 鼠標移到某元素之上。 onmouseleave 鼠標從元素離開
onselect 文本被選中。 onsubmit 確認按鈕被點擊。
綁定事件方式
方式1:
<div class="div" onclick="foo(this)">點我呀</div> <script> function foo(self){ // 形參不能是this; console.log(self); //<div class="div" onclick="foo(this)">點我呀</div> self.style.color="green"; self.style.fontSize="48px"; } </script>
方式2:
<div class="div">點我呀</div>
<script>
var ele_div=document.getElementsByClassName("div")[0];
ele_div.onclick=function(){
console.log("ok");
console.log(this); //<div class="div">點我呀</div> // this直接用
};
</script>
事件介紹
1、onload:
onload 屬性開發中 只給 body元素加.這個屬性的觸發 標志着 頁面內容被加載完成.應用場景: 當有些事情我們希望頁面加載完立刻執行,那么可以使用該事件屬性.
2、onsubmit:
當表單在提交時觸發. 該屬性也只能給form元素使用.應用場景: 在表單提交前驗證用戶輸入是否正確.如果驗證失敗.在該方法中我們應該阻止表單的提交.
<form id="form">
<input type="text"/>
<input type="submit" value="點我">
</form>
<script>
//阻止表單提交方式1.
//onsubmit 命名的事件函數,可以接受返回值. 其中返回false表示攔截表單提交.其他為放行.
var ele=document.getElementById("form");
ele.onsubmit=function(event){
alert("驗證失敗,表單不會提交");
return false;
}
</script>
<form id="form">
<input type="text"/>
<input type="submit" value="點我">
</form>
<script>
// 阻止表單提交方式2 event.preventDefault(); ==>通知瀏覽器不要執行與事件關聯的默認動作。
var ele=document.getElementById("form");
ele.onsubmit=function(event){
alert("驗證失敗,表單不會提交");
event.preventDefault();
}
</script>
3、事件傳播:
<div id="abc1">
<div id="abc2"></div>
</div>
<script type="text/javascript">
var ele_one=document.getElementById("abc1");
ele_one.onclick=function () {
alert("111")
};
var ele_two=document.getElementById("abc2");
ele_two.onclick=function () {
alert("222");
event.stopPropagation(); //阻止事件向外層div傳播.
}
</script>
4、onselect:
<input type="text" />
<script type="text/javascript">
var ele=document.getElementsByTagName("input")[0];
ele.onselect=function () {
alert(123);
}
</script>
5、onchange:
<select name="" id="">
<option value="">111</option>
<option value="">222</option>
<option value="">333</option>
</select>
<script type="text/javascript">
var ele=document.getElementsByTagName("select")[0];
ele.onchange=function () {
alert(123);
}
</script>
6、onkeydown:
Event 對象:Event 對象代表事件的狀態,比如事件在其中發生的元素、鍵盤按鍵的狀態、鼠標的位置、鼠標按鈕的狀態。
事件通常與函數結合使用,函數不會在事件發生前被執行!
event對象在事件發生時系統已經創建好了,並且會在事件函數被調用時傳給事件函數.我們獲得僅僅需要接收一下即可.
比如onkeydown,我們想知道哪個鍵被按下了,需要問下event對象的屬性,這里就時KeyCode.
<input type="text" id="t1">
<script type="text/javascript">
var ele=document.getElementById("t1");
ele.onkeydown=function (e) {
e=e||window.event;
var keynum=e.keyCode;
var keychar=String.fromCharCode(keynum);
alert(keynum+'---------->'+keychar);
}
</script>
String.fromCharCode()函數用於從一些Unicode字符值中返回一個字符串。 該函數屬於String對象,所有主流瀏覽器均支持該函數。

7、onmouseout與onmouseleave事件的區別:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="x-ua-compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1">
<title>Title</title>
<style>
#container{
width:300px;
}
#title{
cursor:pointer;
background-color: #ccc;
}
#list{
display:none;
background-color: #fff;
}
#list div{
line-height:50px;
}
#list .item1{
background-color: green;
}
#list .item2{
background-color: rebeccapurple;
}
#list .item3{
background-color: lemonchiffon;
}
</style>
</head>
<body>
<div id="container">
<div id="title">hello</div>
<div id="list">
<div class="item1">第一行</div>
<div class="item2">第二行</div>
<div class="item3">第三行</div>
</div>
</div>
<script type="text/javascript">
var ele_container=document.getElementById("container");
var ele_title=document.getElementById("title");
var ele_list=document.getElementById("list");
title.onmouseover=function(){
ele_list.style.display="block";
};
ele_container.onmouseout=function () { // 1.不論鼠標指針離開被選元素還是任何子元素,都會觸發 mouseout 事件。
// 2.只有在鼠標指針離開被選元素時,才會觸發 mouseleave 事件。
ele_list.style.display="none"; }
</script>
</body>
</html>
js的作用域
簡單的說,作用域就是變量與函數的可訪問范圍,即作用域控制着變量與函數的可見性和生命周期。在JavaScript中,變量的作用域有全局作用域和局部作用域兩種。
1、全局變量:在函數之外定義的變量,為整個頁面公用,函數內部外部都可以訪問。
2、局部變量:在函數內部定義的變量,只能在定義該變量的函數內部訪問,外部無法訪問。
一般來說一下幾種情形擁有全局作用域:
(1)最外層函數和在最外層函數外面定義的變量擁有全局作用域
<script>
var name="yuan";
function foo() {
var age=23;
function inner() {
console.log(age);
}
inner();
}
console.log(name); //yuan
// console.log(age); //Uncaught ReferenceError: age is not defined
foo(); //23
inner(); //Uncaught ReferenceError: inner is not defined
</script>
(2)所有末定義直接賦值的變量自動聲明為擁有全局作用域,例如:
<script>
var name="yuan";
function foo() {
age=23;
var sex="male"
}
console.log(name); //yuan
foo();
console.log(age); //23
console.log(sex); //Uncaught ReferenceError: sex is not defined
</script>
(3)所有window對象的屬性擁有全局作用域
一般情況下,window對象的內置屬性都都擁有全局作用域,例如window.alert()、window.location、window.top等等。
作用域鏈(Scope Chain)
在JavaScript中,函數也是對象,實際上,JavaScript里一切都是對象。函數對象和其它對象一樣,擁有可以通過代碼訪問的屬性和一系列僅供JavaScript引擎訪問的內部屬性。其中一個內部屬性是[[Scope]],由ECMA-262標准第三版定義,該內部屬性包含了函數被創建的作用域中對象的集合,這個集合被稱為函數的作用域鏈,它決定了哪些數據能被函數訪問。
示例
<script>
var s=12;
function f() {
console.log(s); //12
}
f();
</script>
<script>
var s=12;
function f() {
console.log(s); //undefined
var s=12;
console.log(s); //12
}
f();
</script>
<script>
var s=10;
function foo() {
console.log(s); //function s() {console.log("ok");}
var s=5;
console.log(s); //5
function s() { // 函數的定義或聲明是在詞法分析時完成的,執行時已不再有任何操作
console.log("ok"); //5
}
console.log(s);
}
foo();
</script>
<script>
function bar(age) {
console.log(age); //fn
var age=99;
var sex="male";
console.log(age); //99
function age() {
alert(123)
}
console.log(age); //99
return 100;
}
result=bar(5);
console.log(result); //100
</script>
補充:
變量與函數預解析
JavaScript解析過程分為兩個階段,先是編譯階段,然后執行階段,在編譯階段會將function定義的函數提前,並且將var定義的變量聲明提前,將它賦值為undefined。
結果分析
以最復雜的例3來分析整個過程。
當一個函數創建后,它的作用域鏈會被創建此函數的作用域中可訪問的數據對象填充。在函數bar創建時,它的作用域鏈中會填入一個全局對象,該全局對象包含了所有全局變量,如下圖所示:

解析到函數調用時,即bar(5),會生成一個active object的對象,該對象包含了函數的所有局部變量、命名參數、參數集合以及this,然后此對象會被推入作用域鏈的前端,當運行期上下文被銷毀,活動對象也隨之銷毀。新的作用域鏈如下圖所示:

過程解析:
function bar(age) {
console.log(age);
var age = 99;
var sex="male";
console.log(age);
function age(){
alert(123);
} ;
console.log(age);
return 100;
}
result=bar(5);
一 詞法分析過程(涉及參數,局部變量聲明,函數聲明表達式):
1-1 、分析參數,有一個參數,形成一個 AO.age=undefined;
1-2 、接收參數 AO.age=5;
1-3 、分析變量聲明,有一個 var age, 發現 AO 上面有一個 AO.age ,則不做任何處理
1-4 、分析變量聲明,有一個 var sex,形成一個 AO.sex=undefined;
1-5 、分析函數聲明,有一個 function age(){} 聲明, 則把原有的 age 覆蓋成 AO.age=function(){};
二 執行過程:
2-1 、執行第一個 console.log(age) 時,當前的 AO.age 是一個函數,所以輸出的一個函數
2-2 、這句 var age=99; 是對不 AO.age 的屬性賦值, AO.age=99 ,所以在第二個輸出的age是 99;
2-3 、同理第三個輸出的是 99, 因為中間沒有改變 age 值的語句了。
注意:執行階段:
function age(){
alert(123)
} ;
不進行任何操作,將執行語句復制給age這部操作是在詞法分析時,即運行前完成的。
