JavaScript事件響應函數傳參的問題


經常在外部JavaScript文件中分配響應函數,比如:

1 window.onload=function(){
2     //...   
3 }

有些時候響應函數是有參數的:

<input type="button" onclick="ClickResp('hello world'')" />

這種情況要怎么在外部JavaScript實現?

 

這里面涉及兩個問題:
1. 匿名函數的傳參問題。比如 var func=function(){}; 的情況,這里根本不允許實參的出現,因為只是定義而不是調用。
2. 怎么把數據從HTML傳給所鏈接的外部JavaScript文件?比如上面的例子中的'hello world'怎么傳給JavaScript處理?這個例子可以用value="hello world"來解決,但是如果有多個參數呢?

第一個問題可以用JavaScript一個經典特性來解決——閉包。
以 var func=function(){}; 為例,第一個問題的前提是實參已經在func的域或空間里面了,即使數據需要從HTML獲得,這個問題只是考慮數據到達JavaScript處理的空間之后的事情。因此,這個問題跟第二個問題之間是獨立的。
已知閉包使得內層函數能夠共享外層函數的域,因此可以確定閉包能夠解決:

 1 var arg_handler = function(arg){
 2     alert(arg);
 3 };
 4 
 5 var real_arg="hello world";
 6 var arg_wrapper=function(){
 7     return arg_handler(real_arg);
 8 }
 9 
10 window.onload=arg_wrapper;

 第二個問題可以用HTML5的data-*屬性來解決。前面已經說過可以用value來傳參,現在可以改為用自定義屬性來傳參,就沒有參數個數的限制問題了:

 1 <!DOCTYPE html>
 2 <html>
 3 <head>
 4     <script>
 5         window.onload=function(){
 6             var foo=document.getElementById('data').getAttribute('data-foo');
 7             var bar=document.getElementById('data').getAttribute('data-bar');
 8             var wrapper=function(){
 9                 alert(handler(foo, bar));
10             };            
11             var handler=function(x, y){
12                 return x+y;
13             };            
14             document.getElementById('data').onclick=wrapper;
15         };    
16     </script>
17 </head>
18 <body>
19     <input type="button" data-foo="foo" data-bar="bar" value="click" id="data"  />
20 </body>
21 </html>

寫這段示例代碼的時候出現了一個新問題,在另一篇隨筆中記錄。


免責聲明!

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



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