0

这与这个问题略有相关 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>

有任何想法吗?

4

2 回答 2

2

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

$(window).load(function () {
    var totalWidth = 0;

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

    $element.width(totalWidth);
});

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

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

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

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

于 2012-10-15T11:05:56.450 回答
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
于 2012-10-15T11:10:39.570 回答