2017-07-25 51 views
0

我试图通过每个使用each()功能caption-elementcaption格迭代,得到captionincaptionoutdelayout属性,接下来在captionout属性给出该元素的removeClass(不检查该类是否已经添加或不)和addClasscaptionin属性中给出的元素。这很容易,而且完美。如何将当前迭代的元素(this)传递给.each()函数中的setTimeout?

接着我试图扭转添加和删除从captionincaptionout属性采取类,但这次是通过在delayout属性给定时间量来延迟它(通过使用setTimeout()功能)的全过程。它不起作用。

整个IDE是给每个迭代元素自己的setTimeout延迟取自delayout属性。

每帮助一个完整的新秀大加赞赏:)

HTML:

<div class="caption"> 
    <div id="1" class="caption-container"> 
      <h1 class="caption-element animated" captionin="fadeInUp" captionout="bounceOut" delayout="2000">Caption 1</h1> 
    </div> 
    <div id="2" class="caption-container"> 
      <h1 class="caption-element animated" captionin="swing" captionout="fadeOutDown" delayout="4000">Caption 2</h1> 
      <h1 class="caption-element animated" captionin="bounceInUp" captionout="lightSpeedOut" delayout="3000">Caption 2</h1> 
    </div> 
    <div id="3" class="caption-container"> 
      <h1 class="caption-element animated" captionin="bounceInUp" captionout="rotateOutUpLeft" delayout="2500">Caption 3</h1> 
    </div> 
</div> 

jQuery的

jQuery('.caption .caption-element').each(function() { 
     var captionin = jQuery(this).attr('captionin'); 
     var captionout = jQuery(this).attr('captionout'); 
     var delayout = jQuery(this).attr('delayout'); 
     jQuery(this).removeClass(captionout).addClass(captionin); 
     setTimeout(function() { 
       jQuery(this).removeClass(captionin).addClass(captionout); 
     }, delayout, captionin, captionout); 
}); 

PS,问评论问题downvoting前请,谢谢:)

+0

也许你能解释一下什么这段代码呢?什么是目标,你想做什么=>作为一种功能。 – MJoraid

+0

@Joraid我试图遍历'caption'DIV中的每个'caption-element',得到它的captionin,captionout和delayout属性,然后使用'captionin'删除并添加当前迭代元素的类'和'captionout',然后进行相反的过程,在'delayout'中给出的延迟之后移除和添加类。希望能帮助到你。谢谢。 – Daniel

+0

我的意思是,你为什么这样做?设计视角。 – MJoraid

回答

1

两个问题。

1-范围。 this是不一样的this在不同的功能。 More about this。我通过捕获变量中的JQuery(this)并在代码中使用它来解决此问题。因此,当我想从代码中的其他地方访问所选元素$elem时,这不会让我感到意外。

2-我假设setTimeout需要一个数字作为时间单位的值。你正在传递一个字符串。

jQuery('.caption .caption-element').each(function() { 
 
    var $elem = jQuery(this); 
 

 

 
    var captionin = $elem.attr('captionin'); 
 
    var captionout = $elem.attr('captionout'); 
 
    var delayout = $elem.attr('delayout'); 
 

 
    console.log("Before: " + $elem.attr("class")); 
 
    $elem.removeClass(captionout).addClass(captionin); 
 

 
    setTimeout(function(captionin, captionout) { 
 

 
    $elem.removeClass(captionin).addClass(captionout); 
 
    console.log("After:" + $elem.attr("class")); 
 

 
    }, Number(delayout), captionin, captionout); 
 
});
<script src="https://code.jquery.com/jquery-2.0.3.js"></script> 
 
<div class="caption"> 
 
    <div id="1" class="caption-container"> 
 
    <h1 class="caption-element animated" captionin="fadeInUp" captionout="bounceOut" delayout="2000">Caption 1</h1> 
 
    </div> 
 
    <div id="2" class="caption-container"> 
 
    <h1 class="caption-element animated" captionin="swing" captionout="fadeOutDown" delayout="4000">Caption 2</h1> 
 
    <h1 class="caption-element animated" captionin="bounceInUp" captionout="lightSpeedOut" delayout="3000">Caption 2</h1> 
 
    </div> 
 
    <div id="3" class="caption-container"> 
 
    <h1 class="caption-element animated" captionin="bounceInUp" captionout="rotateOutUpLeft" delayout="2500">Caption 3</h1> 
 
    </div> 
 
</div>

结果:

Before: caption-element animated 
Before: caption-element animated 
Before: caption-element animated 
Before: caption-element animated 
After:caption-element animated bounceOut 
After:caption-element animated rotateOutUpLeft 
After:caption-element animated lightSpeedOut 
After:caption-element animated fadeOutDown 
+0

是的,其实我在发布这个答案之前自己开发了它,唯一的区别是我添加了'var $ this = this',然后在setTimeout中传递了'jQuery($ this)...',但效果是一样的。并且将'delayout'as传递给setTimeout的工作不需要类型玩杂耍。我明显接受你的答案。非常感谢你的努力!最好的祝福。 – Daniel

+0

因此,解决方案同时落在我们身上。有时你需要大声说出来才能看到它。并总是console.log出东西,看看发生了什么。 祝你好运。 – MJoraid

相关问题