2012-05-01 13 views
1

jqplotを使用して、ページ上に一度に1つずつ表示する4つのチャートを描画します。私は、ページの読み込み時にすべてのグラフのすべてのデータを照会しました。私は隠しdivに3つの代替グラフを生成するためにデータを保存し、必要に応じてそれらを交換したい。非表示のページコンテンツに基づいてパラメータをjQuery関数に渡すことができません

たとえば、id = 'chartdiv'のグラフdiv内のコンテンツを切り替えるために使用するid = 'weight_chart'のボタンがあります。だから、私は.jsファイルに以下の機能を持っている:

 

    $('#weight_chart').click(function(event) { 

     $('#chartdiv').html(""); // clears the div   
     graph_data = $('#weight-graph-data').html(); 
     $.jqplot('chartdiv', graph_data); 

    }); 

のパラメータは、すべての隠されたのdivのid =「体重グラフ・データ」にhtmlとして保存されます。

今、私はそれがうまくいかない理由を理解しています。文字列変数を使用するような私のパラメータを代入しようとするのが問題です。私はちょうど...ハードコード内の代わりに

 

    $.jqplot('chartdiv', [[['2012-03-30',30.80],['2012-03-31',30.59]]],{ title:'Body Mass Index',axes:{xaxis:{renderer:$.jqplot.DateAxisRenderer}}}); 

...

 

    $.jqplot('chartdiv', graph_data); 

を実際のパラメータに置き換えた場合...それが正常に動作します。

イベントによってトリガーされたときに、後でページの読み込み時に計算したパラメータをどのように渡しますか。この段階で別のデータベースを呼び出す必要はありません。私はちょうど

すなわち

[[['2012-03-30',30.80],['2012-03-31',30.59]]],{ title:'Body Mass Index',axes:{xaxis:{renderer:$.jqplot.DateAxisRenderer}}} 

...私はすでに収集したパラメータの一部を取り...そして関数にそれを渡したいです。

私はクライアント側で初心者ですので、plsは忍耐強くてください。あなたの助けを前にありがとう。私はJSONで遊んとJavaScriptの変数にパラメータを入れてみました初期のフィードバック後

.................. UPDATE

が、変数のため区切り記号などが全体として含まれているため、動作していないようです。

私は、DBをajax経由で動的に再クエリーするという意図で全く異なるアプローチを試みました。私は正しく値のペア(2番目のjqPlotパラメータ)を正しく生成し、残りをハードコーディングしながらそのピースを挿入しようとしています。しかし、それはまだ動作しません。以下のコードをご覧ください。私は 'results_list'の値をテストしましたが、それは良いです。単に関数呼び出しの場所の値を代入すれば、それはうまく動作し、グラフを生成しますが、グラフが空白のようにコード化されています。確かにこのようなことを処理する方法がなければなりません。再度、感謝します。

 
    $('.btn-graph').click(function(event) { 

       var member_id = $('#member_id').val(); 
       var dataString = 'graph_type=' + this.id + '&member_id=' + member_id; 
       //alert(dataString); 

        //alert (dataString);return false; 
        $.ajax({ 
         type: "POST", 
         url: "/ajax_handler/graph_data.php", 
         data: dataString, 
         dataType: 'json', 
         success: function(data) { 
         //alert(data); 
         var results_list = ""; 
         $.each(data, function(i,result){ 

          results_list = results_list + "['" + result.date + "'," + result.bmi + "],"; 

         }); 
         results_list = results_list.slice(0, -1) 
         $('#chartdiv').html(""); 

         $.jqplot('chartdiv',[[ results_list ]],{ title:'My Weight',axes:{xaxis:{renderer:$.jqplot.DateAxisRenderer}}}); 

         } 
        }); 
      }); 

.................... UPDATE 2

ありがとうビート-ビート - 私はあなたの更新を見て前に、私はちょうどそれを得ました。私はあなたのやり方もうまくいくと思いますが、今ここで働いている私の解決策があります:

ここでdee38として - JSON for jqPlot - PHPで名前と値のペアを作成しなければなりませんでした。次に、小さな配列を1つの大きな配列に結合します。 json_encodeとajaxを介して返す。その後、ajaxの成功関数でeval(data)を使用すると、すべて動作します。ここでは、最終的なjqueryの機能は次のとおりです。

$('.btn-graph').click(function(event) { 

      var member_id = $('#member_id').val(); 
      var dataString = 'graph_type=' + this.id + '&member_id=' + member_id; 
      //alert(dataString); 

       //alert (dataString);return false; 
       $.ajax({ 
        type: "POST", 
        url: "/ajax_handler/graph_data.php", 
        data: dataString, 
        success: function(data) { 

        $('#chartdiv').html(""); 

        $.jqplot('chartdiv',eval(data),{ title:'BMI',axes:{xaxis:{renderer:$.jqplot.DateAxisRenderer}}}); 

        } 
       }); 
    }); 

