困难的Jquery <div>问题,需要专家建议</div>

时间:2010-09-12 20:38:00

标签: jquery html css

嘿伙计们,我有点奇怪的问题。我有一个jquery脚本,基本上按照时间顺序逐个降序地从php脚本中的数据预先添加消息,以便最新的消息在顶部。我想要做的是以某种方式将一个div容器放在两个或多个这些消息出来的时候,所以我决定检查哪个消息是最旧的,并在消息前加上一个标签和带有标签的最新消息,因为每个消息都出来一个一个人。然而,这没有奏效,因为div似乎没有检测到机箱,只是部分地包含了2条测试消息(只包含第一条消息)。如果有人对如何做到这一点有任何建议,我很乐意听到。

     function prepare(response) {
          count++;

//function in another doc
nicetime = handleDate(response.timestamp);

if (response.replydiv=='start'){
    var list_name='<div id="chunk">start';
}
else{
    var list_name='';
}
  if (response.creator!==''){
        var list_name=list_name+'<li class="message-list-creator" id="list-'+count+'">'
    }
    else{
        var list_name=list_name+'<li class="message-list" id="list-'+count+'">'
    }




            var string = ''+list_name+''

              + '<span class="message-list-nick"><a href="statistics.php?user='+response.user+'">'+response.user+'</a></span>'
              + ' <span class="date" id='+response.timestamp+'>'+nicetime+'</span><br>'
              + '<span class="msg">'+response.message+'</span>'
              + '<span class="clear"></span>'
              if(response.reply!='null'){
               var string = string +'<a message_id="'+response.reply_chunk_id+'" id="reply">reply</a></li>';
              }
              else {
                 var string=string+'</li>';
              }


              if (response.replydiv=='end'){
            var string=string +'</div>end';
        }

          return string;
        }

$.getJSON(files+"message.php?action=view&load=initial&topic_id="+topic_id+"&username="+username+"&t=" + (new Date()), function(json) {  
            if(json.length) {
              for(i=0; i < json.length; i++) {
                  json.sort(function(a,b) { return parseFloat(a.timestamp) - parseFloat(b.timestamp) } );
                $('#message-list').prepend(prepare(json[i]));
                $('#list-' + count).fadeIn(1500);
              }

            }

          });

1 个答案:

答案 0 :(得分:2)

你有一个迷路(并且无法匹敌)</li>可能会在这部分丢掉你的标记:

+'</li>';

另外,当您使用第一个未关闭的<div>来调用.prepend()时,您会遇到问题...这不仅仅是添加HTML而是制作DOM元素,因此您需要将整个HTML字符串放在一起然后.prepend()它立即出现。

您可以进一步优化这一点,但基本的固定版本将是这样的:

function prepare(response) {
  count++;
  //function in another doc
  var nicetime = handleDate(response.timestamp), string="";

  if (response.div=='start'){
    string = '<div id="chunk">start div';
  }

  string += list_name;
  string += '<span class="message-list-nick">'+response.message+'</span>';

  if (response.div=='end'){
   string += '</div>end div';
  }
  return string;
}

和ajax电话:

$.getJSON(files+"script.php?action=view&load=initial&topic_id="+topic_id+"&username="+username+"&t=" + (new Date()), function(json) { 
  var output = "";
  for(i=0; i < json.length; i++) {
    json.sort(function(a,b) { return parseFloat(a.timestamp) - parseFloat(b.timestamp) } );

     output += prepare(json[i]);
     $('#list-' + count).fadeIn(1500);
  }
  $('#messagelist').prepend(output);
});

这里的重要区别是,在字符串完成之前我们不会附加到DOM ... jQuery将在第一次调用.prepend()时立即(或尝试)完成元素。