【问题标题】:Jquery: enable / disable a function? (bind / unbind?) best way to do this?Jquery:启用/禁用功能? (绑定/解除绑定?)最好的方法是什么?
【发布时间】:2010-11-22 09:12:38
【问题描述】:

我有一个函数stickyhead(),它基本上将h2固定在页面顶部,当你向下滚动页面时,h2中的文本会随着你到达新的h2而改变,所以它就像电话簿/联系人iphone 或 android 手机。当您滚动浏览名称以 A 开头的联系人时,带有字母 A 的标题将粘在顶部,然后当您到达 B 名称时,它将页面顶部标题中的文本更改为 B。当.switch 标签选择了类时,我想启用/禁用它。下面的代码工作得很好,但我想知道这是否是一种不好的方法?我是否多次重新加载我的功能?有没有更好的方法?

$('.switch').click(function() {
 if ($('.switch label').hasClass('selected')) { 
   stickyhead(); 
 } else {
   $(window).unbind('scroll'); 
 }
});

【问题讨论】:

    标签: jquery function unbind


    【解决方案1】:
    //Assuming I've understood the scenario correctly, wouldn't this work.
    $('.switch').delegate("label.selected", "click", function() {
        if (stickyheadActive){
            //do your stuff here
        }
        else{
           return;
        }
    });
    

    但请记住,在可预见的不需要时不取消绑定处理程序是浪费内存。 绑定/解除绑定是丑陋的,但在资源稀缺时是合理的。

    此外,当元素被移除并且处理程序保持绑定时...... Viola!内存泄漏的完美案例。可能看起来无关紧要,但我觉得我应该提一下,以防万一您正在为移动平台编写此内容。

    【讨论】:

      【解决方案2】:

      我很难将您的代码可视化,但您不太可能需要不断地绑定和解除绑定。您的滚动处理程序中应该有一个布尔值,它有条件地运行处理程序中的代码:

      var doStickyHead = true;
      $(window).scroll(function(){
          if (doStickyHead) {
              // do your code
          }
      });
      $('.switch').click(function(){
          doStickyHead = !doStickyHead; // invert the value of doStickyHead
      });
      

      【讨论】:

        【解决方案3】:

        保持函数绑定可能更有效,但使用状态变量来确定stickyhead() 是否实际执行任何操作。

        例如

        function stickyhead(){
            if (!stickyheadActive) return;   //Guard clause to prevent action
        
            //...Your current code...//
        }
        

        然后,不要取消绑定函数,只需使用stickyheadActive=false;

        【讨论】:

        • 哎呀。曾说过要使用stickyhead=false;,但当然应该是stickyheadActive=false。已更正。
        猜你喜欢
        • 1970-01-01
        • 2019-10-23
        • 2022-10-12
        • 1970-01-01
        • 2010-09-09
        • 2011-11-22
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多