2

ハイチャートで AJAX クエリを介して動的にチャートを更新しようとしています。現在、新しいグラフの JSON を返すサーバーがあり、それを parseJSON を使用して解析しています。これはすべて問題ありませんが、1 つだけ例外があります。ハイチャート コードの通常の形式は真の JSON ではないため、ファイル内のチャートの形式が異なります。(たとえば、適切な JSON では、type: 'bar' を "type": "bar" にする必要があります。)

メインページのコードは次のとおりです。

<script type='text/javascript' src='//code.jquery.com/jquery-1.9.1.js'></script>
<script src="http://code.highcharts.com/highcharts.js"></script>
<script src="http://code.highcharts.com/modules/exporting.js"></script>

<div id="container" style="min-width: 310px; height: 400px; margin: 0 auto"></div>

<script>
$(function () {
        $('#container').highcharts({
            title: {
                text: 'Monthly Average Temperature',
                x: -20,
                style: {
                    color: 'rgb(103,103,103)',
                    fontFamily: '"Trebuchet MS", "Lucida Grande", "Lucida Sans Unicode", "Lucida Sans", Tahoma, sans-serif'
                }
            },
            subtitle: {
                text: 'Source: WorldClimate.com',
                x: -20,
                style: {
                    color: 'rgb(103,103,103)'
                }
            },
            xAxis: {
                categories: ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun',
                    'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec']
            },
            yAxis: {
                title: {
                    text: 'Temperature (C)',
                    style: {
                        color: 'rgb(103,103,103)'
                    }
                },
                plotLines: [{
                    value: 0,
                    width: 1,
                    color: '#808080'
                }]
            },
            legend: {
                layout: 'vertical',
                align: 'right',
                verticalAlign: 'middle',
                borderWidth: 0
            },
            series: [{
                name: 'Tokyo',
                color: 'rgb(62,144,200)',
                data: [7.0, 6.9, 9.5, 14.5, 18.2, 21.5, 25.2, 26.5, 23.3, 18.3, 13.9, 9.6],
                point: {
                    events: {
                        click: function() {
                            $.get('thetest/test.php', function (data) {
                                var temp=jQuery.parseJSON(data);
                                $('#container').highcharts(temp);
                            })
                        }
                    }
                }
            }, {
                name: 'New York',
                color: 'rgb(128,183,101)',
                data: [-0.2, 0.8, 5.7, 11.3, 17.0, 22.0, 24.8, 24.1, 20.1, 14.1, 8.6, 2.5]
            }, {
                name: 'Berlin',
                color: 'rgb(145,111,79)',
                data: [-0.9, 0.6, 3.5, 8.4, 13.5, 17.0, 18.6, 17.9, 14.3, 9.0, 3.9, 1.0]
            }, {
                name: 'London',
                color: 'rgb(207,186,132)',
                data: [3.9, 4.2, 5.7, 8.5, 11.9, 15.2, 17.0, 16.6, 14.2, 10.3, 6.6, 4.8]
            }, {
                name: 'Last One',
                color: 'rgb(70,95,119)',
                data: [13.9, 14.2, 15.7, 18.5, 21.9, 25.2, 27.0, 26.6, 24.2, 20.3, 16.6, 14.8]
            }]
        });
    });
</script>

返される JSON は次のとおりです。

{
    "chart": {
        "type": "bar"
    },
    "title": {
        "text": "Historic World Population by Region"
    },
    "subtitle": {
        "text": "Source: Wikipedia.org"
    },
    "xAxis": {
        "categories": ["Africa", "America", "Asia", "Europe", "Oceania"],
        "title": {
            "text": null
        }
    },
    "yAxis": {
        "min": 0,
        "title": {
            "text": "Population (millions)",
            "align": "high"
        },
        "labels": {
            "overflow": "justify"
        }
    },
    "tooltip": {
        "valueSuffix": " millions"
    },
    "plotOptions": {
        "bar": {
            "dataLabels": {
                "enabled": true
            }
        }
    },
    "legend": {
        "layout": "vertical",
        "align": "right",
        "verticalAlign": "top",
        "x": -40,
        "y": 100,
        "floating": true,
        "borderWidth": 1,
        "backgroundColor": "#FFFFFF",
        "shadow": true
    },
    "credits": {
        "enabled": false
    },
    "series": [{
        "name": "Year 1800",
        "data": [107, 31, 635, 203, 2]
    }, {
        "name": "Year 1900",
        "data": [133, 156, 947, 408, 6]
    }, {
        "name": "Year 2008",
        "data": [973, 914, 4054, 732, 34]
    }]
}

もちろん、これは完全に機能します...しかし、JSONではなく標準の「ハイチャート」形式でtest.phpから結果を返す方法はありますか?

4

4 に答える 4

2

別のアプローチを提案します。

Reimius が言ったように、Highcharts はチャート設定に Javascript オブジェクトを使用します。構成は、関数を含まない非常に基本的な Javascript オブジェクトにすることができます。その場合、それを json として解析し、Ajax 呼び出しを介して取得するクライアント側で使用できます。しかし、これは本当に制限的だと思います。

私は過去に、サーバー側で生成された Javascript 構成ファイルを他の Javascript ファイルと同じように html に含めることで、この問題を克服しました。最終的には、これがブラウザ内で Javascript コードにアクセスして実行する方法です。

たとえば、ページに選択した都市の気温をグラフとして表示したいとします。次のように構成を取得するためのエンドポイントがあります。

<server-address>/temperature/<id>

このエンドポイントから取得するのは、次のようなゲッター関数です。

