Здравствуйте.
На днях пришлось написать свой плагин для jQuey для отсчета времени.
К сожалению, готовые решения не подошли по тем или иным причинам.
И поэтому пришлось писать свой плагин. И как обычно первый блин вышел комом.
А точнее имеется утечка памяти и только в Chrome это “чудо” хоть как то работает. В остальных браузерах он немного работает, а потом намертво умирает.
html страница где это нам все показывается:
<!DOCTYPE html>
<html>
<head>
<title></title>
<script type="text/javascript" src="./mod/jquery/jquery-1.4.2.js"></script>
<script type="text/javascript" src="js/myCountdownPlugin.js"></script>
</head>
<body>
<script type="text/javascript">
$(document).ready(function(){
$(this).myCountDownPlugin({elClass:'timers'});
})
</script>
<div class="timers" data-time="11 Dec 2013 12:54:00" data-id="1">Счетчик 1</div>
<div class="timers" data-time="29 Nov 2013 11:12:13" data-id="2">Счетчик 2</div>
<div class="timers" data-time="28 Nov 2012 15:15:00" data-id="3">Счетчик 3</div>
</body>
</html>
Вот сам js:
(function(){
var dataElement = new Array();
var methods = {
init:function(settings){
$('.'+settings.elClass).each(function() {
dataElement.push(Array($(this), $(this).attr('data-time')));
})
methods.countDown();
},
countDown:function(){
if(dataElement.length >= 1)
{
for(var i = 0; i < dataElement.length; i++)
{
var end = new Date(dataElement[i][1]);
var now = new Date();
var distance = end.getTime()-now.getTime();
if(distance > 0)
{
var days = Math.floor(distance/86400000);
var hour = Math.floor((distance%86400000)/3600000);
var minute = Math.floor((distance%3600000)/60000);
var second = Math.floor((distance%60000)/1000);
var mseconds = Math.floor(distance%1000);
dataElement[i][0].text('Дней: '+days+' Часов:'+hour+' Минуты:'+minute+' Секунды:'+second+' Милесекунды: '+mseconds);
}
else if(distance < 0)
{
methods.timeIsUp(i);
}
}
setInterval(function(){methods.countDown()}, 150);
}
},
timeIsUp:function(param){
dataElement[param][0].text('Время вышло');
dataElement.splice(param, 1);
}
};
$.fn.myCountDownPlugin = function(options, method) {
var settings = $.extend({
'time' : null,
'id': null,
'elClass': null
}, options);
if ( methods[method] ) {
return methods[ method ].apply( this, Array.prototype.slice.call( arguments, 1 ));
} else if ( typeof method === 'object' || ! method ) {
return methods.init(settings);
} else {
$.error( 'Метод "' + method + '" не найден в плагине jQuery.myCountdownPlugin' );
}
}
})(jQuery);
Я даже подозреваю, что утечка происходит между 14-35 строкой. И скорее всего наверно утечка происходит на 35 стр.
Только не могу понять, как исправить утечку. Не подскажите люди добрые?
P.S: библиотеку jquery менял на новую не помогло.