代码之家  ›  专栏  ›  技术社区  ›  Moe Sisko

jquery ajax成功函数中带有参数的google.setOnLoadCallback

  •  1
  • Moe Sisko  · 技术社区  · 8 年前

    示例代码: 这两种方法似乎都可以正常工作,显示一条消息:

    google.load("visualization", "1", { packages: ["corechart"] });
    ...
    $(document).ready(function () {
    
      google.setOnLoadCallback(function () {
        alert('from inside ready 1');
      });
    });
    
    $(document).ready(function () {
    
      google.setOnLoadCallback(alert('from inside ready 2'));
    });
    

      $.ajax({
        type: "POST",
        ... 
        success: function (result) {
          if (result.d) {
    
            $(document).ready(function () {
              alert('sucess');
    
              // option 1
              google.setOnLoadCallback(function () {
                alert('from inside ready 3');
              });
    
              // option 2
              // google.setOnLoadCallback(alert('from inside ready 4'));
            });
    

    现在,关于ajax的成功,我可以看到“suces”的显示,但选项1似乎不起作用。i、 我看不到“从内部准备3”。如果我启用选项2的代码,并注释掉选项1的代码,我会看到“从内部就绪4”。

    1 回复  |  直到 8 年前
        1
  •  2
  •   WhiteHat    7 年前

    首先,你使用的是谷歌图表的旧版本,
    jsapi
    release notes ...

    谷歌图表的版本仍然可以通过 loader.js 从现在开始。

    <script src="https://www.google.com/jsapi"></script>

    <script src="https://www.gstatic.com/charts/loader.js"></script>

    这只会更改加载语句。。。

    从。。。

    google.load("visualization", "1", { packages: ["corechart"] });
    

    google.charts.load("current", { packages: ["corechart"] });
    

    接下来,你不需要每次需要绘制图表时都使用回调函数,
    它只需要使用一次,以确保谷歌图表已经加载。


    您可以使用更新的 setOnLoadCallback 功能。

    google.charts.setOnLoadCallback(drawChart);
    

    load

    google.charts.load('current', {
      callback: drawChart,
      packages: ['corechart']
    });
    

    或者我更喜欢的,它回报的承诺。(google包括一个promise polyfill for IE)

    google.charts.load('current', {
      packages: ['corechart']
    }).then(drawChart);
    


    谷歌的 负载 语句将等待默认加载文档,
    所以你可以用 google.charts.load 代替 $(document).ready

    建议先加载google,然后使用ajax获取数据,然后绘制图表。

    类似于下面的设置。。。

    google.charts.load('current', {
      packages: ['corechart']
    }).then(function () {
    
      // get data for chart 1
      $.ajax({
        type: 'POST',
        ...
      }).done(function (result) {
    
        drawChart1(result.d);
    
      }).fail(function (jqXHR, status, errorThrown) {
        console.log(errorThrown);
      });
    
      // get data for chart 2
      $.ajax({
        type: 'POST',
        ...
      }).done(function (result) {
    
        drawChart2(result.d);
    
      }).fail(function (jqXHR, status, errorThrown) {
        console.log(errorThrown);
      });
    
    });
    
    function drawChart1(chartData) {
      ...
    }
    
    function drawChart2(chartData) {
      ...
    }