日期:2014-05-16  浏览次数:20370 次

jquery 的toggle函数,取消绑定后,重新绑定时,为何仍保留原先的执行顺序
比如我给一个元素  $('d').toggle(f1, f2);

这时,用户点击了d元素,执行了f1。 
若我想让d元素重新绑定f1, f2函数, 即不论以前用户是否点击过d,现在都重新从 f1先执行。

可是问题出现了。 我 $('d').unbind(); 然后再 $('d').toggle(f1, f2)。 竟然jquery记录了以前的执行次序。

若我的执行顺序是这样的:
$('d').toggle(f1, f2);  --》   用户点击执行了f1   --》   $('d').unbind();    --》 $('d').toggle(f1, f2); 
--》 用户再次点击,此时不是从f1开始执行,而是直接从f2执行。我去,这咋办?
怎么解决这个问题呢?我知道有一个方式,就是f1,f2不使用变量,而直接在绑定的时候写成 toggle(function(){}, function(){});

但有没有更好的方式呢?

------解决方案--------------------
one 一个个绑上去, return false
------解决方案--------------------
看了jQuery源码,toggle的内部状态并不对外开放,最暴力的办法就是hack其内部状态,代码如下:


<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<HTML>
<HEAD>
<TITLE> New Document </TITLE>
<META NAME="Generator" CONTENT="EditPlus">
<META NAME="Author" CONTENT="">
<META NAME="Keywords" CONTENT="">
<META NAME="Description" CONTENT="">
</HEAD>

<BODY>
<input id="login" type="button" value="login" />
<input id="rebind" type="button" value="rebind" />
<script src="jquery-1.7.2.js"></script>
<script language="javascript">
$(function(){
function funA(){
alert(1);
}
function funB(){
alert(2);
}
var $login = $("#login");
$login.toggle(funA,funB);
$("#rebind").click(function(){
$._data( $login[0], "lastToggle" + funA.guid, 0 );//hack
$login.unbind();
$login.toggle(funA,funB);
});
});
</script>
</BODY>
</HTML>


用的是jquery-1.7.2.js,如果不在乎将来jquery的toggle方法内部状态有变化导致hack失效的话

再不然自己在jquery-1.7.2.js里把toggle状态开放出来,当然以后升级jquery就麻烦一点,自己的版本要跟着修改

有用就给点分吧
哎,生活好无聊啊