【问题标题】:google maps api v3 infowindow + flot谷歌地图 api v3 infowindow + flot
【发布时间】:2012-09-21 19:40:59
【问题描述】:

我正在尝试在 infowindow 内绘制图表,但 flot 没有执行,也没有抛出任何错误。我在 flot 论坛上读到,人们经常在做这样的事情时遇到麻烦,因为占位符元素必须是可见的(这可能是一个红鲱鱼)。

我能够得到以下内容以在不同的元素中适当地生成图表:

$.plot(
    $("#placeholder"),
    [ f_data[loc] ],
    {
        grid: { hoverable: true, clickable: true },
        series: {
           bars: { show: true },
           clickable:true,
           color:'#3FA9F5',
           shadowSize: 0
       },//series
       xaxis: {
           tickDecimals:0,
           tickSize:1
       }//xaxis
    }
);//$.plot

但是当我将上述内容放入google.maps.event.addListener() 或从中引用时,它什么也不做(甚至不添加<canvas> 元素)。

我确保将它放在infowindow.open(map,marker); 之后,这样我就认为占位符元素是可见的。我还确保#placeholder 具有实质/定义的尺寸。

附:我尝试了 Mike Williamson 报告的他对Google Maps V3: Loading infowindow content via AJAX 的最终解决方案,但这也不起作用。

编辑
在 infowindow 之外工作的 flot 示例:index2.html
在 infowindow (addListener 'domready') 内不工作的 flot 示例:index3.html
flot 在 infowindow (setTimeout) 内不起作用的示例:index4.html

【问题讨论】:

    标签: javascript google-maps-api-3 flot infowindow


    【解决方案1】:

    问题是内容 div 尚未附加到域(因此 $("#placeholer") 无法找到它)。在运行代码绘制图表之前,您需要等待 infowindow domready 事件触发,如下所示:

    更新:下面的代码适用于我的本地副本(我确实修改了 css,但我认为这不是必需的)。

    google.maps.event.addListener(marker, 'click', (function(marker, locale, s, flot_data) {
      return function() {
        var fname = 'http://clients.frende.me/incognito/images/'+date+'_'+locale.toLowerCase().replace(/\s/g,'')+'.svg';
        infowindow.setContent('<div id="gMaps_infowindow"><h3>'+locale+' ('+hour+':00): $'+s.total+'</h3><div id="flotIW" style="height:200px; width:350px;" name="'+locale+'"></div></div>');
    
      google.maps.event.addListener(infowindow, 'domready', function() {(function(f_data,loc) {
        $.plot(
          $("#flotIW"),
          [ f_data[loc] ],
          {
            grid: { hoverable: true, clickable: true },
            series: {
              bars: { show: true },
              clickable:true,
              color:'#3FA9F5',
              shadowSize: 0
            },//series
          xaxis: {
            tickDecimals:0,
            tickSize:1
          }//xaxis
        }
      );//$.plot
      })(flot_data,locale)});
    
        infowindow.open(map, marker);
        //open_popUp(flot_data,locale);
        //open_drawGraph(locale);
      }//return
    })(marker, locale, s, flot_data));//google.maps.event.addListener
    

    (另一种选择是直接创建域节点,使用它来渲染图形,并将其传递给 setContent 调用(将采用字符串或 DOM 节点)。

    【讨论】:

    • 我在第一个 addLister 之后添加了google.maps.event.addListener(infowindow, 'domready', (function(f_data,loc) { … })(flot_data,locale));,但我从 flot 收到了 Invalid dimensions 错误。
    • cmets 中的代码难以阅读,但看起来您并未包含所有内容。我对flot一无所知(只是Google Maps API v3),但这个错误听起来像是“占位符” div要么没有大小,要么有flot不喜欢的大小。可能是时候举一个活生生的例子了。
    • 这个建议是正确的,请在此处查看简化的 JSFiddle:jsfiddle.net/ryleyb/Aykg2 ...您会注意到不再使用 setTimeouts。
    • @Ryley 你知道为什么内容对于你小提琴中的信息窗口来说太大了吗?当我之前尝试过(使用空的#flot div)时,信息窗口会自动增长。
    • @Ryley:我通过将infowindow.open(map, marker); 移动到google.maps.event.addListener(infowindow, 'domready', function() { … }); 之前来修复它
    【解决方案2】:

    您是否尝试过将您的 $.plot 包装在 setTimeout(function(){$.plot({stuff})}, 0) 中?

    有时这有助于让浏览器有时间在执行之前完成绘制它需要的任何元素。

    您可以在此处找到更多信息为什么这可能有用:Why is setTimeout(fn, 0) sometimes useful?

    【讨论】:

    • 尝试了这个:setTimeout( open_drawGraph(locale) , 0 ); 并得到一个 无用的 setTimeout 调用(参数周围缺少引号?) 错误。
    • 啊,抱歉,setTimeout 需要一个函数对象而不是调用(此处的文档:developer.mozilla.org/en-US/docs/DOM/window.setTimeout)。我已经更新了我的答案以纠正我的这个错误。
    • 为问题添加了活生生的例子
    猜你喜欢
    • 2011-09-14
    • 1970-01-01
    • 2014-01-12
    • 1970-01-01
    • 1970-01-01
    • 2011-08-23
    • 1970-01-01
    • 2013-07-04
    • 2015-03-20
    相关资源
    最近更新 更多