2011-09-11 17 views
3

JQuery UIのスライダのslidechangeイベントで複数のスライダを同時に更新しようとしています。JQuery UIリアクティブスライダ(スライダの変更時に同時に複数のスライダを更新する)

私は、次のようなコードを持っている:

$(function() { 
    var totalSliders = 0; 
    $(".slider").each(function() { 
     var value = parseInt($(this).text(), 10); 
     $(this).empty().slider({ 
      value: value, 
      range: "min", 
      animate: true, 
      orientation: "horizontal", 
      slide: updateSliders, 
      change: updateSliders 
     }); 
     totalSliders++; 
    }); 

    function updateSliders(event, ui) { 
     var activeSlider = this; 
     $(".slider").slider("value", $(activeSlider).slider("value")); 
    }; 

    $("#update").click(function() { 
     $(".slider").slider("value", 10); 
     return false; 
    }); 
}); 

これはスライダーにsliderのクラスですべてを回すことに成功しました。私は、スライダーを動かすたびしかし、私は次のエラーを取得する:updateSliders(event, ui)の次の実装が正常に動作します

function updateSliders(event, ui) { 
    var activeSlider = this; 
    $(".slider").not(activeSlider).slider("value", $(activeSlider).slider("value")); 
}; 

Uncaught RangeError: Maximum call stack size exceeded

は、私はまた、updateSlidersの次の実装を試してみました

function updateSliders(event, ui) { 
    console.log($(this).slider("value")); 
}; 

質問:
最大呼び出しスタックサイズのエラー?私はすべてのスライダを同時に更新したい。

編集:
それが違いを作る場合、私は唯一、sliderのクラスにページ上に3つの要素を持っています。

答えて

4

すると、そのハンドラを変更してみてください。

function updateSliders(event, ui) { 
    if (!event.originalEvent) return; 
    var activeSlider = this; 
    $(".slider").slider("value", $(activeSlider).slider("value")); 
}; 

今では、あなたのコードといくつかの問題を引き起こす可能性があります、私は推測するが、ヌルのために「originalEvent」プロパティをチェックして、あなたの「変更」を伝えることができますハンドラは、プログラムによる更新のために呼び出されています。それは、あなたがやっているすべてのアップデートをその機能から守って、さらに大きな変化を引き起こすのを防ぎます。

Hereはjsfiddleです。

+0

非常に良い!私は '$(activeSlider).slider(" value ")'を 'ui.value'に最適化できることも発見しました。 – user1834646

+0

あなたが気にしないなら、 '!event.originalEvent'を説明できますか?直感的ではないように思えます。「これが元のイベントでなければ、復帰します。 – user1834646

+0

jQueryから取得する「イベント」オブジェクトは、イベントが発生したときにブラウザが作成する「実際の」イベントオブジェクトではありません。それはラッパーです。そのラッパーオブジェクトの "originalEvent"プロパティは、ネイティブブラウザイベントへのアクセスを提供します。そのようなネイティブイベントがない場合は、スライダーへのプログラムによる更新(つまり、JavaScriptでスライダーの「値」を設定する)のために、「変更」ハンドラーが呼び出されていると推測できます。理にかなっている? – Pointy

関連する問題