我希望使用Mootools来快速完成一项任务,即在单击时切换一些文字。但我似乎找不到Mootools中与jQuery的toggle()函数等效的函数。
我的目标如下:
$('a#id').toggle(
function() {
$(this).set('html', 'new text');
},
function() {
$(this).set('html', 'old text');
}
);
如何修改以上代码以适用于mootools?
谢谢!
Element.implement({
toggle: function(fn1,fn2){
this.store('toggled',false);
return this.addEvent('click',function(event){
event.stop();
if(this.retrieve('toggled')){
fn1.call(this);
}else{
fn2.call(this);
}
this.store('toggled',!(this.retrieve('toggled')));
});
}
});
//using it in a 'jQuery' mode
$('mya').toggle(
function() {
this.set('html', 'new text');
},
function() {
this.set('html', 'old text');
}
);
在这里试验: http://www.jsfiddle.net/steweb/qBZ47/
编辑2 查看改进版本 http://jsfiddle.net/dimitar/UZRx5/ (感谢 @Dimitar Christoff)
我知道你已经接受了其他答案,但是MooTools 1.3现在提供了一个非常好的新功能,即Element Pseudos,我认为这将是一个不错的解决方案。首先,下面是代码:
http://www.jsfiddle.net/dimitar/VR9k8/4/
(function() {
var toggled = 0;
Event.definePseudo('toggle', function(split, funcsArray, args){
if (funcsArray.length && funcsArray[toggled])
funcsArray[toggled].apply(this, args); // args[0] is the Event instance
toggled++;
if (toggled >= funcsArray.length)
toggled = 0;
});
})();
document.id("foo").addEvent("click:toggle", [function(e) {
e.stop();
alert("function 1");
}, function(e) {
e.stop();
alert("function 2");
}, function(e) {
e.stop();
// event object (args[0])
console.dir(e);
alert("function 3");
}]);
这将允许您将nn个函数串联起来连续运行,并传递参数或至少原始事件。
文档: http://mootools.net/docs/more/Element/Element.Event.Pseudos
元素原型解决方案的等效或改进版本在这里。
return this
,这样就不会破坏链接 :) 另一个改进是使用第二种方法将点击回调保存在元素存储或闭包中,以便可以通过精确匹配"click", element.retrieve("toggler");
来删除它 - 除非您不打算停止切换。 :) - Dimitar Christoffarguments
支持无限的函数。虽然你可能不会用到它,但是谁知道呢...能够做到总比不能做好 :) - Dimitar Christoff