在部分渲染上执行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
调用。
试一试。
- Rails 4 jQuery与javascript冲突
- Rails Asset Pipeline JS压缩插入“非法字符”
- Rails 3.1 – JS – * .js.erb中的Socket.io-emit未执行并阻止执行jQuery-Function
- Rails Turbolinks中的Facebook插件页面无法加载
- 当我动态生成复选框时,我无法使用javascript访问复选框的键
- 如何在Rails视图中将Ruby变量传递给JavaScript函数?
- Ruby on Rails – 使用AJAX获取数据的jQuery
- 如何在ruby中使用javascript变量
- 在Rails中生成VAPID公钥并将其传递给Javascript