2012-02-21 91 views
0

我正在研究一个jQuery插件。基本上,我需要做的是用setInterval在我的插件中调用一个私有函数。看起来有很多不同的方法来创建一个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)”),则该函数未定义,因为它试图在全局上下文中找到它。

那么,什么将是解决办法在这里打电话给我私人的功能,并能够将参数传递给它?

感谢

回答

4

经过一些更多的尝试和错误之后,解决方案比我想象的更简单。使用匿名函数有助于解决问题。这里是原来的问题了一些小改动代码:

(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

不做这样说,这不会工作::)

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(); 
     }; 

最后一次尝试:(GOOGLE了它,并发现它在计算器;)

 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

即使没有jQuery和插件,你不能把你的函数引用的setInterval的方式。这里有一个jsFiddle向你展示:http://jsfiddle.net/ZZXm2/没有()或者字符串“”是两种可能性。另一个想法是 – Gabriel 2012-02-21 22:37:14

+0

。设置这个数据(),不通过它,并再次选择间隔方法 – mindandmedia 2012-02-21 22:44:59

+0

然后,我将无法知道在哪个元素寻找我的数据(),这正是我需要通过$这首先...;) – Gabriel 2012-02-21 22:49:23

0

尝试从上述回答了这个总结:

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

*注意间隔是调用函数someFunction()时的整数值。