php - 如何使用 AJAX 获取数据并将其存储在 javascript 变量中?

标签 php jquery ajax

这是一个动态更新的图表示例: http://www.highcharts.com/demo/dynamic-update

图表每秒更新一次,以日期作为 x 值,以随机数作为 y 值。

load: function() {            
    // set up the updating of the chart each second
    var series = this.series[0];
    setInterval(function() {
        var x = (new Date()).getTime(), // current time
            y = Math.random();
        series.addPoint([x, y], true, true);
    }, 1000);
}

如何重写 load 以使用 AJAX 从另一个网页获取 xy,而不是在函数内生成值?

最佳答案

我认为您想要的是示例 load 方法,但将设置 xy 的行替换为 AJAX 调用。您需要执行相当基本的 continuation-passing代码转换,将您想要异步调用的点之后的代码转换为传递给异步调用的函数。 “Continuation ”仅表示“从给定点向前计算的其余部分”。在代码示例中,这是对series.addPoint 的调用。其模式是您进行转换:

function f(...) {
    (1)
    result = sync(...);
    (2)
}

进入:

function f(...) {
    (1)
    async(..., function (result) {
          (2)
      });
}

如果 (2) 在原始函数中返回一个值,则对 f 的调用也必须使用延续传递风格重写,添加一个额外的参数来保存延续。

您应该做的另一件事是确保 PHP 脚本将数字对输出为有效的 JSON,或者作为两个数字的数组(可以在之后直接传递给 series.addPoint 调用)解析),或作为具有属性“x”和“y”的对象。

请注意,由于网络通信的性质,数据可能无法及时到达,从而导致图表的间隔不规则。

要点如下,将异步调用的具体细节包装到名为 ajaj 的函数中。该示例假设浏览器支持 XMLHttpRequest 的必要标准和 JSON解析器。

/* Asynchronous Javascript And Json */
function ajaj(url, succeed, fail) {
    if (! fail) {
        fail = function() {};
    }
    var xhr = new XMLHttpRequest;
    xhr.open('GET', url);
    xhr.onreadystatechange = function() {
        if (xhr.readyState==4) {
            if (200 <= xhr.status && xhr.status < 300) {
                succeed(JSON.parse(xhr.responseText));
            } else {
                // error
                fail(xhr.status, xhr.statusText, xhr.responseText);
            }
        }
    };
    xhr.send();
    return xhr;
}

...

    url: '...',

    load: function() {
        // ensure only one data load interval is running for this object
        if (this.updateInterval) {
            return;
        }
        // set up the updating of the chart each second
        var series = this.series[0];

        this.updateInterval = setInterval(function() {
            ajaj(this.url, 
                 function(point) { // success
                     series.addPoint(point, true, true);
                 },
                 function(status, statusText, response) { // failure
                     ...
                 }
            );
        }, 1000);
    }

JS 库提供自己的 ajaj 版本,通常具有更多功能。如果您正在为生产站点执行任何复杂的操作,请考虑采用一种。例如,如果您使用 jQuery(如标签所示),则可以使用 jQuery.get :

    load: function() {
        if (this.updateInterval) {
            return;
        }
        // set up the updating of the chart each second
        var series = this.series[0];

        this.updateInterval = setInterval(function() {
            jQuery.get(this.url, 
                 function(point, textStatus, jqXHR) { // success
                     series.addPoint(point, true, true);
                 }, 'json'
            );
        }, 1000);
    }

服务器端的事情非常简单。 time()返回 Unix 时间戳,rand()返回一个(不是非常)伪随机数(尽管对于演示来说已经足够好了),并且 json_encode() ,好吧,你可以弄清楚。

<?php
header('Content-type: application/json');

echo json_encode(
        array(
            time(),
            rand() / getrandmax(),
        ));

关于php - 如何使用 AJAX 获取数据并将其存储在 javascript 变量中?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8570524/

相关文章:

php - 无法使用 PHP INSERT INTO 数据库,没有抛出错误

php - 在共享主机上安装 PHP 扩展

javascript - 从对象中查找并删除空属性

javascript - 在 Flot 中绘制以毫秒为单位的时间轴

javascript - 客户端事件库 (asp.net)

PHP session 加密

php - 从显示 :block 触发 PHP 进程

javascript - jQuery 事件监听器粘连/级联?

Ajax 调用 : big differences between server runtime and client waiting time

javascript - JQM 1.4.2 从ajax添加模板到弹出窗口不渲染