tags:

views:

466

answers:

2

I am trying to work on a content slider with effects similar to this website:Monitter

Unlike this website, I don't want to include any real time twitter updates. I just want the content in div's to be loaded in a similar fashion.

I have already looked at various jquery plugins having vertical content slider, but none of them seem to have the desired effect.

Lastly, I am not looking for entire code, but just some little help so that I can start working in the right direction.

Edit: There needs to be a time delay between successive div's so that the user can go through content in each div.

Edit: I think I should clarify with some code sample this time. I apologize for not geeting to this earlier: Here's the sample data in jsondata.php file

<?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;
?>

Following is the index.html file:

 <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd"&gt;
<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>

Now, clicking on user data will quickly populate all the data in the div with class entry. What I am looking for is populating the data in a style similar to the monitter website, that is, the data should populate slowly with a time delay. This is some sample code. Kindly correct me if I am heading in the wrong direction.

A: 

I'm going to assume that you are loading your data with AJAX (you get the content of the new DIV via AJAX). You could then do something like this:

edit: based on your comment you could use something like this. I haven't tested the code, but the logic is there (just hope I didn't mess something up:)):

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 milliseconds is 5 seconds, adjust that if you want shorter intervals for updating

Jan Hančič
This method will quickly populate all the data. What if I want to have a time delay between two div's so that the user can go through content in each div?
Learner
+2  A: 

This is how I would do it (demo here)... The actual code is contained in the addRow function. I added a simple "insert date" into the content, you can use ajax to retrieve whatever content.

The rest of the code is for demonstration purposes, mostly because I didn't like the div's going off the screen, so I added a max # of div's per column.

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') });
}


Update: Ok, I see you didn't ask for code, but I but this bit together... it should be more along the lines of what you want.

Assuming this json structure:

({
 "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 (same as before)

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 />');
   }
  })
 }
}
fudgey
I think I'll have to make modifications to this because the content is getting added only on button click. I am actually looking for automated content addition similar to the monitter website.
Learner
Well I wasn't sure how you were going to get your data. Also did you want the ability to add more columns?
fudgey
multi-level json data
Learner
I am just looking for data in a single column
Learner
Updated... I didn't post a demo as it's hard to access json data from a pastebin
fudgey
That's it man!! This does it!! Thanks a ton!! I 'll have to just make some modifications to it so that the user can pause the stream at any time. I would really love to give you credit for this on my website. Can I have your full name and a small pic (if you don't mind).
Learner
btw, my email [email protected]
Learner
LOL thanks, but it's ok I don't need any credit, just enjoy :)
fudgey