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 );
}
}
});
});
过程:
- 我单击输入,添加了与该输入相关的两个元素
.focused
classes。其中一个 classes 被延迟添加。
- 函数的第二部分遍历页面上的每个输入,除了
点击的那个,检查它的元素是否得到 class
.focused
。当没有 class 发现它不执行任何东西。
- 我在同一页面上单击另一个输入,它通过点 1。一切正常。与任何其他输入(单击的输入除外)相关的每两个元素(
label
和 .label
)应该删除它们的 class .focused
,(其中一个相关class 延迟删除的元素),但不会延迟删除。
如何整理?
PS,希望我把一切都说清楚。如果没有请问一个问题。代码中还有小输入值检查。与问题无关,请忽略。
PS2,当我从第二个函数中删除超时时,与输入相关的两个元素都已删除 classes。
问题是你没有声明你的变量,所以它们是全局的。例如,取 elemInputLabel
。 each
循环将该变量设置为它的最后一个值,然后 1 秒后所有计时器触发它们的回调,all 引用相同的变量,该变量具有相同的值.
解决方案是像 var elemInputLabel =
一样使用 var
。现在,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 );
}
}
});
});
过程:
- 我单击输入,添加了与该输入相关的两个元素
.focused
classes。其中一个 classes 被延迟添加。 - 函数的第二部分遍历页面上的每个输入,除了
点击的那个,检查它的元素是否得到 class
.focused
。当没有 class 发现它不执行任何东西。 - 我在同一页面上单击另一个输入,它通过点 1。一切正常。与任何其他输入(单击的输入除外)相关的每两个元素(
label
和.label
)应该删除它们的 class.focused
,(其中一个相关class 延迟删除的元素),但不会延迟删除。
如何整理?
PS,希望我把一切都说清楚。如果没有请问一个问题。代码中还有小输入值检查。与问题无关,请忽略。
PS2,当我从第二个函数中删除超时时,与输入相关的两个元素都已删除 classes。
问题是你没有声明你的变量,所以它们是全局的。例如,取 elemInputLabel
。 each
循环将该变量设置为它的最后一个值,然后 1 秒后所有计时器触发它们的回调,all 引用相同的变量,该变量具有相同的值.
解决方案是像 var elemInputLabel =
一样使用 var
。现在,each
方法的每个回调都有单独的变量。确保声明所有变量,使它们在函数中是局部的。