this.click()和$(this).click()有什么区别?

时间:2009-06-30 21:15:07

标签: javascript jquery javascript-events

最后,我认为这不是我特别需要解决的问题,但是我不理解为什么会发生这种情况。

基本上,我有一些复选框,我只希望用户能够选择一定数量的复选框。我正在使用下面的代码来实现这种效果。


$j( function () {
    $j('input[type=checkbox].vote_item').click( function() {
        var numLeft = (+$j('#vote_num').text());
        console.log(numLeft);
        if ( numLeft == 0 && this.checked ) {
            alert('I\'m sorry, you have already voted for the number of items that you are allowed to vote for.');
            return false;
        } else {
            if ( this.checked == true ) {
                $j('#vote_num').html(numLeft-1);
            } else {
                $j('#vote_num').html(numLeft+1);
            }
        }
    });
});

当我测试它时,我注意到如果我使用了:


$j('input[type=checkbox]').each( function () {
    this.click()
});

Javascript按照我的预期做出反应,但是当用于:


$j('input[type=checkbox]').each( function () {
    $j(this).click()
});

它实际上会使计数器计数UP。

我确实意识到这不是使用计数器保持计数的最安全的方法,但是我确实有服务器端错误检查,这可以防止在数据库中输入超过必需的数量,这就是我已经确定它实际上并不需要修复。

编辑:$ j是因为我必须在noConflict模式下使用jQuery ...

3 个答案:

答案 0 :(得分:6)

$(this)包含一个jQuery包装器(包含许多函数),而这只是DOM对象。

答案 1 :(得分:3)

计数器上升的事实让我得到了一个线索,即你正在使用的checked属性和手动触发click事件之间存在链接。

我在Google搜索了“jquery复选框点击事件提升”并找到了此链接,其中作者面临完全相同的问题及其使用的解决方法。

http://www.bennadel.com/blog/1525-jQuery-s-Event-Triggering-Order-Of-Default-Behavior-And-triggerHandler-.htm

另外,我认为您可以进一步简化代码:

$j('input[type=checkbox].vote_item').click( 
function() 
{
    var maxNumberOfChoices = 5;

    //get number of checked checkboxes. 
    var currentCheckedCount = $j('input[type=checkbox].vote_item :checked');

    if(currentCheckedCount > maxNumberOfChoices)
    {
        //It's useful if you show how many choices user can make. :)
        alert('You can only select maximum ' + maxNumberOfChoices + ' checkboxes.');
        return false;
    }

    return true;
});

答案 2 :(得分:3)

this.click()调用浏览器DOM方法click()

$(this).click()调用jQuery方法click(),它不仅仅调用浏览器方法:有关详细信息,请参阅函数trigger的实现。