function getChartConfig() {
  return {
        title: {
            text: 'Monthly Average Temperature',
            x: -20,
            style: {
                color: 'rgb(103,103,103)',
                fontFamily: '"Trebuchet MS", "Lucida Grande", "Lucida Sans Unicode", "Lucida Sans", Tahoma, sans-serif'
            }
        },
        subtitle: {
            text: 'Source: WorldClimate.com',
            x: -20,
            style: {
                color: 'rgb(103,103,103)'
            }
        },
        xAxis: {
            categories: ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun',
                'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec']
        },
        yAxis: {
            title: {
                text: 'Temperature (C)',
                style: {
                    color: 'rgb(103,103,103)'
                }
            },
            plotLines: [{
                value: 0,
                width: 1,
                color: '#808080'
            }]
        },
        legend: {
            layout: 'vertical',
            align: 'right',
            verticalAlign: 'middle',
            borderWidth: 0
        },
        series: [{
            name: 'Tokyo',
            color: 'rgb(62,144,200)',
            data: [7.0, 6.9, 9.5, 14.5, 18.2, 21.5, 25.2, 26.5, 23.3, 18.3, 13.9, 9.6],
            point: {
                events: {
                    click: function() {
                        $.get('thetest/test.php', function (data) {
                            var temp=jQuery.parseJSON(data);
                            $('#container').highcharts(temp);
                        })
                    }
                }
            }
        }, {
            name: 'New York',
            color: 'rgb(128,183,101)',
            data: [-0.2, 0.8, 5.7, 11.3, 17.0, 22.0, 24.8, 24.1, 20.1, 14.1, 8.6, 2.5]
        }, {
            name: 'Berlin',
            color: 'rgb(145,111,79)',
            data: [-0.9, 0.6, 3.5, 8.4, 13.5, 17.0, 18.6, 17.9, 14.3, 9.0, 3.9, 1.0]
        }, {
            name: 'London',
            color: 'rgb(207,186,132)',
            data: [3.9, 4.2, 5.7, 8.5, 11.9, 15.2, 17.0, 16.6, 14.2, 10.3, 6.6, 4.8]
        }, {
            name: 'Last One',
            color: 'rgb(70,95,119)',
            data: [13.9, 14.2, 15.7, 18.5, 21.9, 25.2, 27.0, 26.6, 24.2, 20.3, 16.6, 14.8]
        }]
    });
}

}

次に、次のようにhtmlソースを作成できます。

<script type='text/javascript' src='//code.jquery.com/jquery-1.9.1.js'></script>
<script src="http://code.highcharts.com/highcharts.js"></script>
<script src="http://code.highcharts.com/modules/exporting.js"></script>

<!-- Notice Highcharts configuration is included as a javascript file -->
<script type='text/javascript' src='<server-address>/temperature/1'></script>   

<div id="container" style="min-width: 310px; height: 400px; margin: 0 auto"></div>

<script>
$(function () {
    $('#container').highcharts(getChartConfig());
</script>

静的な方法で含める必要はありません。JQuery getScript 関数または別の方法を使用して、Javascript を動的にロードできます。

これがあなたのニーズに合っているかどうかはわかりませんが、アイデアはわかります。ロジックをニーズに適用できると確信しています。これは過去に私のために働いていました。

于 2015-10-05T12:26:43.627 に答える
2

ここには誤解があります... Highchartsには、質問で求めている意味で特別に設計された構成「フォーマット」がありません。Highcharts は Javascript 構成オブジェクトを使用しますが、これは JSON とは異なります。

「すべての正方形は長方形ですが、すべての長方形は正方形ではありません」ということわざを聞いたことがありますか? このことわざは、すべての JSON を Javascript に解釈できるという点で似ていますが、すべての Javascript を JSON に解釈できるわけではありません。これは、JSON を Javascript のサブセットとして扱うことができること、つまり JavaScript (特に Javascript オブジェクト) に解釈できることを意味するため、重要です。次に、サーバーから JSON を返し、それを JavaScript オブジェクトに変換して、anychart 構成オブジェクトとして使用することができます。

これが関連する理由は、サーバーから返されるのは、JSON ではなく Javascript オブジェクト定義 (Highcharts で実際に使用されるもの) であるように見えるためです。問題は、テキストを Javascript に変換して実行する必要があることです。この状況には 2 つの解決策があり、一方は他方よりもはるかに優れています。

  1. 現在 Javascript オブジェクトをテキストとして返しているため、そのオブジェクトで eval() 関数を使用できます。これは悪い決断です。「eval は悪」ということわざがあります。この理由については、オンラインで調べることができますが、問題なくこのルートを使用できる場合があります。

  2. もう 1 つのオプションは、最初にハイチャート構成を保存するとき、またはそれを php ファイルから返すときに、構文が JSON 形式に準拠していることを確認することです。あなたの例では、これはプログラムの動作に何の違いももたらさないように見えますが、実装が難しくなるだけです。これは、この問題を修正する正しい方法です。

于 2013-10-03T13:58:04.073 に答える
0

はい、JSON を取得する必要があります。JSON は、php で json_encode() 関数によって返されます。

于 2013-10-03T13:02:42.077 に答える
0

私があなたを正しく理解していれば、あなたがする必要があるのは、JSON 文字列をオブジェクトに解析することだけです。

var json = '{ "chart": { "type": "bar" } }',
    parsed = JSON.parse(json);

$('#container').highcharts(parsed);

http://jsfiddle.net/3QG6Q/

于 2013-10-03T12:48:10.290 に答える