【问题标题】:jQuery iterating over a functionjQuery迭代一个函数
【发布时间】:2010-01-30 05:05:57
【问题描述】:

jquery 很新,我写的函数有点问题,与this 问题非常相似,如果还有什么要继续的话,那么显然我有一个闭包问题。 正如 Peter Bailey 在上述线程中所说,这就是正在发生的事情:

  1. 迭代一些值
  2. 在使用迭代变量的迭代中定义/分配一个函数
  3. 您了解到每个函数仅使用上次迭代的值。
  4. WTF?

这是我的代码:

var pages=['home', 'about', 'events', 'info', 'qa', 'photos', 'contact'];

for (i in pages) {

    $link='"'+"[href$='gaction.php?page="+(pages[i])+"']"+'"';
    $source="/images/"+(pages[i])+".png";

    $($link).hoverIntent(function() {
        $('#logo_text').stop(true, true).fadeOut(
        0,
        function() {
            $('#logo_text').attr('src', $source).fadeIn('slow'); // swaps logo
        });
    }, function() {
        $('#logo_text').stop(true, true).pause(300).fadeOut(
        0,
        function () {
            $('#logo_text').attr('src', '/images/name.png').fadeIn('slow'); //swaps back
        });
    });
}

我知道 $link 的定义很混乱,但这一点很管用。

该函数旨在根据悬停的链接将#logo_text 中的图片替换为一张图片,但到最后,每个链接都会将图片更改为“联系人”(最后一个)图片。

真的不明白如何从其他线程修复它,所以如果有人能帮忙,那就太好了!

【问题讨论】:

    标签: jquery function closures loops


    【解决方案1】:

    您可以只使用 jQuery.each 语句,并通过其结构创建一个闭包。然后,请务必使用var 声明变量,然后一切就绪:

    var pages=['home', 'about', 'events', 'info', 'qa', 'photos', 'contact'];
    
    $.each( pages, function(){
      var $link='"'+"[href$='gaction.php?page="+ this +"']"+'"';
      var $source="/images/"+ this +".png";
    
      ... rest of function untouched
    
    });
    

    有几种方法可以重写函数,但老实说,如果你的方法适合你(选择器),那么你就很好。只是,不要使用fadeOut(0, function ...),而是使用hide().attr('src', $source ).fadeIn('slow')

    【讨论】:

    • 你确定吗?在 hoverIntent 回调运行之前,您没有真正创建内部函数的问题吗?
    • 但是,我仍然有 pages(i) 而不是 this 所以感谢您让我重新阅读我的功能:)
    猜你喜欢
    • 1970-01-01
    • 2014-10-17
    • 2020-06-18
    • 2020-07-04
    • 1970-01-01
    • 2011-07-30
    • 1970-01-01
    • 2012-06-06
    • 2021-11-08
    相关资源
    最近更新 更多