Python--JavaScript的對象


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這部操作是在詞法分析時,即運行前完成的。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM