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

时间:2018-02-20 21:20:44

标签: jquery settimeout each

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

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个类。其中一个课程延迟添加。
  2. 该功能的第二部分遍历页面上的每个输入,除了 点击一个,检查它的元素是否有类.focused。当没有发现任何课程时,它不会执行任何操作。
  3. 我点击同一页面上的另一个输入,它通过点1.一切正常。与任何其他输入相关的每两个元素(label.label)(除了单击的一个)都应该删除它们的类.focused,(其中一个相关元素有类延迟删除),但不会发生延迟删除。
  4. 如何整理出来?

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

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

1 个答案:

答案 0 :(得分:2)

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

解决方案是使用var之类的var elemInputLabel =。现在,对于each方法的每个回调,您都有单独的变量。确保声明所有变量,使它们对于它们的函数是本地的。