2009-12-20 4 views
1

Я пытаюсь работать на ползунок контента с эффектами, подобными этим сайтом: MonitterJQuery слайдер контента

В отличие от этого сайта, я не хочу, чтобы включать в себя любые обновления в режиме реального времени щебет. Я просто хочу, чтобы содержимое в div было загружено аналогичным образом.

Я уже рассматривал различные плагины jquery с ползунком вертикального содержимого, но ни один из них не имеет желаемого эффекта.

Наконец, я не ищу весь код, но немного помогу, чтобы начать работать в правильном направлении.

Редактировать: Должна быть временная задержка между последовательными div, чтобы пользователь мог просматривать контент в каждом div.

Редактировать: Я думаю, что на этот раз я должен уточнить пример кода. Я прошу прощения за не geeting к этому ранее: Вот выборочные данные в jsondata.php файл

<?php 
    $json = '{ 
     "userdata": [ 
      { 
       "first":"James", 
       "last":"Watt", 
       "email":"[email protected]", 
       "city":"xyz" 
      }, 
      { 
       "first":"Isaac", 
       "last":"Newton", 
       "email":"[email protected]", 
       "city":"xyz" 
      }, 
      { 
       "first":"Albert", 
       "last":"Einstein", 
       "email":"[email protected]", 
       "city":"xyz" 
      } 
         ] 
        }'; 
       echo $json; 
?> 

Ниже приводится index.html файл:

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd"> 
<html> 
    <head> 
     <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1"> 
     <title>Untitled Document</title> 
     <link rel="stylesheet" type="text/css" href="style2.css" /> 
     <script type="text/javascript" src="lib/jquery/jquery-1.3.2.js"></script> 
     <script type="text/javascript"> 
      $(document).ready(function(){ 
       $("#loaduserdata").click(function(){ 
       $("#info").empty(); 
      $.getJSON(
      "jsondata.php", 
      function(data){ 
       $.each(data.userdata, function(i,user){ 
        var html = '<div class="entry">'; 
         html += "<p>"+user.first+"</p>"; 
         html += "<p>"+user.last+"</p>"; 
         html += "<p>"+user.email+"</p>"; 
         html += "<p>"+user.city+"</p>"; 
         html += '</div>'; 
        $(html).appendTo('#info'); 
       }); 
      }); 
    }); 

}); 
     </script> 
    </head> 
    <body> 
     <a href="#" id="loaduserdata">User Data</a> 
     <div id="info"></div> 
    </body> 
</html> 

Теперь, нажав на пользователя данные быстро заполнят все данные в div с записью класса. То, что я ищу, заполняет данные в стиле, подобном веб-сайту мониторинга, то есть данные должны медленно заполняться с задержкой по времени. Это пример кода. Пожалуйста, поправьте меня, если я направляюсь в неправильном направлении.

+0

А вы посмотрите на JQuery UI? – kiamlaluno

+0

ya, я посмотрел на него. Я все еще работаю с ним, но пока не могу получить желаемые результаты. –

ответ

2

Вот как бы я это сделал (demo here) ... Фактический код содержится в функции addRow. Я добавил простую «дату вставки» в контент, вы можете использовать ajax для получения любого контента.

Остальная часть кода предназначена для демонстрационных целей, главным образом потому, что мне не понравилось, что div уходит с экрана, поэтому я добавил максимальное количество div на столбе.

CSS

