带有附加元素的jQuery .length()

时间:2011-05-13 08:43:37

标签: jquery append

我对.length()属性有点问题。我正在尝试用同一个类来计算每个div中的跨距数。这些Div先前已附加在脚本中。有趣的是,如果我警告变量对应的长度,一切正常,如果我删除警报,它不会。从来没有见过,所以任何帮助将不胜感激:)这是代码:

getTweets();
tweetCounter = function(){
    $('.entry').each(function(){
        var nTweets = $('.tweet', this).length;
        var infoPane = $('.infoPane', this);
        var tLink = '<a href="#" class="tLink" title="Tweets of the day">' + nTweets + ' Tweets that day</a>'; 
        infoPane.append(tLink);
        //alert(nTweets);   
    });


}
tweetCounter();

正如我所说,当我取消注释警报时,它会正确附加。如果注释,每个DIV上都会显示0 ... 有什么想法吗?

这是 getTweets 功能:

getTweets = function(){
var url = "http://twitter.com/status/user_timeline/charleshaa.json?count=30&callback=?";
$.getJSON(url, function(data){
    $.each(data, function(i, item) {
        var fullTDate = item.created_at;
        var splitTDate = fullTDate.split(" ");
        var tMonth = splitTDate[1];
        if (tMonth == "Jan"){
            tMonth = "01"
        } else if(tMonth == "Feb"){
            tMonth = "02"
        } else if(tMonth == "Mar"){
            tMonth = "03"
        } else if(tMonth == "Apr"){
            tMonth = "04"
        } else if(tMonth == "May"){
            tMonth = "05"
        } else if(tMonth == "Jun"){
            tMonth = "06"
        } else if(tMonth == "Jul"){
            tMonth = "07"
        } else if(tMonth == "Aug"){
            tMonth = "08"
        } else if(tMonth == "Sep"){
            tMonth = "09"
        } else if(tMonth == "Oct"){
            tMonth = "10"
        } else if(tMonth == "Nov"){
            tMonth = "11"
        } else if(tMonth == "Dec"){
            tMonth = "12"
        }
        var tDay = splitTDate[2];
        var tYear = splitTDate[5];
        var tDate = tDay + '-' + tMonth + '-' + tYear;
        var tText = '<span class="tweet">' + item.text + '</span>';
        //alert(tDate);

        var destination = $('#date_'+ tDate +'');
        destination.append(tText);

    });
});

}

1 个答案:

答案 0 :(得分:3)

根据您的评论。它几乎看起来像添加.tweet元素的函数不同步地执行此操作(可能是ajax请求?)如果是这种情况,该方法不会阻止代码执行和再次,这会带来你的行为。

在这种情况下你需要做的是,为获取和创建推文的函数提供回调函数。如果已完成,请执行回调。

function get_tweets() {
    var requests = [ ];

    for(var i = 0; i < 5; i++) {
        requests.push( $.getJSON('/foo' + i + '.json', function(data) {
            // do something and create `.tweet` nodes
        }) );
    }

    return requests;
}

$.when.apply( null, get_tweets() ).done( count_tweets );

这就是jQuery 1.5.2+中的样子。这里的get_tweets()函数触发5个请求,并将Deferred对象存储在返回的数组中。当所有承诺都得到履行时,$.when()将会触发。

<强>更新

以下是1.3.2应该如何显示:

getTweets = function( callback ){
    var url = "http://twitter.com/status/user_timeline/charleshaa.json?count=30&callback=?";
    $.getJSON(url, function(data){
        $.each(data, function(i, item) {
            var fullTDate = item.created_at;
            var splitTDate = fullTDate.split(" ");
            // and so forth....
        });

        if( typeof callback === 'function' )
            callback();
    });
}

然后将其称为

getTweets( tweetCounter );