【问题标题】:jQuery .length() with appended elements带有附加元素的 jQuery .length()
【发布时间】:2011-05-13 17:22:21
【问题描述】:

我的 .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);

    });
});

}

【问题讨论】:

  • jQuery中没有.length()这样的函数。 length 只是一个 javascript 数组的属性。
  • @TheSuperTramp:是的。 jQuery 对象的行为类似于类数组对象,因此拥有 .length 属性。
  • 这正是我所说的。你可以写$('div').length,但不能写$('div').length()

标签: jquery append


【解决方案1】:

根据您的评论。看起来添加 .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 );

【讨论】:

  • 我也是这么想的... sn-p 在.ready() 中,添加.tweet 的函数(getTweets();) 是对的在这个之前。看看我的编辑...
  • 非常感谢您的回答,唯一的问题是我不能使用任何比 1.3.2 更新的 jQuery ...您对我如何使用这个版本有任何想法吗?
  • 哦,如果我提醒 nTweets,为什么它会起作用?如果我知道的话,也许我可以使用其他一些功能而不会出现任何对话框:)
  • @Charleshaa:真可惜。对于 1.3.2,您必须给 .getTweets() 一个参数,您可以在其中传递一个函数。在getTweets 中,您需要在收到数据时执行该参数(函数)。
  • 还是个新手,能不能用sn-p来说明一下? :)
猜你喜欢
  • 1970-01-01
  • 2017-01-10
  • 1970-01-01
  • 1970-01-01
  • 2012-05-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-07-14
相关资源
最近更新 更多