Javascript 在动态添加的div中绘制D3.js图
我有一个(可能很奇怪)的设置,我在页面的某个部分中使用ajax'ing一个模板,然后尝试在该模板的一个元素中绘制一个包含D3.js的图表 奇怪的是,有时它会呈现,而另一些则不会,抱怨我发现一定是元素保存了当时没有呈现的图表,因为它来自一个ajax调用 我怎样才能克服这个问题?我一直在读jQuery的Javascript 在动态添加的div中绘制D3.js图,javascript,jquery,ajax,d3.js,Javascript,Jquery,Ajax,D3.js,我有一个(可能很奇怪)的设置,我在页面的某个部分中使用ajax'ing一个模板,然后尝试在该模板的一个元素中绘制一个包含D3.js的图表 奇怪的是,有时它会呈现,而另一些则不会,抱怨我发现一定是元素保存了当时没有呈现的图表,因为它来自一个ajax调用 我怎样才能克服这个问题?我一直在读jQuery的when()和then()但是我似乎不知道它对我的情况有什么帮助(如果有的话) 这是我的代码的(更简单)版本: $.get("/url/to/my/template", function(templa
when()
和then()
但是我似乎不知道它对我的情况有什么帮助(如果有的话)
这是我的代码的(更简单)版本:
$.get("/url/to/my/template", function(templateData){
// this element is already in the page
$("#elementInThePage").html(templateData);
// this function draws the D3 chart
buildChart();
});
function buildChart(){
// this element comes in the template
// sometimes it's already available, other times it isn't
// and obviously d3 complains about it not being there
var element = d3.select("#elementInTemplate");
// do more stuff (...)
}
总之,如何确保仅在呈现#elementInTemplate
时调用buildChart()
编辑:我已经尝试将.done()
链接到我的$。获取,但发生了完全相同的情况
EDIT2:我想我把问题解释错了。D3.js不会抱怨它不在那里。实际上,它是根据模板中元素的大小(WxH)有条件地绘制图表的,因为该元素仍然没有呈现,所以它会破坏图表
EDIT3:另一个(我认为是相关的),注意:在buildChart()中,D3.js取决于模板元素的维度。所以,如果我
console.log($("#elementInTemplate").width()+" x "+$("#elementInTemplate").height());
如果失败,我会得到234 x 0
。如果它有效,我会得到234 x 456
,所以这一行:$(“#elementInThePage”).html(templateData);,渲染元素INTemplate?一旦你运行了这一行,你想只在buildChart()运行完毕时调用它吗?@thisonegay是的,就是这样。我相信这将帮助我解决这个问题。虽然我不想设置超时时间之类的东西,但我很想知道是否有更好的解决方案。我认为这些应该有帮助you@thisOneGuy因为我不希望它只在有宽度和高度的情况下工作。我希望它始终具有宽度和高度,以便正常工作。如果可以使用新尺寸更新宽度和高度,请使用可变宽度和高度并覆盖它们,如果不使用旧的宽度和高度(或默认值),则在D3中使用这些值,因此此行:$(“#elementInThePage”).html(templateData);,渲染元素INTemplate?一旦你运行了这一行,你想只在buildChart()运行完毕时调用它吗?@thisonegay是的,就是这样。我相信这将帮助我解决这个问题。虽然我不想设置超时时间之类的东西,但我很想知道是否有更好的解决方案。我认为这些应该有帮助you@thisOneGuy因为我不希望它只在有宽度和高度的情况下工作。我希望它始终具有宽度和高度,以便工作。如果可以使用新尺寸更新宽度和高度,则使用可变宽度和高度并覆盖它们,如果不使用旧的宽度和高度(或默认值),则在D3中使用这些值