2012-11-15 76 views
0

我想用右鍵創建一個可重用的Header對象。點擊按鈕時,我的回調方法出現問題。它從未被調用過。Javascript回調方法不叫?

我的目標:

myHeader:function(params) 
{  
    opt = { 
     title: "Title", //header tittle 
     fs: PrecApp.DEFAULT_HEADER_FONTSIZE, //font size 
     ignoreStack :true, //ignore stack 
     height: "70", //header height 
     rightButton: { 
      show :false, //show right button 
      background: "none", //background for right button 
      text: "Button", //text for right button 
      width: "auto", 
      height:"auto",    
      color:"black", 
      fontize:1, 
      extraCss: null, 
      onClick:function(){} 
     } 
    } 
for (i in params) opt[i] = params[i]; 

    if (opt.rightButton.show){ 
     var right = $("#header .right");    
     right.click(opt.rightButton.onClick);   

    }  
} 

而且在我的html:

function updateLayout(){ 
       PrecAppComponents.myHeader({ 
        title:"My Title", 
        fs:1.5, 
        height:50, 
        rightButton:{ 
         show:true, 
         background:"#ffff00", 
         text:"Right", 
         width:70, 
         height:30, 
         fontsize:1.1, 
         extraCss: {"float":"left", "font-size":"0.5em"}, 
         onClick: PrecAppComponents.toggleDarkOverlay(true) 

        } 
} 

其他一切工作正常。如果我更換

right.click(opt.rightButton.onClick);  

right.click(function(
    console.log("clicked") 
));  

它工作正常。我究竟做錯了什麼?

+1

你怎麼知道它不會被調用? 'function(){}'不做任何事情。 – Quentin

+0

小心'這個'。如果你的'onClick'函數(我假設你在你的代碼中的其他地方做了非平凡的)使用'this',它將不會被設置爲'opt.rightButton',除非你明確地這樣做(例如使用'bind') 。 –

+0

我想用'for(i in params)opt [i] = params [i];'他試圖用'params'擴展'opt'。 – dfsq

回答

1

看起來你的onClick選項正在調用一個函數。除非是調用返回另一個函數,這是不行的:

onClick: PrecAppComponents.toggleDarkOverlay(true) 

你不得不改變它的東西,如:

onClick: function() { 
    PrecAppComponents.toggleDarkOverlay(true); 
} 

// or with bind, perhaps 

onClick: PrecAppComponents.toggleDarkOverlay.bind(PrecAppComponents, true); 
+0

已結算!如果在HTML覆蓋中使用匿名函數進行環繞,它可以起到魅力!非常感謝!我仍然在學習這個js技巧!我會盡快在5分鐘內接受你的回答:)。 – caiocpricci2

0

嘗試封裝在一個匿名函數:

right.click(function(){opt.rightButton.onClick();});  
0

好像PrecAppComponents.toggleDarkOverlay(true)不是返回函數被稱爲事件處理程序 - 您可以立即執行它。您將需要使用

function(e) { 
    PrecAppComponents.toggleDarkOverlay(true); 
} 

PrecAppComponents.toggleDarkOverlay.bind(PrecAppComponents, true)