【问题标题】:Fire function after each() has completedeach() 完成后触发函数
【发布时间】:2012-10-05 08:17:48
【问题描述】:

这与这个问题略有相关 Invoking a jQuery function after .each() has completed

但该解决方案似乎对我不起作用。

基本上我有一段 JavaScript 可以计算某些元素的宽度:

var totalWidth = 0;
$element.find('li').each(function () {
    totalWidth += $(this).width();
});

在此之后我想使用宽度来设置另一个元素:

$element.width(totalWidth);

如果我附加调试器,它可以工作,但如果我只是运行它,它不会。这让我觉得宽度是在 .each() 完成之前设置的。

我尝试使用.promise() 来解决此问题,但似乎没有什么不同。

var totalWidth = 0;
$element.find('li').each(function () {
    totalWidth += $(this).width();
});

$element.promise().done(function () {
    $element.width(totalWidth);
});

这是我的 HTML

<div class="carousel">
        <ul>
            <li>
                <img src="/Images/Travel2New/Adverts/advertHolder_1.png" />
            </li>
            <li>
                <img src="/Images/Travel2New/Adverts/advertHolder_2.png" />
            </li>
            <li>
                <img src="/Images/Travel2New/Adverts/advertHolder_3.png" />
            </li>
            <li>
                <img src="/Images/Travel2New/Adverts/advertHolder_4.png" />
            </li>
            <li>
                <img src="/Images/Travel2New/Adverts/advertHolder_5.png" />
            </li>
        </ul>
    </div>

有什么想法吗?

【问题讨论】:

    标签: jquery


    【解决方案1】:

    由于您的宽度计算应该等到加载图形后,您可以尝试以下操作:

    $(window).load(function () {
        var totalWidth = 0;
    
        $element.find('li').each(function () {
            totalWidth += $(this).width();
        });
    
        $element.width(totalWidth);
    });
    

    load()事件示例描述我们可以看到:

    当页面完全加载(包括图形)时运行一个函数。

    $(window).load(function () {
        // run code
    });
    

    请注意,目前load() 事件似乎是deprecated,因此您应该考虑您利用的 jQuery 版本。

    【讨论】:

    【解决方案2】:

    这是.each的已知问题

    你可以这样做

        var totalWidth = 0;
    
        var $elems = $element.find('li');
    
        (function fetch(i) {
            if(i >= $elems.length) return;  // no elems left
    
            var $elem = $elems.eq(i);
            totalWidth += $($elem).width(); 
            if(i+1==$elems.length) 
            {
             $element.width(totalWidth);
            }
            else
            {
             fetch(i + 1);  // next one
            }           
        })(0);  // start with first elem
    

    【讨论】:

      猜你喜欢
      • 2013-09-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-09-05
      • 2021-03-09
      • 1970-01-01
      相关资源
      最近更新 更多