【问题标题】:JS/jQuery : Re-using a function, preventing multiple function callsJS/jQuery : 重用一个函数,防止多个函数调用
【发布时间】:2013-06-14 22:51:18
【问题描述】:

请原谅我的无知,我最近才开始写javascript。我不是在寻找开箱即用的解决方案,而是更多有助于我自己编写代码的洞察力。

我正在开发一个全屏、滑动面板类型的网站,可以选择使用箭头键或可点击链接进行导航。

在使用箭头键导航时,我的所有功能都运行良好,而我想做的是在使用屏幕导航链接时调用相同的功能。我不知道该怎么做,因为函数和变量是在键绑定函数中声明的。

我的第二个问题是我需要一种方法来防止在函数仍在动画时多次调用幻灯片函数。我尝试了各种 setTimeout 实现,以及 Ben Alman 的 doTimeout 和 debounce,但似乎无法使其正常工作。

任何帮助将不胜感激!

这是一个 jsFiddle,其中包含我构建的单工版本:http://jsfiddle.net/BKpAK/3/

如果你不想摆弄,这里只是 JS:

$(document).ready(function () {         

var currentSlide = 1;

$(document).keydown(function(e){

    nextSlide = currentSlide + 1;
    prevSlide = currentSlide - 1;

    lastSlide = $(".slide").length

    cur1 = document.getElementById("slide" + currentSlide);
    prev1 = document.getElementById("slide" + prevSlide);
    next1 = document.getElementById("slide" + nextSlide);

    function moveRight(){
      if(currentSlide < lastSlide){
        $(next1).addClass('frontAndCenter').stop().animate({
          left: "0",
        }, 500, function() {
          $(this).removeClass("frontAndCenter");
          $(cur1).css("left", "-100%");
        });
        currentSlide = currentSlide + 1;
      }
      else{
          return false;
      };
    };

    function moveLeft(){
      if(currentSlide > 1){
          $(prev1).addClass('frontAndCenter').stop().animate({
            left: "0",
          }, 500, function() {
            $(this).removeClass("frontAndCenter");
            $(cur1).css("left", "100%");
          });
          currentSlide = currentSlide - 1
      }
      else{
          return false;
      };
    };

    switch(e.which) {
        case 37: // left
            moveLeft();
        break;

        case 39: // right
            moveRight();
        break;

        default: return;
    }
    e.preventDefault();
});

$("#arrowRight").click(function () {
    moveRight();        
});

$("#arrowLeft").click(function () {
    moveLeft();
});

});

【问题讨论】:

    标签: javascript jquery function sliding debouncing


    【解决方案1】:

    至于你的第一个问题,你是对的。您希望使事件处理程序保持简单。您需要将逻辑移到事件处理程序之外:

    $(document).ready(function () {
       //I would recommend putting the logic in here to avoid creating global variables/functions.
    
       var currentSlide = 1;
    
       function moveLeft() { /*...reworked logic...*/ }
       function moveRight() { /*...reworked logic...*/ }
    
        $(document).keydown(function(e){
            switch(e.which) {
                case 37: // left
                    moveLeft();
                break;
    
                case 39: // right
                    moveRight();
                break;
    
                default: return;
            }
            e.preventDefault(); //*You should only really prevent default if you use the key event
        });
    
        $("#arrowRight").click(function () {
            moveRight();
    
        });
    
        $("#arrowLeft").click(function () {
            moveLeft();
        });
    });
    

    我的第二个问题是我需要一种方法来防止滑动功能 在函数仍然存在时被多次调用 动画。

    至于你的第二个问题,我建议你阅读jquery queues。您可以创建自己的队列来控制来回移动幻灯片(提供除 fx 以外的任何内容的 queueName)。一旦当前队列中的内容完成,您添加队列的任何左/右步骤都将激活。如果您不想串起多个左/右操作,您可以取消该队列,而不会杀死所有其他可能正在运行的效果。

    【讨论】:

    • 谢谢-该链接肯定会帮助我理解。
    【解决方案2】:

    在键绑定之外声明你的函数,比如

    var myFunction = function(e) {
      bla bla bla;
    }
    

    然后从你的 keydown 函数调用这个外部函数

    (document).keydown(function(e){
        myFunction(e);
    }
    

    或从任何你想要的地方调用它。

    【讨论】:

    • +1。此外,对于您的第二个问题,只需声明一个全局布尔值(例如,在文档就绪函数的开头)“is_sliding”初始化为 false。然后每次要调用该函数时,请先测试是否不是“is_sliding”。如果不是,则将“is_sliding”设置为 true,并使用“完成”回调作为 function(){is_sliding = false;} 调用 $.animate() 方法。有关此回调,请参阅动画官方文档。
    • 对于变量,请在 keyevent 绑定之外创建函数,以便您获取它们。
    • 太棒了!感谢 Ricola 的这个想法,很有意义:) Guillherme - 如果我将所有变量都设为全局变量,那么整个事情都会中断,由于某种原因我无法理解......我还能从函数外部调用非全局变量吗?我要搬家吗?
    • 我尝试从不使用全局变量,而是尝试使用一个全局对象来设置我的所有变量,例如:var myApp = { version: 1.002, name: 'myTestApp', relation: 'parent ' } 对于函数,您可以添加一个全局方法,或者只使用您的值作为参数从一个函数传递到另一个函数。
    • 我也尽量远离全局变量/函数。文档就绪函数提供了一个新范围,您的应用可以将其视为全局范围。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-07-13
    • 2013-12-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多