2013-02-07 22 views
0

我已经编写了一个Javascript for-loop来自动隐藏和显示点击我网站上的一些内容,但由于某些原因,变量的取值最高循环结束......JS for循环中的变量取最大值

所以

for (var i = 1; i <= 5; i++) { 
    $('.views-row-' + i + ' .faq_answer').hide(); 
    $('.views-row-' + i + ' .faq_more').click(function() { 
     $('.views-row-' + i + ' .faq_answer').slideToggle(); 
    }); 
} 

所有.views-row .faq_answer元素隐藏,他们应该和所有.views-row .faq_more有一个clickHandler事件。
但由于某些原因,slideToggle线只适用于与views-row-6类线(其中不存在)...

所以在功能上的i-变量不环路的所有值适用。 ..
我该如何使它适用于所有view-row-x的?

+2

一种JavaScript的关闭搜索的另一种方式将帮助您更好地了解您的问题。 – Briguy37

回答

3

你应该在点击回调中用$(this)引用你的元素。在这里,我将等于我的最后一个值。

$('.views-row-'+ i + ' .faq_more').click(function(){ 
     $(this).slideToggle(); 
    }); 
+1

伟大的建议!但是,然后'.faq_more'元素被切换... – Michiel

+0

对不起,我没有看到,但你可以很容易地用jQuery得到他的父母或他的一个兄弟姐妹(我不知道确切的层次结构)。 – Mickael

+0

@Michiel试试我的建议 –

1

我认为你错误地接近了这个问题。在循环中绑定大量事件处理程序并不是一个好主意。你好得多做这样的事情:

$('.faq_answer').hide(); 

$('.faq_more').click(function(){ 
    $(this).parent().find('.faq_answer').slideToggle(); 
}); 

我假设你的HTML是这样的:

<div class="views-row-1"> 
    <a href="#" class="faq_more"></a> 
    <div class="faq_answer"></div> 
</div> 
1

在Javascript中,变量的函数级范围。解释器会将每个变量定义移动到函数顶部(提升),以便引用此范围内随处可用的变量。因此,内部函数可以从外部函数(闭包)访问变量。对于习惯于块级作用域的每个人来说,一个问题是,这种机制包括将循环计数器绑定到内部函数,这是内部函数的寿命较长,然后是外部函数的一个例子。

在你的情况,因此,当回调被调用时,选择将得到参考用的6的价值,即它是在结合结合至i不是i值的循环计数器i时间。

所以你只需要通过外部函数的变量的内部函数的值,而不是通过一个参考:

$('.views-row-'+ i + ' .faq_more').click(
    // pass value of i into the handler, not i itself 
    function(i){ 
     // return the result of invoking the handler 
     // so that we can apply the current value of i to this result 
     // and bind the whole closure as a handler to the click event 
     return function(e) { 
      $('.views-row-'+ i + ' .faq_answer').slideToggle(); 
     } 
    }(i) 

);

0

取而代之的变量i它可能是最好找到匹配的元素

for (var i = 1 ; i <= 5; i++) { 

    // faq_more elements have id 'more' + i 
    // faq_more elements contain class faq_more 
    // faq_answer elements have id 'answer' + i 
    // faq_answer elements contain class faq_answer 

    $(".faq_more").hide(); 

    $(".faq_more").click(function(){ 

     var id = $(this).attr("id").replace("more", "answer"); 
     $("#" + id).slideToggle(); 

    }); 
}