1

jqplot を使用して、ページに一度に 1 つずつ表示したい 4 つのグラフを描画しています。つまり、選択するボタンを使用してそれらを切り替えることができます。ページの読み込みに関するすべてのグラフのすべてのデータを照会しました。非表示の div に 3 つの代替グラフを生成するデータを保存し、必要に応じてそれらを交換したいと考えています。

たとえば、id='chartdiv' でチャート div のコンテンツを切り替えるために使用したい id='weight_chart' のボタンがあります。したがって、.js に次の関数があります。

    $('#weight_chart').click(関数(イベント) {

       $('#chartdiv').html(""); // div をクリアします         
       graph_data = $('#weight-graph-data').html();
       $.jqplot('chartdiv', graph_data);

    });

パラメータはすべて、非表示の div id='weight-graph-data' に 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}}}

...そしてそれを関数に渡します。

私はクライアント側の初心者なので、辛抱してください。よろしくお願いします。

.................. アップデート

最初のフィードバックに従って、JSON をいじってパラメーターを JavaScript 変数に入れてみましたが、変数全体に区切り文字などが含まれているため、機能していないようです。

そのため、ajax を介して DB を動的に再クエリすることを意図して、まったく異なるアプローチを試みました。値のペア (2 番目の jqPlot パラメーター) を正しく生成し、残りをハードコーディングしながらその部分を挿入しようとしています。しかし、それでもうまくいきません。以下のコードを参照してください。「results_list」の値をテストしましたが、良好です。関数呼び出しの場所の値を単純に置き換えると、正常に機能してグラフが生成されますが、示されているようにコーディングされているグラフは空白です。きっと、この種のことを処理する方法があるに違いありません。再度、感謝します。

    $('.btn-graph').click(関数(イベント) {

                var member_id = $('#member_id').val();
                var dataString = 'graph_type=' + this.id + '&member_id=' + member_id;
                //アラート(データ文字列);

                    //アラート (dataString); false を返す;  
                    $.ajax({  
                      タイプ: "ポスト",  
                      URL: "/ajax_handler/graph_data.php",  
                      データ: データ文字列、
                      データ型: 'json',
                      成功: 関数 (データ) {
                        //アラート(データ);
                        var results_list = "";
                        $.each(データ、関数(i、結果){

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

                      }  
                    });
          });

................... 更新 2

beetroot-beetroot に感謝します - あなたのアップデートを見る直前に入手しました。あなたの方法もうまくいくと思いますが、現在機能している私のソリューションは次のとおりです。

ここで dee38 に従って - jqPlot の JSON - 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は...

$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));
4

2 に答える 2

1

Will Domaine の提案は良さそうに聞こえますが、3 つのグラフ データ セットを DOM の文字列としてではなく、JavaScript 変数として保存することもできます。

例えば、

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を使用しましたが、あなたの3つは異なります)。

次に、次のようにボタンを作成します。

<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'))]);
});

編集 ....

データをさらに詳しく見ると、各データセットが 1 つではなく 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);
});
于 2012-05-01T01:20:23.683 に答える
1

JSON 文字列が要素の HTML で表現されているだけの場合は、おそらく jQuery の parseJSON 関数を使用する必要があります。

graph_data = $.parseJSON($('#weight-graph-data').html());
于 2012-05-01T00:20:40.653 に答える