在部分渲染上执行JavaScript

我有一些JavaScript代码,我想在用户点击其中一个文件夹后执行它 – 它会触发show动作和show.js.erb,它会呈现部分。

Show.js.erb,当用户点击其中一个文件夹时触发,如下所示:

$("body").append( " 'contents', :locals => {:folder => @folder } %>" ); 

它成功注入了部分_contents.html.erb,如下所示:

   d3JSON = function(){ d3.json("/folders/.json", function(error, data) { if (error) return console.warn(error); var folderChildren = [], circle; /*for (var i=0; i < data.submissions.length; i++) { var submissionWords = data.submissions[i].content.split(' ').join(''); var size = submissionWords.length; folderChildren[data.submissions[i].id] = size; console.log(folderChildren); };*/ var svg = d3.select("body").selectAll("svg"); circle = svg.selectAll("circle") .data(data.submissions); circle.enter().append("svg:a") .attr("xlink:href", function(d){ return "http://localhost:3000/submissions/" + d.id; }) .append("circle") .attr("cy", function(d) {return d.content.length * 5 + "px";}) .attr("class", "floating") .attr("cx", function(d){ return (d.content.length / 2) * 10 + "px"; }) .attr("r", function(d){ return (d.content.length / 2) * 1.2;}); circle.exit().remove(); }); }; d3JSON();  

我已经测试了这个JavaScript并且它可以正常工作,但是当它被注入时,它应该与DOM中的div进行交互,而不是。 div在我的index.html.erb文件中,因此在注入此JS时它们已经被加载。 我已经尝试了很多不同的东西来尝试让这个工作,但唉没有运气任何建议? 如果我尝试加载一些简单的类似alert()东西通过它的部分工作,但我猜这是由于DOM和js的加载顺序不起作用。

你对DOM和js的加载顺序是正确的。 所以你可以做的是在show.js.erb触发一个自定义事件,并在你的一个js文件中监听该事件并调用d3JSON(); 那里。

 // show.js.erb $("body").append( "<%=j render :partial => 'contents', :locals => {:folder => @folder } %>" ).trigger('show'); 

在您的页面中加载的一个javascript文件中

 $(document).ready(function(){ $('body').on('show', function() { d3JSON(); }); }); 

而且你不需要d3JSON();_contents.html.erb调用。

试一试。