Javascript 給頁面元素添加時間函數探討

來源:互聯網
上載者:User
前言

HTML 本身就有事件觸發的屬性,比如 onclick, onmouseover ,....。

直接看Code(註: 本文都以onclick 來做例子)

 

<!--Add by oscar999--><!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN"><HTML><HEAD><TITLE> New Document </TITLE><META NAME="Author" CONTENT="oscar999"><script>var func = function test(str){   alert("go test "+str);}</script></HEAD><BODY><input type=button name="name1" id="id1" onclick="test(this.id)" value="click"><input type=button name="name1" id="id2" onclick="test(this.id)" value="click"></BODY></HTML>

這個例子很簡單, 但是如果有以下狀況出現:

 

1.  元素的onclick 事件函數不確定

2. 傳遞的參數是後台傳輸的,有很大的不確定性或動態性

3. 傳遞的參數的值比較特殊,比如說是一個 object , array。 更有甚者值裡面就包含單、雙引號。

可能會說, 我可以把 object , Array 轉換成string, 或是使用逸出字元替代雙引號。但是不顧能否解決,複雜度和靈活性都遠遠存在問題。

當然,解決方案就是使用JS來添加事件函數。

使用JS添加事件函數

直接看正確的程式碼範例:

 

<!--Add by oscar999--><!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN"><HTML><HEAD><TITLE> New Document </TITLE><META NAME="Author" CONTENT="oscar999"><script>var func = function test(str){   alert("go test "+str);}</script></HEAD><BODY><input type=button name="name1" id="id1" value="click"><input type=button name="name1" id="id2" value="click"><script>var inputobjs = document.getElementsByName("name1");for(var i=0;i<inputobjs.length;i++){  var inputobj = inputobjs[i];  inputobj.onclick = function()  {     test(this.id);  }}</script></BODY></HTML>

以上執行個體很簡單,實現的機制也很簡單, 就是使用 obj.onclick 來實現
需要注意的是在寫的時候可能會有意無意犯了以下錯誤:

 

1.  onclick 的賦值不對

2.  參數傳遞錯誤

onclick 的賦值不對

 

<!--Add by oscar999--><!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN"><HTML><HEAD><TITLE> New Document </TITLE><META NAME="Author" CONTENT="oscar999"><script>var func = function test(str){   alert("go test "+str);}</script></HEAD><BODY><input type=button name="name1" id="id1" value="click"><input type=button name="name1" id="id2" value="click"><script>var inputobjs = document.getElementsByName("name1");for(var i=0;i<inputobjs.length;i++){  var inputobj = inputobjs[i];  inputobj.onclick = test(inputobj.id);}</script></BODY></HTML>

這裡直接寫成

inputobj.onclick = test(inputobj.id);

看上去和在元素中定義的是一樣的。

 

但是這會被解析成執行。

函數名(參數);  ==> 這種格式在HTML會被當成字串,在 <script> 標籤中就會被執行,被調用,而不是在定義。

以上執行的結果是:

事件添加不成功, 函數直接執行。(IE中還會出錯)

所以正確的方式就是使用
obj.onclick =function()
{
     test(this.id);
}

這種方式定義。 可能你會說,這個定義只是額外加了外面一層function 包起來,如果實在不想這麼寫,怎麼辦?

那就換以下方式吧:

 

<!--Add by oscar999--><!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN"><HTML><HEAD><TITLE> New Document </TITLE><META NAME="Author" CONTENT="oscar999"><script>var func = function test(str){   str = this.id;   alert("go test "+str);}</script></HEAD><BODY><input type=button name="name1" id="id1" value="click"><input type=button name="name1" id="id2" value="click"><script>var inputobjs = document.getElementsByName("name1");for(var i=0;i<inputobjs.length;i++){  var inputobj = inputobjs[i];  inputobj.onclick = func;}</script></BODY></HTML>

 

參數傳遞錯誤

看錯誤例子:

 

<!--Add by oscar999--><!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN"><HTML><HEAD><TITLE> New Document </TITLE><META NAME="Author" CONTENT="oscar999"><script>function test(str){   alert("go test "+str);}</script></HEAD><BODY><input type=button name="name1" id="id1" value="click"><input type=button name="name1" id="id2" value="click"><script>var inputobjs = document.getElementsByName("name1");for(var i=0;i<inputobjs.length;i++){  var inputobj = inputobjs[i];  inputobj.onclick = function()  {     test(inputobj.id);  };}</script></BODY></HTML>

錯在哪? inputobj 相當與一個全域變數, 對於兩次不同的賦值來說,傳遞的參數值都是一樣的(最後一次賦值)。

 

要修改, 很簡單

 

test(inputobj.id);

改成

 

 

test(this.id);

就可以了。

 

 

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在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.