开发者社区> 问答> 正文

jquery的.toggle()方法只能用于元素的显示与隐藏吗?

若是我想实现点击第一次,执行函数1;点击第二次执行函数2。我需要使用那些方法呢?我还以为toggle可以实现呢。

我写的代码是这个样子的:
screenshot
效果是:

1.页面刷新之后,控制台打印“11”,此时根本没有点击;
2.点击按钮没有反应,请问到底是怎么回事?怎么写?

展开
收起
小旋风柴进 2016-05-31 11:41:36 2119 0
1 条回答
写回答
取消 提交回答
  • jQuery 1.8之后就不支持事件的切换,仅用来元素的隐藏与显示。不过,可以通过自己写代码实现。
    1.通过flag来控制执行执行哪个函数。比如执行fn1时,flag置为true;执行fn2时,flag置为false.
    2.通过给元素加减class来控制那个函数。和方法1类型。
    3.代码实现toggle,避免方法1和方法2中添加变量和操作dom,毕竟这两个都需要开销,原理类似于递归调用,代码如下。

    $('#btn').one('click', function(){
        handler1();//第一次已经是click了,所以需要先执行一次handler1
        setTimeout(fn1, 200);//防止后面定义的事件被触发。
    });
    function  fn1(){
        var obj = $(this);
        obj.one('click',function(){
            handler2();
            fn2(obj);
        });
    }
    function  fn2(obj){
        obj.one('click',function(){
            handler1();
            fn1(obj);
        });
    }
    
    function handler1(){
        console.log('11');
    }
    function handler2(){
        console.log('22');
    }

    当然为了使用方便,也可以封装成jQuery插件的模式。

     $.fn.toggleEx = function(handler1, handler2){
    
        $(this).one('click', function(){
            handler1();
            setTimeout(fn1, 200);//防止后面定义的事件被触发。
        });
    
        function  fn1(){
            var obj = $(this);
            obj.one('click',function(){
                handler2();
                fn2(obj);
            });
        }
        function  fn2(obj){
            obj.one('click',function(){
                handler1();
                fn1(obj);
            });
        }
    
    }
    
    //使用方式和之前一样。
    $('#btn').toggleEx(function(){
        console.log('11');
    }, function(){
        console.log('22');
    2019-07-17 19:21:43
    赞同 展开评论 打赏
问答分类:
问答地址:
问答排行榜
最热
最新

相关课程

更多

相关电子书

更多
低代码开发师(初级)实战教程 立即下载
冬季实战营第三期:MySQL数据库进阶实战 立即下载
阿里巴巴DevOps 最佳实践手册 立即下载