Jquery:将变量传递给下一个链接函数,这是正确的方法吗?

时间:2011-06-20 15:13:42

标签: javascript jquery function variables

我想知道这是否正确。

$('.myfilter').focus(function(){
    var length = $(this).val().length; 
    if (length == 0) {
        dosomething
    }
}).blur(function(length){
    if (length == 0) {
        dowhatever
            }
})

上面我简化了我的代码,我只是检查焦点上的length == 0和输入的模糊。注意我如何声明length聚焦,但不是模糊,但我在.blur(function(length){内添加了变量名称。这是在length中访问.blur而无需在.blur中重新声明var length = $(this).val().length;的更好方法吗?

与此相反:

$('.myfilter').focus(function(){
    var length = $(this).val().length; 
    if (length == 0) {
        dosomething
    }
})

$('.myfilter').blur(function(length){
    var length = $(this).val().length;
    if (length == 0) {
        dowhatever
            }
})

第一个代码块是更好的方法吗?

3 个答案:

答案 0 :(得分:4)

如何根本不声明任何变量...... :)

$('.myfilter').focus(function() {
    if ( this.value.length === 0 ) {
        dosomething();
    }
}).blur(function(length) {
    if ( this.value.length === 0 ) {
        dowhatever();
    }
});

另外,这个:

$('.myfilter').bind('focus blur', function(e) {
    if ( this.value.length === 0 ) {
        e.type === 'focus' ? dosomething() : dowhatever();
    }
});

使用变量

如果您需要多次使用某个值,通常需要使用变量。但是,在这种情况下,您只需要this.value.length值一次(在if-header中)。因此,您可以直接在if-header中注入此值。

$(this)vs this

为了了解何时使用哪个,您需要了解DOM元素对象和jQuery对象之间的区别。 jQuery对象是一个包装器对象,它包含零个或多个DOM元素对象(如数组)。重要的是要了解您只能在jQuery对象上调用jQuery方法(如.addClass()),而不能直接调用DOM元素。

在事件处理函数内部,this值引用事件触发的DOM元素。现在,如果要在该DOM元素上调用jQuery方法,则需要将该DOM元素包装在jQuery对象中 - 您可以通过编写$(this)来完成此操作。

$(this).addClass('selected'); // works fine
this.addClass('selected'); // throws Error

答案 1 :(得分:2)

我通常会做的是,如果您不想重新获得length,请将length存储在this的媒体资源中,然后在blur中阅读事件,像这样:

$('.myfilter').focus(function(){
    this.val_length = $(this).val().length; 
    if (this.val_length == 0) {
        dosomething
    }
}).blur(function(){
    if (this.val_length == 0) {
        dowhatever
    }
})

答案 2 :(得分:0)

第一个代码块不起作用 - 传递给.blur()的参数实际上是触发模糊调用的事件。

另请注意,不需要使用jQuery来获取值,它是this的直接属性(对于输入元素):

$('.myfilter').blur(function(ev) {
    if (this.value.length === 0) {
        // dowhatever
    }
});