とバックエンドでの私のPHPは...

あなたのJSON文字列がちょうどあなたの要素のHTMLで表現されている場合は、おそらくjQueryのparseJSON機能を使用する必要が
$sql = mysql_query("SELECT * FROM stats WHERE id = '".$mid."'"); 


//Create an array with the results 
$pairs=array(); 
while($v = mysql_fetch_object($sql)){ 
    $pairs[$v->date] = (float) $v->bmi; 
} 

$result = array(); 

foreach ($pairs as $label => $value) { 
    $result[] = array($label,$value); // make a "small" array for each pair 
} 

echo json_encode(array($result)); 
+0

、私の編集を参照してください。 –

+0

あなたの更新2では:[eval'を使用しない](https://developer.mozilla.org/ja/JavaScript/Reference/Global_Objects/eval#Don.27t_use_eval.21)代わりに '$ .parseJSON'を使用してください。さらに良いことに、 'dataType: 'json''を' $ .ajax'に渡して、jQueryで自動的に行います。 – bfavaretto

+0

私はもともとdataType jsonを渡そうとしていましたが、jqPlotはそこから何をしてもデータを処理できないようです。今私は自分のソリューションに記述されているようにデータを渡し、eval(data)を使うだけで完璧に動作します。手伝ってくれてありがとう。 – flamegri11ed

答えて

1

graph_data = $.parseJSON($('#weight-graph-data').html()); 
1

ウィルドメーヌの提案は良い音が、代替ではJavaScript VARSとしてではなく、DOM内の文字列としてグラフデータの3セットを格納することです。例えば

var graphData = [ 
    [[['2012-03-30',30.80],['2012-03-31',30.59]]],{ title:'Body Mass Index',axes:{xaxis:{renderer:$.jqplot.DateAxisRenderer}}}, 
    [[['2012-03-30',30.80],['2012-03-31',30.59]]],{ title:'Body Mass Index',axes:{xaxis:{renderer:$.jqplot.DateAxisRenderer}}}, 
    [[['2012-03-30',30.80],['2012-03-31',30.59]]],{ title:'Body Mass Index',axes:{xaxis:{renderer:$.jqplot.DateAxisRenderer}}}, 
]; 

(私は同じデータX3を使用していたが、あなたの三つの異なるものになります)。

次のように次に、あなたのボタンを構築:

<button class="weightChart" data-index="0">Weight Chart 1</button> 
<button class="weightChart" data-index="1">Weight Chart 2</button> 
<button class="weightChart" data-index="2">Weight Chart 3</button> 

を次にとボタンをアニメーション化:私は見

$('.weightChart').click(function(event) { 
    $('#chartdiv').empty(); 
    $.jqplot('chartdiv', graphData[Number($(this).attr('data-index'))]); 
}); 

編集....詳細にデータを見てみると

、各データセットは2つの変数から構成されています。これはおそらく何をしようとしているのですか?

私のjsのアプローチは改訂:

var graphData = [ 
    { 
     coords: [[['2012-03-30',30.80],['2012-03-31',30.59]]], 
     options: { title:'Body Mass Index',axes:{xaxis:{renderer:$.jqplot.DateAxisRenderer}}} 
    }, 
    { 
     coords: [[['2012-03-30',30.80],['2012-03-31',30.59]]], 
     options: { title:'Body Mass Index',axes:{xaxis:{renderer:$.jqplot.DateAxisRenderer}}} 
    }, 
    { 
     coords: [[['2012-03-30',30.80],['2012-03-31',30.59]]], 
     options: { title:'Body Mass Index',axes:{xaxis:{renderer:$.jqplot.DateAxisRenderer}}} 
    } 
]; 

(ここでも、同じデータX3)

今でボタンをアニメーション化:オプションは常に同じであれば、この後、

$('.weightChart').click(function(event) { 
    $('#chartdiv').empty(); 
    var data = graphData[Number($(this).attr('data-index'))]; 
    $.jqplot('chartdiv', data.coords, data.options); 
}); 

以下のように単純化する。

var graphOptions = { title:'Body Mass Index',axes:{xaxis:{renderer:$.jqplot.DateAxisRenderer}}}; 
var graphData = [ 
    [[['2012-03-30',30.80],['2012-03-31',30.59]]], 
    [[['2012-03-30',30.80],['2012-03-31',30.59]]], 
    [[['2012-03-30',30.80],['2012-03-31',30.59]]] 
]; 

:あなたの更新に対応して

$('.weightChart').click(function(event) { 
    $('#chartdiv').empty(); 
    var data = graphData[Number($(this).attr('data-index'))]; 
    $.jqplot('chartdiv', data, graphOptions); 
}); 
関連する問題