嵌套Jquery代码中$(this)的(重新)定义

时间:2011-11-07 04:37:33

标签: jquery ruby-on-rails ruby-on-rails-3

这是一个关于$(this)的简单问题,以及如何在一大块代码中定义和重新定义它。

$('input').live('click', function() {
    $(this).addClass('active');
    if( question.find('.false').is(':visible') ){
      question.find('.false').hide("blind",{},350);  
    }
})

$(this)明确地表示第二行的输入。现在,当我们开始if语句时,我有一个新的兴趣点:question.find('.false')。如果$(this)未更改为新定义,是否有更简单的方式来引用question.find('.false')

为了清晰起见的后续行动

如果我想在更长版本的循环中多次引用question.find('.false'),那么引用它的最佳方法是什么?

  1. 在循环之前定义一个新变量:

    var qfalse = question.find('.false')
    if( qfalse...){...qfalse this, qfalse that...
    
  2. 还有别的吗?

2 个答案:

答案 0 :(得分:1)

我想你正在寻找类似下面的东西?

$('input').live('click', function()
{
    $(this).addClass('active');
    var $target = question.find('.false');

    if($target.is(':visible'))
    {
        $target.hide('blind', 350);  
    }
});

或者,如果你想真的想要,write a wee little jQuery plugin

(function ($)
{
    $.fn.hideIfVisible = function hideIfVisible()
    {
        if (this.is(':visible')) this.hide('blind', 350);
        return this;  
    };
}($));

$('input').live('click', function()
{
    $(this).addClass('active');
    question.find('.false').hideIfVisible();
});

N.B。 .live()自jQuery 1.7起已弃用。而是使用.on()

答案 1 :(得分:1)

this将保留其值,直到某些新上下文重新定义this(如.each()回调中)。它在你的功能中无处不在。

你可以做你想做的事情更简单一些。而不是使用if测试,只需要选择器可见,只对可​​见的选择器进行操作。

$('input').live('click', function() {
    $(this).addClass('active');
    question.find('.false:visible').hide("blind",{},350);
})

实际上,你可以在所有这些上调用hide,而.hide()方法会忽略已经隐藏的那些。

$('input').live('click', function() {
    $(this).addClass('active');
    question.find('.false').hide("blind",{},350);
})

如果要在函数的多个位置使用相同的jQuery选择器对象,并且不能将多个方法链接在一起,那么您只需使用局部变量将选择器分配给然后使用该变量: / p>

$('input').live('click', function() {
    $(this).addClass('active');
    var $falseQuestions = question.find('.false');
    // do whatever other operations you want on/with $falseQuestions here
    $falseQuestions.hide("blind",{},350);
})