window 在 2 个断点之间调整大小后,现在使用的幻灯片 innerWidth() 取自我调整大小的断点,而不是进入

After window resize between 2 breaking points the slide innerWidth() being now used is taken from the breaking point I was resizing from, not into

为什么 window 在 2 个断点之间调整大小后,现在使用的幻灯片 innerWidth() 取自我正在调整大小的断点 来自,不是进入?

更准确地说:

https://jsfiddle.net/ecm3d30z/1/

  1. 比如我在断点1(800px以上)

  2. 我window从断点1调整到断点2(800px以下)。

  3. 现在我在断点2(800px以下)

  4. 然后我点击next/prev按钮

  5. 动画使用断点 1 的 oneslidewidth 的宽度,而它应该使用断点 2 的 oneslidewidth 的宽度。

    app = {
    
    hubert:function() {
    
          var num = $(".testimonial").length;
          var oneslidewidth = $(".testimonial").innerWidth();
          var oneslideheight = $(".testimonial").innerHeight();
          var fullsliderwidth = num * oneslidewidth;        
          var active = false;
    
    
    
        $("section").css({
          width: oneslidewidth,
          height: oneslideheight
        });
    
      $(".calosc").css({
        width: fullsliderwidth
      }); 
    
    
    
      function changehook(direction) {
        var slide = parseInt($(".calosc").data("slide") );
        if (direction == "next") {
            slide++
          $(".calosc").data("slide", slide);
        } else if (direction == "prev") {
            slide--
          $(".calosc").data("slide", slide);
        }
        }
    
    
    
        $('.next').click(function(e) {
        e.preventDefault();
          if(active || parseInt($(".calosc").data("slide")) + 1 > num) {
            return;
          }
        changehook("next");
        active = true;
        $(".calosc").animate({'left' : $(".calosc").position().left-oneslidewidth},500, function() {
                    {active = false;} });
                });
    
    
      $(".prev").on("click",function(e) {
            e.preventDefault();
          if(active || parseInt($(".calosc").data("slide")) - 1 < 1 ) {
            return;
          }
        changehook("prev");
         active = true;
        $(".calosc").animate({'left': $(".calosc").position().left+oneslidewidth},500, function() {
                { active = false; } });
        });
    }
    }
    

不善于解释,但基本上:An example of variable shadowing in javascript

乍一看,它应该有效,作用域似乎是正确的等等。我不知道 jQuery 背后是如何做到的:$(".prev").on("click",function(e) {,它是否设置了函数和覆盖听众?或添加一个新的听众?或者什么都不做,已经有一套了。

所以不管怎样,解决它的一种方法是 "re-define" 你的 oneslidewidth 在你的点击函数中,像这样:

$('.next').click(function(e) {
  // Here \/
  var oneslidewidth = $(".testimonial").innerWidth();
  e.preventDefault();
  if(active || parseInt($(".calosc").data("slide")) + 1 > num) {
    return;
  }
  changehook("next");
  active = true;
  $(".calosc").animate({'left' : $(".calosc").position().left-oneslidewidth},500, function() {
    {active = false;}
  });
});

另一种方法是将您的 "data" 包装到一个对象中,或者使它们成为全局对象。这是将变量放入对象的更新版本。

https://jsfiddle.net/ecm3d30z/2/

顺便说一句..还有另一个错误:更改为 2+ 页并调整大小..它只是中断..但是如果您将其更改回第 1 页并调整大小..一切都会再次正常 ¯\_(ツ)_/¯