jQuery webticker工作正常,只要其状态不切换。您可以运行以下代码段,看看它工作正常。但是一旦你点击按钮隐藏它,然后点击它再次显示它,它就会停止工作。每次切换时我都无法初始化webticker。
/*!
* webTicker 2.1.1
* Examples and documentation at:
* http://jonmifsud.com/open-source/jquery/jquery-webticker/
* 2011 Jonathan Mifsud
* Version: 2.1.1 (23-MAY-2013)
* Dual licensed under the Creative Commons and DonationWare licenses:
* http://creativecommons.org/licenses/by-nc/3.0/
* https://github.com/jonmifsud/Web-Ticker/blob/master/licence.md
* Requires:
* jQuery v1.4.2 or later
*
*/
(function($) {
var cssTransitionsSupported = (function() {
var s = document.createElement('p').style,
v = ['ms', 'O', 'Moz', 'Webkit'];
if (s['transition'] == '') return true;
while (v.length)
if (v.pop() + 'Transition' in s)
return true;
return false;
})();
function scrollitems($strip, moveFirst) {
var settings = $strip.data('settings') || {
direction: "left"
};
if (typeof moveFirst === 'undefined')
moveFirst = false;
if (moveFirst) {
moveFirstElement($strip);
}
var options = animationSettings($strip);
$strip.animate(options.css, options.time, "linear", function() {
$strip.css(settings.direction, '0');
scrollitems($strip, true);
});
}
function animationSettings($strip) {
var settings = $strip.data('settings') || {
direction: "left",
speed: 50
};
var first = $strip.children().first();
var distance = Math.abs(-$strip.css(settings.direction).replace('px', '').replace('auto', '0') - first.outerWidth(true));
var settings = $strip.data('settings');
var timeToComplete = distance * 1000 / settings.speed;
var animationSettings = {};
animationSettings[settings.direction] = $strip.css(settings.direction).replace('px', '').replace('auto', '0') - distance;
return {
'css': animationSettings,
'time': timeToComplete
};
}
function moveFirstElement($strip) {
var settings = $strip.data('settings') || {
direction: "left"
};
$strip.css('transition-duration', '0s').css(settings.direction, '0');
var $first = $strip.children().first();
if ($first.hasClass('webticker-init'))
$first.remove();
else
$strip.children().last().after($first);
}
function css3Scroll($strip, moveFirst) {
if (typeof moveFirst === 'undefined')
moveFirst = false;
if (moveFirst) {
moveFirstElement($strip);
}
var options = animationSettings($strip);
var time = options.time / 1000;
time += 's';
$strip.css(options.css).css('transition-duration', time);
}
function updaterss(rssurl, type, $strip) {
var list = [];
$.get(rssurl, function(data) {
var $xml = $(data);
$xml.find("item").each(function() {
var $this = $(this),
item = {
title: $this.find("title").text(),
link: $this.find("link").text()
}
listItem = "<li><a href='" + item.link + "'>" + item.title + "</a></li>";
list += listItem;
//Do something with item here...
});
$strip.webTicker('update', list, type);
});
}
function initalize($strip) {
if ($strip.children('li').length < 1) {
if (window.console) {
console.log('no items to initialize');
}
return false;
}
var settings = $strip.data('settings');
settings.duplicateLoops = settings.duplicateLoops || 0;
$strip.width('auto');
//Find the real width of all li elements
var stripWidth = 0;
$strip.children('li').each(function() {
stripWidth += $(this).outerWidth(true);
});
if (stripWidth < $strip.parent().width() || $strip.children().length == 1) {
//if duplicate items
if (settings.duplicate) {
//Check how many times to duplicate depending on width.
itemWidth = Math.max.apply(Math, $strip.children().map(function() {
return $(this).width();
}).get());
var duplicateLoops = 0;
while (stripWidth - itemWidth < $strip.parent().width() || $strip.children().length == 1 || duplicateLoops < settings.duplicateLoops) {
var listItems = $strip.children().clone();
$strip.append(listItems);
stripWidth = 0;
$strip.children('li').each(function() {
stripWidth += $(this).outerWidth(true);
});
itemWidth = Math.max.apply(Math, $strip.children().map(function() {
return $(this).width();
}).get());
duplicateLoops++;
}
settings.duplicateLoops = duplicateLoops;
} else {
//if fill with empty padding
var emptySpace = $strip.parent().width() - stripWidth;
emptySpace += $strip.find("li:first").width();
var height = $strip.find("li:first").height();
$strip.append('<li class="ticker-spacer" style="width:' + emptySpace + 'px;height:' + height + 'px;"></li>');
}
}
if (settings.startEmpty) {
var height = $strip.find("li:first").height();
$strip.prepend('<li class="webticker-init" style="width:' + $strip.parent().width() + 'px;height:' + height + 'px;"></li>');
}
//extra width to be able to move items without any jumps $strip.find("li:first").width()
stripWidth = 0;
$strip.children('li').each(function() {
stripWidth += $(this).outerWidth(true);
});
$strip.width(stripWidth + 200);
widthCompare = 0;
$strip.children('li').each(function() {
widthCompare += $(this).outerWidth(true);
});
//loop to find weather the items inside the list are actually bigger then the size of the whole list. Increments in 200px.
//only required when a single item is bigger then the whole list
while (widthCompare >= $strip.width()) {
$strip.width($strip.width() + 200);
widthCompare = 0;
$strip.children('li').each(function() {
widthCompare += $(this).outerWidth(true);
});
}
return true;
}
var methods = {
init: function(settings) { // THIS
settings = jQuery.extend({
speed: 50, //pixels per second
direction: "left",
moving: true,
startEmpty: true,
duplicate: false,
rssurl: false,
hoverpause: true,
rssfrequency: 0,
updatetype: "reset"
}, settings);
//set data-ticker a unique ticker identifier if it does not exist
return this.each(function() {
jQuery(this).data('settings', settings);
var $strip = jQuery(this);
$strip.addClass("newsticker");
var $mask = $strip.wrap("<div class='mask'></div>");
$mask.after("<span class='tickeroverlay-left'> </span><span class='tickeroverlay-right'> </span>")
var $tickercontainer = $strip.parent().wrap("<div class='tickercontainer'></div>");
var started = initalize($strip);
if (settings.rssurl) {
updaterss(settings.rssurl, settings.type, $strip);
if (settings.rssfrequency > 0) {
window.setInterval(function() {
updaterss(settings.rssurl, settings.type, $strip);
}, settings.rssfrequency * 1000 * 60);
}
}
if (cssTransitionsSupported) {
//fix for firefox not animating default transitions
$strip.css('transition-duration', '0s').css(settings.direction, '0');
if (started) {
//if list has items and set up start scrolling
css3Scroll($strip, false);
}
//started or not still bind on the transition end event so it works after update
$strip.on('transitionend webkitTransitionEnd oTransitionEnd otransitionend', function(event) {
if (!$strip.is(event.target)) {
return false;
}
css3Scroll($(this), true);
});
} else {
if (started) {
//if list has items and set up start scrolling
scrollitems($(this));
}
}
if (settings.hoverpause) {
$strip.hover(function() {
if (cssTransitionsSupported) {
var currentPosition = $(this).css(settings.direction);
$(this).css('transition-duration', '0s').css(settings.direction, currentPosition);
} else
jQuery(this).stop();
},
function() {
if (jQuery(this).data('settings').moving) {
if (cssTransitionsSupported) {
css3Scroll($(this), false);
// $(this).css("-webkit-animation-play-state", "running");
} else {
//usual continue stuff
scrollitems($strip);
}
}
});
}
});
},
stop: function() {
var settings = $(this).data('settings');
if (settings.moving) {
settings.moving = false;
return this.each(function() {
if (cssTransitionsSupported) {
var currentPosition = $(this).css(settings.direction);
$(this).css('transition-duration', '0s').css(settings.direction, currentPosition);
} else
$(this).stop();
});
}
},
cont: function() {
var settings = $(this).data('settings')
if (!settings.moving) {
settings.moving = true;
return this.each(function() {
if (cssTransitionsSupported) {
css3Scroll($(this), false);
} else {
scrollitems($(this));
}
});
}
},
update: function(list, type, insert, remove) {
type = type || "reset";
if (typeof insert === 'undefined')
insert = true;
if (typeof remove === 'undefined')
remove = false;
if (typeof list === 'string') {
list = $(list);
}
var $strip = $(this);
$strip.webTicker('stop');
var settings = $(this).data('settings');
if (type == 'reset') {
//this does a 'restart of the ticker'
$strip.html(list);
$strip.css(settings.direction, '0');
initalize($strip);
} else if (type == 'swap') {
if (window.console) {
console.log('trying to update');
}
if ($strip.children('li').length < 1) {
//there were no items treat as if new
$strip.html(list);
$strip.css(settings.direction, '0');
initalize($strip);
} else {
// should the update be a 'hot-swap' or use replacement for IDs (in which case remove new ones)
$strip.children('li').addClass('old');
for (var i = 0; i < list.length; i++) {
id = $(list[i]).data('update');
match = $strip.find('[data-update="' + id + '"]'); //should try find the id or data-attribute.
if (match.length < 1) {
if (insert) {
//we need to move this item into the dom
if ($strip.find('.ticker-spacer:first-child').length == 0 && $strip.find('.ticker-spacer').length > 0) {
$strip.children('li.ticker-spacer').before(list[i]);
} else {
$strip.append(list[i]);
}
}
} else $strip.find('[data-update="' + id + '"]').replaceWith(list[i]);;
};
$strip.children('li.webticker-init, li.ticker-spacer').removeClass('old');
if (remove)
$strip.children('li').remove('.old');
stripWidth = 0;
$strip.children('li').each(function() {
stripWidth += $(this).outerWidth(true);
});
$strip.width(stripWidth + 200);
}
}
$strip.webTicker('cont');
}
};
$.fn.webTicker = function(method) {
// Method calling logic
if (methods[method]) {
return methods[method].apply(this, Array.prototype.slice.call(arguments, 1));
} else if (typeof method === 'object' || !method) {
return methods.init.apply(this, arguments);
} else {
$.error('Method ' + method + ' does not exist on jQuery.webTicker');
}
};
})(jQuery);
/* Initializing the webticker */
$("#webticker").webTicker({
speed: 60,
direction: "left",
moving: true,
startEmpty: true,
duplicate: false,
rssurl: false,
rssfrequency: 0,
updatetype: "reset",
hoverpause: true
});
/* Executing the function on button click to toggle the webticker */
$('button').on('click', function() {
$("#webticker").toggle();
});
/* liScroll styles */
.tickeroverlay-left {} .tickeroverlay-right {} .tickercontainer {
/* the outer div */
/*background: #000000;*/
width: auto;
height: 40px;
margin: 0;
padding: 0;
overflow: hidden;
}
.tickercontainer .mask {
/* that serves as a mask. so you get a sort of padding both left and right */
position: relative;
padding: 0px;
margin: 0px;
top: 0px;
height: 40px;
overflow: hidden;
}
ul.newsticker {
/* that's your list */
/*Transitions have been added in order set css3 transitions; and have linear easing. Changing these lines you might have unexpected results */
-webkit-transition: all 0s linear;
-moz-transition: all 0s linear;
-o-transition: all 0s linear;
transition: all 0s linear;
position: relative;
margin-left: 20px;
font: bold 10px Verdana;
list-style-type: none;
height: 40px;
padding: 0px;
margin: 0px;
line-height: 40px;
font-size: 20px;
font-family: 'Digital dream';
}
ul.newsticker li {
font-size: inherit;
font-family: inherit;
color: gray;
float: left;
/* important: display inline gives incorrect results when you check for elem's width */
margin: 0;
cursor: pointer;
vertical-align: middle;
}
ul.newsticker a {
white-space: nowrap;
padding: 0;
color: gray;
font: bold 10px Verdana;
margin: 0 50px 0 0;
}
ul.newsticker span {
margin: 0 10px 0 0;
}
.ticker-toggle {
margin-top: 10px;
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<ul id="webticker">
<li id='item1'>My First News Item</li>
<li id='item2'>My Second News Item</li>
<li id='item3'>My Third News Item</li>
<li id='item4'>My Fourth News Item</li>
<li id='item5'>My Fifth News Item</li>
<li id='item6'>My Sixth News Item</li>
<li id='item7'>My Seventh News Item</li>
<li id='item8'>My Eighth News Item</li>
<li id='item9'>My Ninth News Item</li>
<li id='item10'>My Tenth News Item</li>
</ul>
<div class="ticker-toggle">
<button type="button">Ticker Toggle</button>
</div>