Javascript-форум (https://javascript.ru/forum/)
-   jQuery (https://javascript.ru/forum/jquery/)
-   -   Утечка памяти в плагине для jQuery. (https://javascript.ru/forum/jquery/43066-utechka-pamyati-v-plagine-dlya-jquery.html)

TheWanderer 20.11.2013 16:22

Утечка памяти в плагине для jQuery.
 
Здравствуйте.

На днях пришлось написать свой плагин для 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 менял на новую не помогло.


Часовой пояс GMT +3, время: 12:30.