2012-04-29 39 views
1

我需要通过这个函数作为回调到DOM事件多态函数作为事件回调

var fooo = function() { 
    $(this).append("foo"); 
    fooo = function() { 
    $(this).append("bar"); 
    }; 
}; 

$("#hover").hover(fooo);​ 

这个例子应该追加“富”,然后在“酒吧” S,但它不工作。我究竟做错了什么?

JSFiddle

回答

2

你正在改变分配给fooo功能,分配为回调为.hover功能。

为了清楚起见,当您将函数作为事件的处理程序传递时(例如$().hover(fooo)),您没有传递fooo的变量,但它指向的函数。如果您将fooo重新分配给其他东西,原始函数仍然是作为事件处理程序绑定的那个函数。

如果我想做你想做的事情,那么我会用一个稍微不同的范例。像

var fooo = (function() { 
    var altBehavior = false; 
    return function() { 
     $(this).append(altBehavior ? "bar" : "foo"); 
     altBehavior = true; 
    } 
})(); 

$("#hover").hover(fooo);​ 

东西实际绑定功能不会改变,但背景下,存在于一样。

+0

** + 1 **很好的接收! – gdoron 2012-04-29 14:25:13

+0

感谢您的解决方案,自我评估功能的作品 - 你指向我[这个](http://jsfiddle.net/tNBx9/2/),这是一个更适合我的情况。谢谢 – janfabian 2012-04-29 14:31:24

2

这也不行:

var fooo = function() { 
    $(this).append("foo"); 
}; 

$("#hover").hover(fooo); 

fooo = function() { 
    $(this).append("bar"); 
}; 

监守你改变了变量,但不传递到hover事件回调。

您需要指定新功能的回调:

var fooo = function() { 
    $(this).append("foo"); 
}; 

$("#hover").hover(fooo); 

fooo = function() { 
    $(this).append("bar"); 
}; 
$("#hover").unbind('hover').hover(fooo);​ 
+1

您需要删除旧的事件处理程序,否则你最终追加'foobar',而不是仅仅'bar'。看到我的答案。 – Dennis 2012-04-29 14:32:45

+0

@丹尼斯。更新。 _32bitkid_答案比我的好。 – gdoron 2012-04-29 14:37:08

0

您正在将函数fooo分配给悬停事件,然后更改该变量,而不更改处理程序本身。你应该解除绑定然后绑定另一个函数。 hover是两个事件的简写,所以拆散他们每个人:

var fooo1 = function() { 
    $(this).append("foo").unbind("mouseenter", fooo1).unbind("mouseleave", fooo1).hover(fooo2); 
}; 

var fooo2 = function() { 
    $(this).append("bar"); 
} 

$("#hover").hover(fooo1);​