1

コンピューター上の JSON ファイルからデータをロードしたいと考えています。HTTP サーバーがないと読めないことがわかっているので、入力フィールドを作成したいと思います。ファイルは正常に読み取られましたが、バブル チャートを作成する関数にデータを送信しても、何も作成されません。ローカルからロードすると機能します(HTTPサーバーを実行します)。これはコードです:

<script type="text/javascript">
    var json;
    function handleFileSelect(evt) {
        var files = evt.target.files;
    }
    document.getElementById('files').addEventListener('change', handleFileSelect, false);
    function handleFileSelect(evt) {
        var files = evt.target.files;
        var output = [];
        for (var i = 0, f; f = files[i]; i++) {
            var reader = new FileReader();
            reader.onload = (function (theFile) {
                return function (e) {
                        json = JSON.parse(e.target.result);
                        alert('json global var has been set to parsed json of this file here it is unevaled = \n' + JSON.stringify(json));
                        initData(JSON.stringify(json)); // Doesn't works
                        //initData("data.json"); // Works
                }
            })(f);
            reader.readAsText(f);
        }
    }
    document.getElementById('files').addEventListener('change', handleFileSelect, false);

</script>


 function initData(data){
          d3.json(data, function(error, root) {
        if (error) throw error;

        var node = svg.selectAll(".node")
                .data(bubble.nodes(classes(root))
// .....

これは Plunker のオンライン例です: https://plnkr.co/edit/T8WFvj0qtMW5mFK6gOjO?p=preview

ありがとう。

4

2 に答える 2

1

d3.json最初の引数にファイル パスを使用し、解析された json をコールバックに渡します。自分で json を読み込んで解析するので、 を使用する必要はなくd3.json、json を としてコールバックに直接渡すだけで済みますroot

これはうまくいくはずです: https://plnkr.co/edit/0H6t9m642cxCcukPwDFH?p=preview

d3.jsonサーバーから提供されるものを介してロードしたい場合は、次のようなものを使用してそれを行うことができます:

var loadFromUrl = function(url){
    d3.json(url, function(error, data){
        if(!error) {
           initData(data);
        }
    });
};
于 2016-05-02T15:00:42.543 に答える
0

ご回答ありがとうございます。これは良いコードです。JSON を送信するだけで、d3.json は使用しないでください。

<script type="text/javascript">
    var json;
    function handleFileSelect(evt) {
        var files = evt.target.files;
    }
    document.getElementById('files').addEventListener('change', handleFileSelect, false);
    function handleFileSelect(evt) {
        var files = evt.target.files;
        var output = [];
        for (var i = 0, f; f = files[i]; i++) {
            var reader = new FileReader();
            reader.onload = (function (theFile) {
                return function (e) {
                        json = JSON.parse(e.target.result);
                        alert('json global var has been set to parsed json of this file here it is unevaled = \n' + JSON.stringify(json));
                        initData(json); // Doesn't works
                        //initData("data.json"); // Works
                }
            })(f);
            reader.readAsText(f);
        }
    }
    document.getElementById('files').addEventListener('change', handleFileSelect, false);

</script>

function initData(root){
        var node = svg.selectAll(".node")
                .data(bubble.nodes(classes(root))
//....
于 2016-05-02T15:21:58.963 に答える