我制作了动画,其中所有加载的评论都会出现,并在下一条评论到来时消失。
我做了DEMO所以请检查一下!
问题是timeupdate
每秒工作约10次
因此每个评论动画都会被解雇10次:(
请看DEMO,你会发现它看起来很怪异。
我该怎么处理? 任何人都可以在JSfiddle中修改我的代码。
这些是我的代码。
的javascript
jQuery(document).ready(function () {
$('#video').on('timeupdate',function(e){
showComments(this.currentTime);
});
});
var comments = [{'time':'10','message':'hello! 10 secs has past'},{'time':'15','message':'hello! 15 secs has past'},{'time':'5','message':'hello! 5 secs has past'},{'time':'20','message':'hello! 20 secs has past'}];
function showComments(time){
var comments = findComments(time);
$.each(comments,function(i,comment){
$('.newsticker p').animate({"marginLeft":"400px","opacity":".0"}, 600).fadeOut(100);
$('.newsticker').append("<p style='margin-left:400px;opacity:0'>"+comment.message+"</p>");
$('.newsticker p').animate({"marginLeft":"0px","opacity":"1"}, 600);
});
}
function findComments(time){
return $.grep(comments, function(item){
return item.time == time.toFixed();
});
}
HTML
<body>
<div class="newsticker">
</div>
<br />
<br />
<video id="video" controls="controls" autoplay="autoplay" name="media"><source src="http://media.w3.org/2010/05/sintel/trailer.mp4" type="video/mp4"></video>
</body>
CSS
div.newsticker{
border:1px solid #666666;
width:100%;
height:50px;
}
.newsticker p{
height:20px;
width:150px;
float:left;
position:absolute;
}
答案 0 :(得分:3)
在评论中添加一个显示的标志,然后检查,在适当的时候更新。
注意,我还重命名了一些局部变量以防止与父范围的冲突(不会影响代码,但是firebug对于向我展示正确的东西有点搞笑)
<强>更新强>
将其转换为jquery插件,为了清洁,还将检查时间作为@ BMH的答案(因此请随意将其标记为已接受)。如果有多个时间戳,则停止显示所有时间戳的评论,并且如果重新打开以前的时间将重新显示评论:
jQuery.fn.videoComments = function(options){
var defaults = {
"comments" : [
{'time':'10','message':'hello! 10 secs has past'},
{'time':'15','message':'hello! 15 secs has past'},
{'time':'5','message':'hello! 5 secs has past'},
{'time':'20','message':'hello! 20 secs has past'}
],
};
var options = $.extend(defaults, options);
if(!options.commentHolder){
throw "videoComments requires a commentHolder to put the comments in";
}
function setComment(message){
$commentContainer.css({
"marginLeft" : "400px",
"opacity": "0"
}).html(message);
};
var $commentContainer = $("<p></p>");
setComment("");
$(options.commentHolder).append($commentContainer);
function showComments(time){
var foundComments = findComments(time);
$.each(foundComments,function(i,comment){
$commentContainer.animate({"marginLeft":"400px","opacity":".0"}, 600);
setComment(comment.message);
$commentContainer.animate({"marginLeft":"0px","opacity":"1"}, 600);
});
};
function findComments(timeToFind){
var matchingComments = $.grep(options.comments, function(item){
return (item.time == timeToFind);
});
return matchingComments;
};
return $(this).each(function(){
var currentTime = -1;
$(this).on("timeupdate", function(e) {
var localTime = this.currentTime.toFixed();
if(currentTime != localTime){
currentTime = localTime;
showComments(currentTime);
}
});
});
};
$("#video").videoComments({
"commentHolder" : $(".newsticker")
})
答案 1 :(得分:2)
我会将标志置于就绪功能中:
http://jsfiddle.net/b_m_h/9zqhF/11/
jQuery(document).ready(function () {
var fixedTime = 0;
$('#video').on('timeupdate',function(e){
if(this.currentTime.toFixed() != fixedTime){
showComments(fixedTime);
fixedTime = this.currentTime.toFixed()
}
});
});
var comments = [{'time':'10','message':'hello! 10 secs has past'},{'time':'10','message':'hello! part-2 10 secs has past'},{'time':'15','message':'hello! 15 secs has past'},{'time':'5','message':'hello! 5 secs has past'},{'time':'20','message':'hello! 20 secs has past'}];
function showComments(time){
var coms = findComments(time);
if(coms[0]){
$('.newsticker p').animate({"marginLeft":"400px","opacity":".0"}, 600).fadeOut(100);
$('.newsticker').append("<p style='margin-left:400px;opacity:0'>"+coms[0].message+"</p>");
$('.newsticker p').animate({"marginLeft":"0px","opacity":"1"}, 600);
}
}
function findComments(time){
return $.grep(comments, function(item){
return item.time == time;
});
}