$(d).attr(“id”)是未定义的javascript

时间:2009-04-02 14:38:55

标签: javascript jquery firebug

我有一个我使用的变量d:

$(function() {  
    for(i = 1; i <= 31; i++) {
        var d = '#days' + i;    
        if ($(d).attr("id").substr(4,2) == 11) {
            $(d).addClass("date_has_event");
            //console.log("diez");
        } else {
            console.log("otro");
        }
    }
}

但是我在firebug中遇到以下错误:


$(d).attr("id") is undefined
index.html    (L23)   (?)()()
jquery.min.js (L27)   onreadystatechange()()
jquery.min.js (L27)   onreadystatechange()()
jquery.min.js (L21)   nodeName()([function(), function()], function(), undefined)
onreadystatechange()()

我真的不明白为什么。有谁知道吗?


修改

我很抱歉我必须运行这个糟糕的解释,这里的内容会更详细一些。我正在使用javascript生成日历。每个td有一个不同的id(因此#days + i),我从1到31运行它,所以我可以覆盖更长的月份。但是我收到了上面提到的错误。我也使用jQuery库让我更容易选择(即代替getElementById #days)

4 个答案:

答案 0 :(得分:8)

为什么不检查i == 11,然后对其进行处理?它仍然只会在$('#days11')上触发。编辑:如果你需要确保元素存在,只需将其打入条件。

$(function(){   
    for(i = 1; i <= 31; i++){
        var d = '#days' + i;    

//       if($(d) && i == 11){            
         if(i == 11){
               $(d).addClass("date_has_event");
               //console.log("diez");
         }else{
               console.log("otro");
         }
    }
}

答案 1 :(得分:3)

好的,新答案。你这样做的方式不是很“jqueryish”。让我们退后一步。从我可以告诉你有一个html结构,如:

<div id="days1"></div>
<div id="days2"></div>
...

然后你对每个带有days(num)id的项目运行它?一个更好的解决方案是,如果你想为每个带有日期的元素添加一个类,首先应用一个类:

<div class="days"></div>
<div class="days"></div>

您的代码可以

$(function(){
    $(".days").each(function(i){
        if($(this).substr(4,2) == 11){
            $(this).addClass("date_has_event");
        }
    });  
});

答案 2 :(得分:1)

由于您是按ID选择的,因此这是多余的:

if ($(d).attr("id").substr(4,2) == 11)

因为d 的ID属性是 d。

最简单的事情是:

if (i == 11)

答案 3 :(得分:0)

缺少结束括号?

$(function() {  
    for(i = 1; i <= 31; i++) {
        var d = '#days' + i;    
        if (i == 11) {
            $(d).addClass("date_has_event");
            //console.log("diez");
        } else {
            console.log("otro");
        }
    }
// shouldn't the next line be });
}