Вызов закрытой функции плагина jQuery в setInterval () - PullRequest
0 голосов
/ 22 февраля 2012

Я работаю над плагином jQuery.По сути, мне нужно вызвать частную функцию в моем плагине с помощью setInterval.Похоже, есть много разных способов создания плагина jQuery.Я использую следующий метод, потому что я нахожу его понятным, но если есть работающее решение, которое требует, чтобы я изменил способ, которым я структурирую свой плагин, я открыт ...

Я упростил свой плагин, чтобы сохранить толькопроблемная часть:

(function($){
    $.fn.something = function(options)
    {
        var opts = $.extend({}, $.fn.something.defaults, options);
        return this.each(function()
        {
            var $this = $(this);
            $this.click(function(){
                startSomething($this);
            });
        });
        // Private function
        function startSomething($this)
        {
            // $this is defined
            setInterval(doSomething, 1000);
        };
        // Another private function
        function doSomething($this)
        {
            // $this is undefined
        };
    };
    $.fn.something.defaults = {
        my_option: 'value'
    };
})(jQuery);

Проблема в том, что я хочу вызывать doSomething () каждую секунду.Но мне нужно сохранить ссылку на мой элемент (в переменной $ this).Если я использую setInterval (doSomething), функция вызывается нормально, но у меня нет переменной $ this в качестве параметра.Если я использую setInterval ("doSomething ($ this)"), функция не определена, потому что она пытается найти ее в глобальном контексте.

Так, каково было бы здесь решение для вызова моей частной функции и возможностипередать аргумент?

Спасибо

Ответы [ 3 ]

4 голосов
/ 22 февраля 2012

После еще нескольких проб и ошибок решение оказалось более простым, чем я думал. Использование анонимной функции помогает решить проблему. Вот код оригинального вопроса с некоторыми изменениями:

(function($){
    $.fn.something = function(options)
    {
        var opts = $.extend({}, $.fn.something.defaults, options);
        return this.each(function()
        {
            var $this = $(this);
            $this.click(function(){
                startSomething($this);
            });
        });
        // Private function
        function startSomething($this)
        {
            // $this is defined
            setInterval(function(){
                doSomething($this);
            }, 1000);
        };
        // Another private function
        function doSomething($this)
        {
            // $this is undefined
            $this.toggle();
        };
    };
    $.fn.something.defaults = {
        my_option: 'value'
    };
})(jQuery);

$('#test').something();

(а вот jsFiddle, если вы хотите попробовать: http://jsfiddle.net/p4j6z/)

1 голос
/ 22 февраля 2012

НЕ ДЕЛАЙТЕ ЭТОГО СПОСОБА, ЭТО НЕ БУДЕТ РАБОТАТЬ: :)

    function startSomething($this)
    {
        // $this is defined
        setInterval(doSomething($this), 1000);
    };
    // Another private function
    function doSomething($this)
    {
        return function()
        {
            //do your thang!
        }
    };

Вот код, демонстрирующий, что я имею в виду в своем последнем комментарии:

 var opts = $.extend({}, $.fn.something.defaults, options);
 setInterval(doSomething,1000);
        return this.each(function()
        {
            var $this = $(this);
            $this.click(function(){
                $(this).data('started',true);
            });
        });
        // Another private function
        function doSomething()
        {
            $('sel[data-started="true"]').NowMaybeDoYourThing();
        };

последняя попытка: (погуглил и нашел его в stackoverflow;)

      var self =this;
        return this.each(function()
        {
            var $this = $(this);
            $this.click(function(){
                var it = $(this);
                setInterval(function(){ 
                   self.doSomethingWithIt(it);
                }
            });
        });
        // Another private function
        function doSomethingWithIt(it)
        {
        };
0 голосов
/ 14 июня 2012

Попробуйте это Подытоженный из ответов выше:

setInterval(function(){  someFunction();   }, interval);

* примечание интервал является целочисленным значением для когда вызывается функция someFunction ().

...