Доступность переменной плагина jQuery - PullRequest
1 голос
/ 10 марта 2012

Сегодня я впервые столкнулся с проблемой, когда переменные смешивались с несколькими экземплярами плагинов jQuery.

Простую версию моего плагина можно посмотреть здесь: http://jsfiddle.net/jydzB/2/

Я хочу иметь возможность просто создать таймер в плагине и получить доступ к переменной «myTimer» в другом методе в плагине.В этом случае уничтожить его.Тем не менее, я подумал наверняка, что создание переменных, как я сделал ниже с "myTimer", сделал эту переменную доступной только в этом классе / плагине?Я ошибся?Как использовать переменные в плагине?Я знаю, что могу хранить их в $ obj.data ('', ''), но это не имеет смысла делать, когда вы можете просто сохранить его в переменной.

Вы увидите это, когдаВы запускаете скрипт jsFiddle, он не разрушает таймер.

Простой HTML

Write a line every five seconds... destroy it after 10:<br />
<hr />
<div id='myDiv' style='border: solid 1px #000;float:left;'></div>
<div id='myDiv2' style='border: solid 1px #f00;float:right;'></div>

Плагин jQuery

if (jQuery) (
    function (jQuery) {        
        var myTimer;            
        var methods = {
            init: function () {
                return this.each(function () {
                    var $obj = $(this);
                    var data = $obj.data('init');
                    if (!data) {
                        myTimer = setInterval(function(){
                            writeLine($obj)
                        }, 1000);
                        $obj.data('init', true);
                        $obj.data('cnt',0);
                    }
                });        
            },
            destroy: function () {
                var $obj = $(this);
                $obj.data('init', false);
                clearInterval(myTimer);
                $obj.append("Destroyed!");
            }
        };        
        $.fn.timeIt = function (method) {                   
            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.timeIt');
            }
        };
    }
)(jQuery);

$('#myDiv').timeIt();
$('#myDiv2').timeIt();

function writeLine(cObj) {
    cObj.data('cnt',cObj.data('cnt')+1);
    cObj.append("Another line written...(" + cObj.data('cnt') + ")<Br />");    
    if(cObj.data('cnt')>=10){
        cObj.timeIt('destroy');
    }        
}

1 Ответ

1 голос
/ 10 марта 2012

Я думаю, что использование переменной области действия на этом уровне хорошо, за исключением того факта, что вы присваиваете значение myTimer внутри вашего each (каждый раз разный контекст). Если вы удалите второй провод ($('#myDiv2').timeIt();), он работает как чемпион. Хранение переменной с экземпляром, вероятно, было бы более уместным.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...