Skip to content

Instantly share code, notes, and snippets.

@alx
Created May 15, 2009 15:45
Show Gist options
  • Save alx/112260 to your computer and use it in GitHub Desktop.
Save alx/112260 to your computer and use it in GitHub Desktop.
/*
News ticker plugin (BBC news style)
Bryan Gullan,2007-2009
version 1.2.2
updated 2009-02-15
http://www.makemineatriple.com/jquery
Use and distrubute freely with this header
Options (defaults shown):
newsList: "#news" // assumes unordered list; specify the ul holding the news items
tickerRate: 80 // time gap between display of each letter (ms)
startDelay: 100 // delay before first run of the ticker (ms)
loopDelay: 3000 // time for which full text of each item is shown at end of print-out (ms)
placeHolder1: " |" // character placeholder shown on even loops
placeHolder2: "_" // character placeholder shown on odd loops
Sample usage:
$(document).ready(function() {
var options = {
newsList: "#news",
startDelay: 10,
placeHolder1: " []"
}
$().newsTicker(options);
});
for markup as follows:
<ul id="news">
<li><a href="http://www.makemineatriple.com">MakeMineATriple.com</a></li>
<li><a href="http://www.jquery.com">jQuery</a></li>
</ul>
Underline text decoration on the link is not recommended! :-)
*/
(function($) {
function runTicker(settings) {
if(settings.firstRun == 1){
currentLength = settings.currentLength;
currentItem = settings.currentItem;
settings.firstRun = 0;
}
if(currentItem == settings.newsItemCounter + 1){
currentItem = 0;
}
if(currentLength == 0) {
if(settings.newsLinks[currentItem].length > 0) {
$(settings.newsList).empty().append('<li><a href="'+ settings.newsLinks[currentItem] +'"></a></li>');
}
else {
$(settings.newsList).empty().append('<li></li>');
}
}
if( currentLength % 2 == 0) {
placeHolder = settings.placeHolder1;
}
else {
placeHolder = settings.placeHolder2;
}
if( currentLength <= settings.newsItems[currentItem].length + 1) {
var tickerText = settings.newsItems[currentItem].substring(0,currentLength);
if(settings.newsLinks[currentItem].length > 0) {
$(settings.newsList + ' li a').text(tickerText + placeHolder);
}
else {
$(settings.newsList + ' li').text(tickerText + placeHolder);
}
currentLength ++;
var storedTimeoutID= $('span#newsticker-timeout').attr('timeoutID-1');
clearTimeout(storedTimeoutID);
storedTimeoutID = setTimeout(function(){runTicker(settings); settings = null;},settings.tickerRate);
$('span#newsticker-timeout').attr('timeoutID-1',storedTimeoutID);
}
else {
if(settings.newsLinks[currentItem].length > 0) {
$(settings.newsList + ' li a').text(settings.newsItems[currentItem]);
}
else {
$(settings.newsList + ' li').text(settings.newsItems[currentItem]);
}
currentLength = 0;
currentItem ++;
var storedTimeoutID= $('span#newsticker-timeout').attr('timeoutID-2');
clearTimeout(storedTimeoutID);
storedTimeoutID = setTimeout(function(){runTicker(settings); settings = null;},settings.loopDelay);
$('span#newsticker-timeout').attr('timeoutID-2',storedTimeoutID);
}
}
$.fn.extend({
newsTicker: function(settings) {
settings = jQuery.extend({
newsList: "#news",
tickerRate: 80,
startDelay: 100,
loopDelay: 3000,
placeHolder1: " |",
placeHolder2: "_"
}, settings);
var newsItems = new Array();
var newsLinks = new Array();
var newsItemCounter = 0;
$('body').append("<span id='newsticker-timeout' style='display:none;'/>")
$(settings.newsList + ' li').hide();
$(settings.newsList + ' li').each(function(){
if($(this).children('a').length) {
newsItems[newsItemCounter] = $(this).children('a').text();
newsLinks[newsItemCounter] = $(this).children('a').attr('href');
}
else {
newsItems[newsItemCounter] = $(this).text();
newsLinks[newsItemCounter] = '';
}
newsItemCounter ++;
});
settings = jQuery.extend(settings,{
newsItems: newsItems,
newsLinks: newsLinks,
newsItemCounter: newsItemCounter - 1,
currentItem: 0,
currentLength: 0,
firstRun:1
});
var storedTimeoutID= $('span#newsticker-timeout').attr('timeoutID-0');
clearTimeout(storedTimeoutID);
storedTimeoutID = setTimeout(function(){runTicker(settings); settings = null;},settings.startDelay);
$('span#newsticker-timeout').attr('timeoutID-0',storedTimeoutID);
}
});
})(jQuery);
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment