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

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其内部状态,代码如下:

HTML code

<!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>