2012-11-15 58 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)