如何避免jQuery on()方法绑定两次?

时间:2016-08-04 04:19:43

标签: jquery events bind

我希望在加载某些数据后触发窗口调整大小的自定义作业:

function doJob() { 
    ... 
}

DataLoaded() {
   $(window).on("resize", function() { doJob(); });
}

但是DataLoaded可以多次出现,我怎样才能确保doJob()只绑定一次?

  

请注意,绑定一次,但可以执行多次,所以$(“...”)。one(“...”)不是我的目标

IMO:

  
      
  1. 设置全局变量isBind以检查方法是否为bind,这看起来是多余的
  2.   
  3. $(window).off(“resize”)。on(“resize”,....),我不确定是否先调用off()是安全的方式
  4.   

3 个答案:

答案 0 :(得分:2)

您可以像这样设置一个标志变量:

var didJob = false;
DataLoaded() {
   $(window).on("resize", function() { 
     if(!didJob){
      doJob();
      didJob = true;
     }
   });
}

但是我不确定你是如何多次调用DataLoaded函数的,因为在这个函数中你也在检查窗口大小调整。所以,它不应该被多次调用。可能你想这样:

$(window).off("resize.DataLoaded").on("resize.DataLoaded", function() {
     doJob(); 
});

在上面的示例中,您会看到resize.DataLoadedDataLoadedevent namespace。首先,您将解析resize事件与DataLoaded命名空间,然后将resize事件与DataLoaded命名空间绑定,以便它不会影响任何其他resize事件。

答案 1 :(得分:1)

每次绑定时都可以取消绑定此类事件

$(window).unbind("resize");
$(window).bind("resize", function() { doJob(); });

答案 2 :(得分:0)

我认为,你应该这样做,声明一个变量并在doJob()函数之后递增它,然后检查它。

   function doJob() { 
        ... 
   }

   var once = 0;
   DataLoaded() {
    $(window).on("resize", function() { 
        if(once == 0){
          doJob();
          once++;
        }
    });
   }

希望这有帮助。