【问题标题】:A question regarding jQuery hover(), setInterval scope, and The "this" Problem ---关于 jQuery hover()、setInterval 范围和“this”问题的问题 ---
【发布时间】:2021-02-27 04:34:39
【问题描述】:

更新 --- 来自某些性能:

$(".gallery-image").each(function() {
  let callInterval;
  $(this).hover(function(){
    clearInterval(callInterval);
  }, function(){
    callInterval = setInterval(intervalFunction.bind(this), 500);   
  });
});

这有助于解决范围问题;但现在我有一个跟进 -

positioni 处的每个图像都需要遍历一个单独的索引,index,它确定了位置 i 处图像的当前 src。每个图像的setInterval 循环的起始index 应该是它的position,然后是每个循环的index++。但是我被困在每个图像的 src index 只增加一的地方,然后为每个 setInterval 循环重复相同的值。我到底应该在哪里声明 index 以便它在每个图像的 setInterval 循环中是本地的,但在不重置其起始值的情况下递增......?

这太简单了,但我不能把它们全部放在一起。

------

在我开始之前——我已经花了几个小时来研究解决某些部分的 SO 问题,但我真的很难把它们放在一起,所以如果这是重复的几件事,请原谅我,哈.

我正在制作一个图片库页面,其中每个图片的占位符会快速循环浏览所有可能的图库图片,直到用户将鼠标悬停在该图片/占位符上,在该图片/占位符上(静态)显示“正确”的图片。然后当用户悬停时,该图像恢复其快速循环。每个图像占位符同时在来源之间循环,并且彼此独立。

我在需要 jQuery hover() 函数的悬停部分和悬停部分来引用相同的 setInterval ID 时遇到问题,但同时,setInterval 应该有一个本地范围,特定于每个悬停在图像元素上。我对 jQuery 也有些陌生,它和 js 之间的区别对我来说并不总是很清楚。

HTML:

<div class="gallery">
    <img class="gallery-image" src="image0.jpg">
    <img class="gallery-image" src="image1.jpg">
    <img class="gallery-image" src="image2.jpg">
    <img class="gallery-image" src="image3.jpg">
    <img class="gallery-image" src="image4.jpg">
</div>

js:

var images = document.getElementsByClassName('gallery-image');
var callInterval;
    
$(".gallery-image").hover(function(){
        clearInterval(callInterval);
    }, function(){
        callInterval = setInterval(intervalFunction.bind(this), 500);   
    })

function intervalFunction(){
    var position = $(this).index();     
    var index = position;
    if (index < 14) {
        $(this).attr("src", "image" + index + ".jpg");
        index++;                    
    } else {
        $(this).attr("src", "image" + index + ".jpg");
        index = 0;
    }
}

我尝试过 vanilla javascript 和 jQuery,以及两者的各种组合。我是否以错误的方式混合它们?我是否需要多个 hover() 函数,并以这种方式定义 setInterval 函数?我是否应该为画廊中的每张图片手动编写一个 hover() 并以这种方式将 setInterval 函数绑定到每张图片?

发个sn-p会不会更有帮助?

我觉得我一直盯着这个问题太久了,现在我只是在用自己的方式,答案一定就在我面前......我疯了哈.

【问题讨论】:

    标签: javascript jquery scope this setinterval


    【解决方案1】:

    我会用each 遍历每个元素,为每个元素创建一个新的本地范围,callInterval 可以在其中声明:

    $(".gallery-image").each(function() {
      let callInterval;
      $(this).hover(function(){
        clearInterval(callInterval);
      }, function(){
        callInterval = setInterval(intervalFunction.bind(this), 500);   
      });
    });
    

    【讨论】:

    • 啊,是的——我想我尝试过使用each 进行早期迭代,但一直在阅读各种文档和 SO 问题,认为它在 jQuery 中是多余的;但是您的解决方案并不是多余的,因为它增加了一层新的范围——我说对了吗?
    • 所以,这回答了我的主要问题,但现在我又陷入了遍历每个图像的索引以循环遍历其可能来源的麻烦。我不确定应该在哪里声明索引;我以为我可以在悬停函数中声明它,然后将它作为参数传递给intervalFunction,但这似乎不起作用
    • (1) 是的,完全正确。如果您需要每个范围,这不是多余的。 (2).each的第一个参数指的是索引。 .each(function(i)
    • 所以,$(".gallery-image").each(function(i)i指的是每个图片元素在图库div中的索引位置;但是每个图像i 然后需要遍历确定图像的 src 属性的整数index。每个图像的setInterval 循环的起始index 应该是它的位置,i 然后index++ 每个循环。但是现在每个图像的 src index 只增加 1,然后为每个 setInterval 循环重复相同的值。这有意义吗? (现在更新原来的问题)
    • 您可以将区间函数设为 HOF,将当前索引保存在闭包变量中:const makeIntervalFn = (index) =&gt; function() { /* do stuff that references and increments index 并执行 callInterval = makeIntervalFn($(this).index).bind(this))
    猜你喜欢
    • 2011-10-30
    • 1970-01-01
    • 2013-01-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多