jQuery.each 和 setTimeout 不能一起玩(可能)?

jQuery.each and setTimeout don't play together well (possibly)?

所以,我读了很多关于这个问题的资料。我在网上找不到任何东西可以解决我的问题。这是一些代码:

jQuery( 'input:not([type=submit]):not([type=hidden]), textarea' ).on( 'click', function() {

    $this = jQuery( this );
    parentWrap = $this.parents( 'label' );
    inputLabel = parentWrap.find( '.label' );
    otherInput = jQuery( 'input:not([type=submit]):not([type=hidden]), textarea' ).not( this );

    if ( ! parentWrap.is( '.focused' ) ) {
        parentWrap.addClass( 'focused' );
        setTimeout( function() {
            inputLabel.addClass( 'focused' );
        }, 1000 );
    }

    otherInput.each( function( index, elem ) {
        elem = jQuery( elem );
        elemVal = elem.val();
        elemParentWrap = elem.parents( 'label' );
        elemInputLabel = elemParentWrap.find( '.label' );
        if ( elemParentWrap.is( '.focused' ) ) {
            if ( 0 === jQuery.trim( elemVal ).length ) {
                elemParentWrap.removeClass( 'focused' );
                setTimeout( function() {
                    elemInputLabel.removeClass( 'focused' );
                }, 1000 );
            }
        }
    });
});

过程:

  1. 我单击输入,添加了与该输入相关的两个元素 .focused classes。其中一个 classes 被延迟添加。
  2. 函数的第二部分遍历页面上的每个输入,除了 点击的那个,检查它的元素是否得到 class .focused。当没有 class 发现它不执行任何东西。
  3. 我在同一页面上单击另一个输入,它通过点 1。一切正常。与任何其他输入(单击的输入除外)相关的每两个元素(label.label)应该删除它们的 class .focused,(其中一个相关class 延迟删除的元素),但不会延迟删除。

如何整理?

PS,希望我把一切都说清楚。如果没有请问一个问题。代码中还有小输入值检查。与问题无关,请忽略。

PS2,当我从第二个函数中删除超时时,与输入相关的两个元素都已删除 classes。

问题是你没有声明你的变量,所以它们是全局的。例如,取 elemInputLabeleach 循环将该变量设置为它的最后一个值,然后 1 秒后所有计时器触发它们的回调,all 引用相同的变量,该变量具有相同的值.

解决方案是像 var elemInputLabel = 一样使用 var。现在,each 方法的每个回调都有单独的变量。确保声明所有变量,使它们在函数中是局部的。