javascript 基礎篇3 類,回呼函數,內建對象,事件處理

來源:互聯網
上載者:User

複製代碼 代碼如下:function 類名(參數表){
this.屬性;
......
this.函數;
}

這樣,函數和資料成員都是用“this.”來實現。
我們自己定義一個簡單類student好了,然後再去構造它,並且實現一個輸出函數。 複製代碼 代碼如下:<script LANGUAGE="JavaScript">
<!--
function student(a,b){
this.name = a;
this.age=b;
this.output=function(){
document.write("student: "+this.name+" age: "+this.age+"</br>");
}
}
var stu1=new student("Zhan Bo",20);
var stu2=new student("Hu Yifei", 23);
stu1.output();
stu2.output();
-->
</script>

(喂這也太簡單了吧魂淡(||| ̄— ̄)==o(#) ̄▽ ̄)∕ )
恩。。總之大體意思懂了就好了。。

匿名函數:
就是沒有名字的函數 function(參數表){.......} 匿名函數是用完就被拋棄(好可憐 TvT)
回呼函數:
常表現為一個函數的參數是另一個函數。其實這個狀況常遇到的,比如java裡給控制項添加一個listener的時候,listener的參數其實是個函數。
這個函數我們就可以直接在參數裡面new就可以了,就是做了個匿名函數,因為每個響應都是針對這個控制項的,因此一般不會有再次需要的情況。
不過我們舉個例子還是按正常的路子走。 複製代碼 代碼如下:<script LANGUAGE="JavaScript">
<!--
function Huidiao(a){
alert(typeof a);// for testing if the function has ran
if(typeof a=='function')
a();
}
var test=function(){
document.write("this is testing.");
}
Huidiao(test);
//-->
</script>

(非常感謝二樓Arliang 指出錯誤!)
此處注意事項:
1.typeof a的類型function是小寫,因為js大小寫敏感,所以必須注意。
2.Huidiao(test) test不需要寫出括弧,因為它的參數就僅僅是一個變數,如果寫成(test()),那麼函數會執行test();這個函數,但是Huidao函數不執行,因為test()沒有傳回值,那個麼Huidiao的參數其實是未定義的。
輸出大家都想得到的。。
然後再說一句:Javascript中沒有重載。不要癡心妄想了騷年~ㄟ( ̄v ̄ㄟ)

--------------------------------------------------------------------------------
接下來學習js裡面的內建對象,其實我們已經接觸過幾個了。
常用的內建對象: String Date Math Array Number Globle
String大家都很懂的,var s="xxxxx"; 或者 var= new String("xxxx"); 意思差不多,至於String裡涵蓋的一些操作函數的話。。請自行下載javascript的API文檔親,我就不給串連了親,自己搜搜吧~
提供一個線上的參考手冊串連:點這裡 http://www.jb51.net/w3school/js/jsref_obj_string.htm (這個網站不錯,有空可以看看~)
每個對象的資料成員和函數成員就都有了,老師在這裡一直講那些個函數,我都睡著了,其實根本沒必要講,用的時候看看就行了,熟了以後都不需要看就知道有什麼啦~
然後稍微說一下Array這個對象,實際上JS並沒有提供二維數組,but,我們可以通過嵌套來實現,比如
var array2=new Array(new Array(4), new Array(), new Array(1,2,3,4));

最後,除了這些常用對象外,
還有一些全域的函數和事件也需要熟悉起來,
對應到文檔裡就是function和event兩個部分。
事件處理:
事件處理是什麼我覺得應該沒有人不清楚吧,我也懶得寫概念了,因為寫了也沒人會記住的╮(╯▽╰)╭
然後,指定事件處理常式有三種方法:
第一:直接在HTML標記中指定 <標記.......事件="事件處理常式" .....>
第二:編寫特定對象特定之間的javascript <script LANGUAGE="JavaScript" for="對象" event="事件"> ........ </script>
第三:在javascript中說明 <事件主角 - 對象><事件>=<事件處理常式>;
常用的事件羅列一下:

滑鼠事件 鍵盤事件 HTML事件 變動事件

onclick 單擊事件

ondblClick 雙擊事件

onmouseover 滑鼠移到上方

onmouseout   滑鼠離開事件 

onmousedown 滑鼠按下事件

onmouseup 滑鼠放開事件

onselect 選中事件

onkeydown 按鍵事件

onkeypress 按下鍵事件

onkeyup 放開鍵事件

onload 視窗載入事件

onunload 視窗離開事件

onresize 改變視窗大小觸發事件

onabort 中斷事件

onerror 例外狀況事件

onreset 按下重設按鈕事件

onsubmit 提交事件

onblur 失去焦時間點事件

onfocus 獲得焦時間點事件

onchange 值改變觸發事件

第一種是最常用的,比如提交啊,儲存啊之類的事件,有資料庫相關操作的,都可以在script裡面完成。我相信寫過網頁的同學肯定都接觸過的,比如我們寫一個簡單的小例子: 複製代碼 代碼如下:<html>
<head>
<title>O.O</title>
<script type="text/javascript" src="js/output.js"></script>
<script LANGUAGE="JavaScript">
<!--
function alertW(){
alert("Button Clicked");
}
-->
</script>
</head>
<body>
<input type="Button" value = "HTML" onclick="alertW();" >
<!--
This is my JSP page. <br>
-->
</body>
</html>

定義一個button,然後給它一個響應事件,其實就是第一種,當然,因為這個的響應非常簡單,也可以在button控制項那裡直接這麼寫:
<input type="Button" value = "HTML" onclick="window.alert('Button Clicked')" > (這裡注意下,alert()裡面的字串用單引號,不能用雙重雙引號。)
二者效果相同的。

但對於第二種來說,用的很少,我百度了半天,查了window對象的事件,測試了許多,但是只有onload事件是可行的,代碼如下: 複製代碼 代碼如下:<script LANGUAGE="JavaScript" for="window" event="onload">
alert("load successed");
-->
</script>

然後經過我的仔細研究,許多事件,比如“onbeforeunload”等,都是只在IE中可行的,那麼我們就毫不猶豫的放棄此方法就好。知道就行了。

PS 用百度搜一下“網頁製作完全手冊”,是個CHM的協助檔案,第一個出來的 新浪檔案就可以下載,裡面東西很全,需要的話就下載來參考吧~

OK,第三種,據說在Ajax架構裡大量使用,但是作為一個不會ajax的人。。。好吧,我們慢慢學起。
第三種稍微涉及了點下一部分要說的DOM。不過木有關係,不影響大局,第三種的格式看起來比較複雜,其實很簡單。

在添加控制項的時候,給控制項一個ID,但後在javascript裡面利用ID拿到這個控制項,然後對它的各種事件進行操作,比如:

複製代碼 代碼如下:<body>
<input type="text" value="JS Object" id="input">
<script type="text/javascript">
var inpt=document.getElementById("input");
inpt.onblur=function(){
alert("How can you abandon me~?");
}
</script>
</body>

這樣,我們就給text文字框添加了一個事件響應,這裡要強調一點:script響應必須寫在控制項聲明之後,否則編譯器就無法根據ID找到控制項了。

PS,其實也可以根據name找到控制項,但是還是建議用ID,因為name可以相同,id不可以相同

關於每個控制項有哪些響應,可以在之前那個網站裡翻翻,或者下載我說的那個手冊,就可以了,下面的就是那個手冊裡關於input text控制項的事件列表~當然不止這點,右邊還有下拉條的~

其實我還是比較推薦下載一下這個手冊的,挺好的一工具。

簡單介紹了事件處理後,我們學習一下Event對象

event對象代表事件狀態,如事件發生的元素,鍵盤狀態,滑鼠位置和滑鼠按鍵狀態。

在IE中可以用window.event擷取,但是FF不行,所以為了相容,採用如下策略。。程式猿們的智慧是偉大的。

複製代碼 代碼如下:function eventName(event){
event=event|| window.event;
.................
}

事件程式綁定:

<body 事件名稱="eventName(event);"></body>

因為比較抽象,我們還是寫個代碼,心裡踏實點。 複製代碼 代碼如下:<html>
<head>
<style>
<!--
.divstyle
{
position:absolute;
width:120px;
height:80px;
border:3px outset #FFFF00;
padding-left: 4px;
}
//-->
</style>
<title>testing</title>
<script type="text/javascript" src="js/output.js"></script>
</head>
<body>
<div id="fistdiv" class= "divstyle" onmousedown="clicked(event)"></div>
<script type="text/javascript">
function clicked(event){
event=event||window.event;
var s;
s="coordinate-X :"+event.clientX;
s+="\n"+"coordinate-Y: " +event.clientY;
var obj=document.getElementById("fistdiv");
obj.innerText=s;
obj.textContent=s; alert(s);
}
</script>
</body>
</html>

注意,此處感謝三樓 Aleax的協助,我直接引用他的話並給出例子,關於div中的屬性innerText:

FF裡面的innerText不可用,替代方法: textContent
IE: oDiv.innerText = aString; oDiv.innerHTML = aString;
FF: oDiv.textContent = aString; oDiv.innerHTML = aString;

由於對於不認識的語句瀏覽器會忽略,我們可以直接像我上面寫的,寫出兩行代碼來遷就這倆,同時還有另一個辦法可以讓它縮為一句,就是obj.innerHTML=s;

這裡順便說下innerText和innerHTML的差別:innerText只接受文本,然後直接輸出,但是innerHTML識別HTML語句,也就是說,如果寫
innerText="<br>Hello" ; 那麼輸出就是:<br>Hello 如果寫innerHTML="<br>Hello"那麼輸出是換行後的Hello。

事件冒泡問題
事件冒泡問題其實就是,一個操作觸發了多個響應,比如body定義了onclick的事件,body下面的div也定義了onclick事件,那點了div之後,先做了div的事件響應,然後向上冒泡,body的click事件也被觸發了。
解決的辦法也不麻煩,但是依舊要遷就IE和FF這倆好基友的矛盾:
IE裡面阻止冒泡,使用: 事件對象.cancelBubble=true;
FF裡面阻止冒泡,使用: 事件對象.stopPropagation(); (剛才查了一下,propagation [,prɔpə'ɡeiʃən] 的意思是繁殖,繁衍。。原諒我的詞彙量吧TvT)
好了為了讓這對好基友和諧相處,我們只好再做一個判斷:

複製代碼 代碼如下:function xxxxx(event){
.........;
if(event&&event.stopPropagation) //說明是個Firefox
event.stopPropagation();
else
event.cancleBubble=true;
}

當然,這個判斷要寫在下層的結點裡,比如剛才的例子裡,如果把它寫在body的click事件裡,那就是做無用功了。
--------------------------------------------------------------------------------
最後,一個小應用,是對輸入的情況判斷,我們註冊網站的時候常遇到的:
代碼如下: 複製代碼 代碼如下:<html>
<head>
<style>
<!--
#checkspan
{
display: none;
color: #ff0000;
}
//-->
</style>
<title>testing</title>
<script type="text/javascript" src="js/output.js"></script>
</head>
<body>
Input: <input type="text" onblur="blured()" id="input"><span id="checkspan"></span>
<script type="text/javascript">
function blured(){
var obj=document.getElementById("checkspan");
var s=document.getElementById("input").value;
if(s.length<5)
obj.innerHTML=" too short";
else{
obj.innerHTML=" correct";
obj.style.color="green"
}
obj.style.display="inline";
}
</script>
</body>
</html>

效果如下:

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.