Javascript 在动画之前存储宽度值会记录动画之后的值

Javascript 在动画之前存储宽度值会记录动画之后的值,javascript,jquery,Javascript,Jquery,时间有点晚了,如果我犯了一个愚蠢的错误,请原谅。出于某种原因,以下代码: $(".myClass").each(function(){ widths[$(this).attr("id")] = $(this).width(); if ($(this).attr("id") != $(clickedExpand).attr("id")) { $(this).animate({ width: '10px' });

时间有点晚了,如果我犯了一个愚蠢的错误,请原谅。出于某种原因,以下代码:

$(".myClass").each(function(){
    widths[$(this).attr("id")] = $(this).width();   
    if ($(this).attr("id")  != $(clickedExpand).attr("id"))
    {
        $(this).animate({
            width: '10px'
        });
    }

});
数组初始化为

var widths = new Array();
在代码前面。出于某种原因,尽管我在动画开始之前记录宽度,但我在数组中获得动画后的值。似乎动画结束,然后记录值。我试着把它从函数中取出来,然后用另一个函数来包装它。每一个函数都是这样,但是我得到的结果是一样的

任何帮助都将不胜感激

完整代码:

var slateWidths = {};
$(".slateExpand").click(function(){
    var clickedExpand = $(this).closest(".slate");

    $(".slate").each(function(){
        slateWidths[$(this).attr("id")] = $(this).outerWidth();   
        if ($(this).attr("id")  != $(clickedExpand).attr("id"))
        {
            $(this).animate({
                width: '10px'
            });
            $(this).find($('.slateExpand')).hide();
        }

    });

    $(this).text("Restore");
    $(this).removeClass("slateExpand").addClass("slateRestore");
    $(".slateRestore").on("click",function(){

        $(".slate").each(function()
        {
            alert(slateWidths[$(this).attr("id")]);
            //var width = slateWidths[$(this).attr("id")];
            $(this).animate({
                width: slateWidths[$(this).attr("id")]
                });
        });
    });
});

好的,如果你遇到类似的问题,有一个简单的解决方案。问题是,尽管类发生了更改,但click并没有从div中解除事件的绑定。因此,它首先重新运行记录宽度的代码。这会导致动画无法播放,因为现在以前的宽度与当前宽度相同。要解决这个问题,只需添加

   $("theDiv").unbind("click);

删除事件处理程序。这将防止触发上一个类的单击事件。

好的,如果遇到类似问题,有一个简单的解决方案。问题是,尽管类发生了更改,但click并没有从div中解除事件的绑定。因此,它首先重新运行记录宽度的代码。这会导致动画无法播放,因为现在以前的宽度与当前宽度相同。要解决这个问题,只需添加

   $("theDiv").unbind("click);

删除事件处理程序。这将防止触发上一个类的单击事件。

永远不要使用
new Array()
,并且在实际需要对象时不要使用数组。(
var-widths={};
)有趣的。。。怎么会?此外,不幸的是,问题仍然存在:(什么时候得到错误的值?直接从
width()获得)
方法,还是您在其他地方设置/获取它们?向我们展示整个代码我已经发布了整个代码。当我尝试反转宽度动画时,我获得了新的、发布动画的值,因此什么也没有发生。似乎对我有效:永远不要使用
新数组()
,并且在实际需要对象时不要使用数组。(
var-widths={};
)有趣…为什么会这样?不幸的是,问题仍然存在:(什么时候得到错误的值?直接从
width()得到)
method,还是您在其他地方设置/获取它们?向我们展示整个代码我发布了整个代码。当我尝试反转宽度动画时,我获得了新的、后期动画值,因此什么也没有发生。似乎对我有用:这是一个很好的解决方案,但我需要在单击时保存它,因为初始宽度不是恒定的,而是可变的可能会根据您对板岩所做的操作而发生变化。但是,我找到了解决方案,您只需解除事件的绑定()。非常感谢您花时间解决此问题。如果您愿意,您可以放弃解决方案,我会给您检查:)换句话说,即使类发生了更改,单击绑定仍然应用于div,因此您需要在单击时将其删除。正如您所看到的,我没有处理
slateExpand
class anywhere:)无论如何,我很高兴你解决了你的问题这是一个伟大的解决方案,但我需要它保存在点击,因为初始宽度不是恒定的,但可能会改变,取决于你对板岩做什么。然而,我发现了解决方案,你只需解除绑定()事件。我非常感谢你花时间解决这个问题。如果你愿意,你可以放弃解决方案,我会给你检查:)换句话说,即使类发生了更改,单击绑定仍然应用于div,因此您需要在单击时将其删除。正如您所看到的,我没有在任何地方对
slateExpand
class:)不管怎样,我很高兴您解决了您的问题