2011-06-23 11 views
1

ループのためにsetInterval()を使用してjQueryプラグインとしていくつかのカスタムアニメーション関数を書きました。複数のJavascript setInterval関数を同じページでうまく組み合わせるにはどうすればよいですか?

機能はそれ自身で正常に動作するようですが、同じページに複数の機能を組み込もうとすると、タイミングとエフェクトがすべて乱れて正しくレンダリングされません。

私はStackOverflowの上の周りにいくつかのスカウトが行われ、Googleと私が集まることができるものから問題があるしていること、私はページ上の複数あるwindowオブジェクトなどの「グローバル」メソッド/プロパティとしてsetInterval行為彼ら最終的にお互いを上書きする!

これは間違いありませんか?そしてもしそうなら、解決策は何ですか?独自のインターバル機能を管理するためにjQuery /プラグインは何をしていますか?

「ローカル」setIntervalを各プラグインオブジェクトの一意のプロパティとして設定できるかどうかは疑問でしたか?

- OR -

私は1回のグローバルsetInterval呼び出しでそれらすべてを両立させるために、様々な異なるプラグイン/機能からの複数のアニメーションのコールを管理するための関数を作成する必要がある場合 - しかし、私は何をするか見当がつかないこの!

誰でも助けてください。

----編集----

(function($){ 
    $.fn.scroller = function(options) { 

     var defaults = { 
      direction: 'left', 
      distance: '', 
      duration: 2000, 
      interval: 2000, 
      type: 'linear', 
      startPos: '0' 
     }; 
     var options = $.extend(defaults, options); 

     return this.each(function() { 
      parent = $(this).children('.scroller'); 
      $this = parent.children().first(); 

//   console.log(parent); 
//   console.log($this); 

      var o = options; 
      var m = ''; 

      if(o.direction === 'left') m = 'marginLeft'; 
      if(o.direction === 'right') m = 'marginRight'; 
      if(o.direction === 'up') m = 'marginTop'; 
      if(o.direction === 'down') m = 'marginBottom'; 

//   console.log('Distance: ' + o.distance); 
//   console.log('Duration: ' + o.duration); 
//   console.log('Type: ' + o.type); 
//   console.log('Start Pos: ' + o.startPos); 
//   console.log('Interval: ' + o.interval); 

      setInterval(function(){ 
       $this.animate({ 
        m : o.distance 
       }, 
       o.duration, 
       o.type, 
       function() { // OnComplete 
        $this.stop().css(m, o.startPos).appendTo(parent); 
       }); 
      }, o.duration+o.interval); 
     }); 
    }; 
})(jQuery); 
+1

なぜjqueryの内部タイミングを使用しないのですか? –

+1

好きなだけ間隔を設定できます。競合が発生するのは、a)インターバルコールバックでグローバル変数を使用するか、またはb)コールバックのパフォーマンスが悪いためです。 –

+1

@DanielAWhite jQueryを使用してsetTimeoutをエミュレートすることが過剰です。 – Raynos

答えて

1

更新

私は問題を見ると思います。 $ thisはグローバル変数として定義します。したがって、setIntervalの呼び出しはすべて同じ$ this変数を使用します。試してくださいvar $this = ...parentと同じです。また、$this.animateへのコールバックでは、 "this"はアニメーション化されたdom要素を参照する必要があるので、$(this)を実行してjQueryオブジェクトを取得できます。


あなたの問題は、あなたがsetIntervalでコンテキストが緩んでいる可能性があります。 thisオブジェクトが期待どおりに表示されない場合があります。変数が存在すると予想される場合(setIntervalを呼び出す場所の近くに定義されているため)、おそらくそうではありません。

クロージャが役に立ちます。

var myVar = 5; 

ではなく

:あなたのsetIntervalコールバックではなく、グローバルなものでローカルに定義された変数を使用していることを確認してみてください、また

setInterval(function(){ 
    //code here 
}); 

よりもむしろ

setInterval(myPreDefinedFunction); 

をお試しください

myVar = 5; 

if 2番目の方法を使用した場合、コールバック間で変数を共有することになります。

+0

ヴァーズを正しく定義することについての良い点は、よかった。それはいくつかの問題を引き起こしているに違いありません。 jqueryのDOMオブジェクトリファレンスについての2番目の点は私のためには機能しません - 私はそれを持っている方法で動作するようです! – Chris

+0

コールバックで 'console.log(this);'をやってみましたか?それは、アニメートされたもののDOM要素でなければなりません。明確にするために、私はあなたが$ OnIntervalコールバックの最初の部分ではなく、コメント '// OnComplete'の直後にアニメーションコールバックでこれを使用するビットについて話しています(" this "はそこを参照します)。 – Spycho

0

)のsetIntervalがグローバルであることは事実ですが、のsetIntervalへの各呼び出しは(すなわちてclearIntervalのために、あなたはそれを参照するために使用できる一意のIDを返します。 。独自の間隔を必要とする各プラグインには、それを参照するためのIDを含む独自の変数を割り当てる必要があります。おそらく、あなたはこれらを個別にどのように管理しているのかが分かります。私たちに見せるためのコードはありますか?

+0

私はポストをいくつかのコードで更新しました。私はjqueryプラグインでの最初の試行で、私は簡単に見逃してしまいました。 - しかし、あなたの点に感謝、私はそれを見てみましょう。 – Chris

関連する問題