为什么jQuery会出现这个函数范围错误?

时间:2012-07-25 19:21:01

标签: javascript jquery scope

我有以下功能:

function updateStatuses() {
    $.each($('.status-badge'), function (i, value) {
        value.removeClass('badge-known');
    });
    $.post("/Diagnostics/Update", {  }, function(data) {
        $.each(data, function() {
            setStatus(this.Id, this.Infos, this.Errors, this.Warnings);
        });
    });
    window.setTimeout(function () {
        $.each($('.status-badge:not(.badge-known)'), function(i, value) {
            value.addClass('badge-unknown');
        });
    }, 1000);
}

基本上,我正在从AJAX调用中更新一组徽章。如果在1000毫秒后,任何某个徽章尚未更新,则会获得badge-unknown类。

上面的函数被称为:

$(function () { updateStatuses(); });

我的问题是value.removeClass('badge-known');出现以下错误:

TypeError: value.removeClass is not a function

如果我对该行进行注释,则超时函数会在value.removeClass('badge-unknown');

上抛出相同的错误

令人困惑的是,addClassremoveClasssetStatus中使用,{{1}}在上面的函数下方定义。我在这里做错了什么?

2 个答案:

答案 0 :(得分:4)

调用标准jQuery方法时无需使用.each。大多数此类方法将很乐意直接迭代一组元素。

此外,主document.ready处理程序周围不需要匿名函数包装器:

您的整个代码可以就是这样:

function updateStatuses() {
    $('.status-badge').removeClass('badge-known');

    $.post("/Diagnostics/Update", {  }, function(data) {
        $.each(data, function() {
            setStatus(this.Id, this.Infos, this.Errors, this.Warnings);
        });
    });

    window.setTimeout(function () {
        $('.status-badge:not(.badge-known)').addClass('badge-unknown');
    }, 1000);
}

$(updateStatuses);

答案 1 :(得分:3)

value是一个dom节点,而不是一个jQuery对象。尝试

$(value).removeClass('badge-known');