#wrapper { position: relative; left: 0; top: 0; width: 600px; margin: 0 auto; text-align: center; } 
.column { position: relative; float: left; padding: 0; width: 50%; } 
.column div { background: #eee; border: #333 1px solid; margin: 5px; padding: 5px; } 
.column .top { background: #ccc; } 
.newrow { display: none; } 

HTML

<input type="button" rel="col1" style="margin: 5px; float: right;" value="Add row to right" /> 
<input type="button" rel="col0" style="margin: 5px; float: right;" value="Add row to left" /> 
<input type="button" rel="both" style="margin: 5px; float: right;" value="Add row to both" /> 

<div id="wrapper"> 
<div id="col0" class="column"><div class="top">Content added below</div></div> 
<div id="col1" class="column"><div class="top">Content added below</div></div> 
</div> 

Script

$(document).ready(function(){ 
var maxRows = 10; 
$(':button').click(function(){ 
    var el = $(this).attr('rel'); 
    if (el=="both") { el="col1"; addRow("col0"); } 
    addRow(el); 
    // remove extra rows 
    $('#wrapper').find('.column').each(function(){ 
    $(this).find('.row:gt(' + maxRows + ')').remove(); 
    }) 
}); 
}) 

function addRow(el){ 
// get whatever contents here 
var content = (new Date).toString(); 
// add new row 
$('#'+el).find('.top').after('<div class="newrow row">' + content + '</div>') 
$('.newrow').fadeIn('slow',function(){ $(this).removeClass('newrow') }); 
} 

Обновление: Хорошо, я вижу, ты не просил кода, но я, но этот бит вместе ... это должно быть больше в соответствии с тем, что вы хотите.

Предполагая эту JSon структуру:

({ 
"news": [ 
    { "id" : "0010", "date" : "Sun Dec 20 2009 12:10:00 GMT-0500 (Eastern Standard Time)", "title" : "News item 10" }, 
    { "id" : "0009", "date" : "Sun Dec 20 2009 12:09:00 GMT-0500 (Eastern Standard Time)", "title" : "News item 9" }, 
    { "id" : "0008", "date" : "Sun Dec 20 2009 12:08:00 GMT-0500 (Eastern Standard Time)", "title" : "News item 8" }, 
    { "id" : "0007", "date" : "Sun Dec 20 2009 12:07:00 GMT-0500 (Eastern Standard Time)", "title" : "News item 7" }, 
    { "id" : "0006", "date" : "Sun Dec 20 2009 12:06:00 GMT-0500 (Eastern Standard Time)", "title" : "News item 6" }, 
    { "id" : "0005", "date" : "Sun Dec 20 2009 12:05:00 GMT-0500 (Eastern Standard Time)", "title" : "News item 5" }, 
    { "id" : "0004", "date" : "Sun Dec 20 2009 12:04:00 GMT-0500 (Eastern Standard Time)", "title" : "News item 4" }, 
    { "id" : "0003", "date" : "Sun Dec 20 2009 12:03:00 GMT-0500 (Eastern Standard Time)", "title" : "News item 3" }, 
    { "id" : "0002", "date" : "Sun Dec 20 2009 12:02:00 GMT-0500 (Eastern Standard Time)", "title" : "News item 2" }, 
    { "id" : "0001", "date" : "Sun Dec 19 2009 12:01:00 GMT-0500 (Eastern Standard Time)", "title" : "News item 1" } 
] 
}) 

CSS (так же, как и раньше)

HTML

<div id="wrapper"> 
<div class="column"><div class="top">Content added below</div></div> 
</div> 

Script

$(document).ready(function(){ 
initData(); 
}) 

function initData(){ 
var o = { 
    maxRows: 10, // max # of rows to show 
    updateJSON : 15, // update data every 30 seconds 
    updateScreen : 1, // update screen every 2 seconds with data 

    count: 0, // count # of cycles of setTimeout 
    lastID: -1, // last news ID 
    debug: false // debug 
}; 
var cycle; 
if (o.debug) $('#wrapper').prepend('<div id="debug"></div>') 
getData([]); 

function addRow(content){ 
    // update data if this function has cycled 30/2 times - so we only use one settimeout function 
    o.count++; 
    if (o.debug) $('#debug').html('seconds passed = ' + o.count*o.updateScreen + ', content.length = ' + content.length); 
    if (o.count >= o.updateJSON/o.updateScreen) { 
    o.count = 0; 
    getData(content); 
    } 

    if (content.length > 0) { 
    // remove last array element 
    var n = content.pop(); 
    // if content length is zero, the set last ID 
    if (content.length === 0) o.lastID = n[0]; 
    // add new row, rel contains the id - not used by the script, but there if you need it. 
    $('#wrapper').find('.top').after('<div class="newrow row" rel="' + n[0] + '">' + n[2] + '<br />' + n[1] + '</div>'); 
    $('.newrow').fadeIn('slow', function(){ $(this).removeClass('newrow') }); 
    } 
    $('#wrapper').find('.row:gt(' + (o.maxRows-1) + ')').remove(); 
    cycle = setTimeout(function(){ addRow(content) } , o.updateScreen * 1000); 
} 

function getData(content){ 
    var tmparray = []; 
    var lastIDfound = false; 
    $.ajax({ 
    type: "GET", 
    url: "newsitems.js", 
    dataType: "json", 
    success: function(data) { 
    $.each(data.news, function(news){ 
    if (this.id == o.lastID) lastIDfound = true; 
    if (!lastIDfound){ 
    // return month day year time (assuming US notation) 
     var newsDate = this.date.split(' ').slice(1,5); 
     // get today's month day year 
     var today = new Date().toString().split(' ').slice(1,4).join(' '); 
     // show only the time if the date is today 
     var newsTime = (newsDate.slice(0,3).join(' ') == today) ? 'posted at ' + newsDate[3] : 'from ' + newsDate.join(' '); 
     tmparray.push([ this.id, newsTime, this.title ]); 
    } 
    }); 
    // if tmparray length is zero, then return 
    if (tmparray.length === 0) return; 
    // if last item shown hasn't changed, then return with no new data 
    if (tmparray[0][0] == o.lastID) return; 
    // set last ID 
    if (o.lastID == -1) o.lastID = tmparray[0][0]; 
    clearTimeout(cycle); 
    if (content.length === 0) { 
    addRow(tmparray); 
    } else { 
    addRow(content.concat(tmparray)); 
    } 
    }, 
    error: function(XMLHttpRequest, textStatus, errorThrown) { 
    if (!$('#error').length) $("#wrapper").prepend('<div id="error"></div>'); 
    $('#error').html(errorThrown + '<br />'); 
    } 
    }) 
} 
} 
+0

Думаю, мне придется внести изменения в это, потому что контент добавляется только при нажатии кнопки. Я действительно ищу автоматическое дополнение контента, похожее на сайт мониторинга. –

+0

Ну, я не был уверен, как вы собираетесь получать ваши данные. Также вы хотели добавить больше столбцов? – Mottie

+0

многоуровневые данные json –

0

Я собираюсь предположить, что вы загружаете свои данные с помощью AJAX (вы получаете содержимое нового DIV через AJAX). Затем вы можете сделать что-то вроде этого:

Редактировать: на основе вашего комментария вы можете использовать что-то вроде этого. Я не проверял код, но логика есть (только надеюсь, что я не запутались что-то :)):

var lastAddedTime = null; 

function addNewDiv (response) { 
    var timeNow = new Date().getTime(); 
    if (lastAdded === null || (timeNow - lastAddedTime) > 5000) { 
     // depending on what response is build your DIV 
     // it could be HTML or JSON from which you generate HTML 
     var newDiv = $(response); 
     newDiv.css ('display', 'none'); 

     newDiv.prependTo ($('selector for your container')); 
     newDiv.fadeIn ('slow'); 
     lastAddedTime = timeNow; 
    } else { 
     setTimeout (function() { addNewDiv (response); }, 5001); 
    } 
} 

$.get (
    'get_data.php', 
    { 
     // your parameters 
    }, 
    function (response) { 
     addNewDiv (response); 
    } 
); 

5000 миллисекунд 5 секунд, установите, что если вы хотите более короткие интервалы обновления

+0

Этот метод быстро заполнит все данные. Что, если я хочу иметь временную задержку между двумя div, чтобы пользователь мог просматривать контент в каждом div? –

Смежные вопросы