合并javascript超时功能

时间:2016-05-27 06:13:45

标签: javascript jquery

对不起问题的基本级别,但js肯定不是我的专业领域。然而,这是Google难以回答的问题之一。

当窗口调整大小时,我基本上想要做一些事情。我有一些额外的代码也会停止两次调整大小事件。

问题在于我复制了一些代码,作为编码器,我知道错了。问题是我不知道该如何做对。这是我目前的重复代码:

事件绑定

    $(window).on("resize", resizeText);
    $(window).on("resize", resizeIndicator);

功能

function resizeIndicator() {
    clearTimeout(id);
    id = setTimeout(updateIndicator, 200);
}

function resizeText() {
    clearTimeout(id);
    id = setTimeout(updateText, 200);
}

这些不重复,但为了完整性而包括在内:

function updateIndicator() {
    $tab = $(".tabs li.focus");

    if ($tab.length) {
        toggleIndicator($tab, true);
    }
}

function updateText() {
    $tabs = $(".tabs li:not(.indicator) a");

    $tabs.each(function () {
        $(this).toggleClass("two-line", this.scrollWidth > $(this).outerWidth());
    });
}

2 个答案:

答案 0 :(得分:3)

所以你想避免代码重复?没问题,使用更高阶的函数来创建新函数。



function createResizeCallback(resizeFunc) {
  var id;
  
  return function () {
    clearTimeout(id);
    id = setTimeout(resizeFunc, 200);
  }
}


$(window).on("resize", createResizeCallback(updateText));
$(window).on("resize", createResizeCallback(updateIndicator));


function updateIndicator() {
    console.log('updateIndicator');
}

function updateText() {
    console.log('updateText');
}

<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
&#13;
&#13;
&#13;

答案 1 :(得分:1)

全局声明您的超时ID并使用单个处理程序。

工作演示:http://jsbin.com/nugutujoli/1/edit?js,console,output

$(window).on("resize", resizeEvent);

var timeout;
function resizeEvent() {
    clearTimeout(timeout);
    timeout = setTimeout(function(){
      updateIndicator();
      updateText();
    }, 200);
}


function updateIndicator() {
   console.log("update indicator fired.");
}

function updateText() {
    console.log("update text fired.");
}