【问题标题】:jQuery.each and setTimeout don't play together well (possibly)?jQuery.each 和 setTimeout 不能很好地配合(可能)?
【发布时间】:2018-07-31 08:30:53
【问题描述】:

所以,我阅读了很多关于这个问题的信息。我在网上找不到任何东西来解决我的问题。下面是一段代码:

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,(其中一个相关元素将延迟删除类),但是不会发生延迟移除。

如何解决?

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

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

【问题讨论】:

  • 也许显示一些渲染的标记?

标签: jquery settimeout each


【解决方案1】:

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

解决方案是使用var,如var elemInputLabel =。现在,each 方法的每个回调都有单独的变量。确保声明所有变量,以便它们在其函数中是本地的。

【讨论】:

  • 我也正要发布关于此的内容。
  • 好吧,真的这么简单吗?将变量范围从全局更改为局部?是的,它有效!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-09-28
  • 1970-01-01
  • 2016-12-26
  • 1970-01-01
相关资源
最近更新 更多