使用Ajax更新flot图表

时间:2013-08-16 21:14:39

标签: javascript ajax jquery flot

我使用flot插件创建了一个wheight图表,我这样做:

$(document).ready(function () {
var data1 = [
    [gd(2012, 0, 1), 67],
    [gd(2012, 1, 1), 68],
    [gd(2012, 2, 1), 75],
    [gd(2012, 3, 1), 69]
];

var data2 = [
    [gd(2012, 0, 1), 60],
    [gd(2012, 1, 1), 60],
    [gd(2012, 2, 1), 60],
    [gd(2012, 3, 1), 60]
];
var dataset = [{
    label: "weight",
    data: data1
}, {
    label: "Goal weight",
    data: data2
}];

var options = {
    series: {
        lines: {
            show: true
        },
        points: {
            radius: 3,
            fill: true,
            show: true
        }
    },
    xaxis: {
        mode: "time",
        tickSize: [5, "day"],
        tickLength: 0,
        axisLabel: "2013",
        axisLabelUseCanvas: true,
        axisLabelFontSizePixels: 12,
        axisLabelFontFamily: 'Verdana, Arial',
        axisLabelPadding: 10
    },
    yaxes: [{
        axisLabel: "",
        axisLabelUseCanvas: true,
        axisLabelFontSizePixels: 12,
        axisLabelFontFamily: 'Verdana, Arial',
        axisLabelPadding: 3,
        tickFormatter: function (v, axis) {
            return $.formatNumber(v, {
                format: "#,###",
                locale: "us"
            });
        }
    }],
    legend: {
        noColumns: 0,
        labelBoxBorderColor: "#000000",
        position: "nw"
    },
    grid: {
        hoverable: true,
        borderWidth: 2,
        borderColor: "#633200",
        backgroundColor: {
            colors: ["#ffffff", "#EDF5FF"]
        }
    },
    colors: ["#FFA100", "#B7C84B"]
};

$(document).ready(function () {
    $.plot($("#flot-placeholder1"), dataset, options);
    $("#flot-placeholder1").UseTooltip();
});

function gd(year, month, day) {
    return new Date(year, month, day).getTime();
}

var previousPoint = null,
    previousLabel = null;
var monthNames = ["Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"];


$.fn.UseTooltip = function () {
    $(this).bind("plothover", function (event, pos, item) {
        if (item) {
            if ((previousLabel != item.series.label) || (previousPoint != item.dataIndex)) {
                previousPoint = item.dataIndex;
                previousLabel = item.series.label;
                $("#tooltip").remove();

                var x = item.datapoint[0];
                var y = item.datapoint[1];

                var color = item.series.color;
                var month = new Date(x).getDay();

                //console.log(item);

                if (item.seriesIndex == 0) {
                    showTooltip(item.pageX,
                        item.pageY,
                        color,
                        "<strong>" + item.series.label + "</strong><br>" + monthNames[month] + " : <strong>" + y + "</strong>(USD)");
                } else {
                    showTooltip(item.pageX,
                        item.pageY,
                        color,
                        "<strong>" + item.series.label + "</strong><br>" + monthNames[month] + " : <strong>" + y + "</strong>(%)");
                }
            }
        } else {
            $("#tooltip").remove();
            previousPoint = null;
        }
    });
};

function showTooltip(x, y, color, contents) {
    $('<div id="tooltip">' + contents + '</div>').css({
        position: 'absolute',
        display: 'none',
        top: y - 40,
        left: x - 120,
        border: '2px solid ' + color,
        padding: '3px',
        'font-size': '9px',
        'border-radius': '5px',
        'background-color': '#fff',
        'font-family': 'Verdana, Arial, Helvetica, Tahoma, sans-serif',
        opacity: 0.9
    }).appendTo("body").fadeIn(200);
}

});

我需要的是什么:

1-将数据放在单独的文件中,例如ajax.json:

var data1 = [
[gd(2012, 0, 1), 67],
[gd(2012, 1, 1), 68],
[gd(2012, 2, 1), 75],
[gd(2012, 3, 1), 69]
];

var data2 = [
[gd(2012, 0, 1), 60],
[gd(2012, 1, 1), 60],
[gd(2012, 2, 1), 60],
[gd(2012, 3, 1), 60]
];

因为我会从数据库中获取值,但我不知道如何处理函数gd():

function gd(year, month, day) {
    return new Date(year, month, day).getTime();
}

2-第二个问题是我希望刷新图表来更新数据。我试过但是每当我收到错误并且图表刚刚消失时,我的想法是使用带点击功能的ajax:

$("button.dataUpdate").click(function () {

....

function onDataReceived() {

    $.plot("#flot-placeholder1", data, options);
}

$.ajax({
    url: "ajax.json",
    type: "GET",
    dataType: "json",
    success: onDataReceived
});

所以我尝试通过单击“dataupdate”按钮来运行ajax然后我从ajax.json页面获取数据并最终更新并刷新图表?我有什么想法吗?

备注:我花了两天的时间找到一个解决方案,在我的第一个代码中正确集成最后一个代码以获得所有工作,所以我希望直接解决代码而不只是评论...

2 个答案:

答案 0 :(得分:0)

只是一些一般提示:如果你长时间坚持下去,试着花一些时间,也许几天到一周学习一下AJAX,flot,JSON等等,然后回到你的问题拥有你所拥有的所有新知识。此外,您应该尝试检查自动代码检查器的代码,例如jshint.com

以下是我使用JSHint检测到的一些可能导致您出现问题的错误。如果您的代码仍无效,请发表评论。

Line 1: $(document).ready(function () {
Unmatched '{'.

Line 136: }
Expected ')' and instead saw ''.

Line 136: }
Missing semicolon.

答案 1 :(得分:0)

你的第一个问题在于没有在&#34; onDataReceived&#34;中做任何事情。用于更新数据的功能。此函数中的代码应如下所示:

function onDataReceived(series) {
    data = []; // Delete this line if you want to add graphs, not replace them.
    data.push(series);
    $.plot("#flot-placeholder1", data, options);
}

这应该为您提供一个工作示例,其中包含您要求的页面上的数据:

"label": "Label Name",
"data": [[1999, 3.0], [2000, 3.9], [2001, 2.0], [2002, 1.2], [2003, 1.3], [2004, 2.5], [2005, 2.0], [2006, 3.1], [2007, 2.9], [2008, 0.9]]

你的最后一个问题是&#34; gd&#34;你正在尝试使用的功能。您在代码中要求JSON响应,然后尝试解析JSON数据。只有gd()不被识别。

有关更多信息,请转到他们的ajax示例,并查看源代码:http://www.flotcharts.org/flot/examples/ajax/

祝你好运!

编辑:不使用gd()函数,只需使用unix时间戳(为javascript目的乘以1000)。它就像一个魅力。