2009-10-13 88 views
6

當我嘗試將事件處理函數與參數,如:訪問事件對象

myhandle.onclick = myfunction(param1,param2); 

function myfunction(param1,param2){ 
} 

現在我要訪問我的處理函數的事件對象。在發送事件對象的網頁上提到了一種方法,如:

myhandle.onclick = myfunction(event,param1,param2); 

但是,當我測試它時,它的給定事件對象未定義。

我知道庫使這個東西很容易,但我正在尋找一個原生的JS選項。

回答

4

我不完全確定你想要做什麼,但也許這樣的事情是你在找什麼?

function myfunction(param1, param2){ 
    return function(event) { 
     // For compatibility with IE. 
     if (!event) { 
      event = window.event; 
     } 

     alert("event = " + event + ", param1 = " + param1 + ", param2 = " + param2); 
    }; 
} 

myhandle.onclick = myfunction(param1, param2); 

的該最終結果是,內部myfunction匿名功能將被調用作爲onclick處理程序,從而在事件加上正在打印的兩個參數。這兩個參數在添加事件處理程序時固定,而event將在用戶每次單擊myhandle時更改。

0

試試這個:

if (!event) { event = window.event; } 

的MyFunction()內。

7

myhandle.onclick = myfunction(param1,param2);

這是JavaScript級別的常見初學者錯誤,而不是庫可以真正爲您解決的問題。

您還沒有分配myfunction作爲一個單擊處理程序,你調用myfunction,用參數1和參數作爲參數,函數的返回值分配給onclickmyfunction不返回任何東西,所以你會被分配到undefinedonclick,這將沒有任何效果..

你是什麼意思是一個引用賦予myfunction本身:

myhandle.onclick= myfunction; 

要通過函數一些額外的參數,你必須做一個包含它們值的閉包,這通常是使用匿名內聯函數完成的。它可以通過事件上太多,如果你需要(儘管無論哪種方式,你需要在事件對象不作爲參數傳遞的IE備份計劃)的護理:

myhandle.onclick= function(event) { 
    myfunction(param1, param2, event); 
}; 

在ECMAScript中第五版,這將是JavaScript的未來版本中,你甚至可以更輕鬆地寫:(與window是用於this虛值,你就不會在這種情況下需要)

myhandle.onclick= myfunction.bind(window, param1, param2); 

然而,由於今天的許多瀏覽器都沒有t支持第五版,如果你想使用這種方法,你必須爲舊版瀏覽器提供一個實現。一些圖書館已經包括一個;這是另一個獨立的。

if (!('bind' in Function.prototype)) { 
    Function.prototype.bind= function(owner) { 
     var that= this; 
     var args= Array.prototype.slice.call(arguments, 1); 
     return function() { 
      return that.apply(owner, 
       args.length===0? arguments : arguments.length===0? args : 
       args.concat(Array.prototype.slice.call(arguments, 0)) 
      ); 
     }; 
    }; 
} 
+0

非常感謝!這很好地解釋了我。 – Rajat 2009-10-13 05:41:59