Javascript 是否从动态创建的div数组中注册onclick事件?轨道&x2B;Jquery?
在使用link_到remote之后,我决定尝试jQuery方式。 下面是jQuery循环和rails循环,以及它们是如何交互的。问题是我只能在每个循环外的一个div上注册点击,所以这个东西并没有真正起作用。。代码如下:Javascript 是否从动态创建的div数组中注册onclick事件?轨道&x2B;Jquery?,javascript,jquery,ruby-on-rails,ruby-on-rails-3,onclick,Javascript,Jquery,Ruby On Rails,Ruby On Rails 3,Onclick,在使用link_到remote之后,我决定尝试jQuery方式。 下面是jQuery循环和rails循环,以及它们是如何交互的。问题是我只能在每个循环外的一个div上注册点击,所以这个东西并没有真正起作用。。代码如下: <% @node.parent_relation.videos.each_with_index do |vid, idx| %> <%= image_tag("http://img.youtube.com/vi/#{vid.content}/1.jpg",
<% @node.parent_relation.videos.each_with_index do |vid, idx| %>
<%= image_tag("http://img.youtube.com/vi/#{vid.content}/1.jpg", :id => "img_div_#{idx}") %>
<div id="vid_vid_<%=idx%>" style="display: none"> <%= vid.id %></div>
<% end %>
<script>
var ids = "<%= @node.parent_relation.videos.length %>";
var div_arr = [];
var img_arr = [];
var vid_id = 0;
for( i=0; i < parseInt(ids); i++){
var x = String("vid_vid_"+String(i));
var y = String("img_div_"+String(i));
div_arr.push(x);
img_arr.push(y);
}
for ( i=0; i < parseInt(ids); i++){
var vst = '#'+String(img_arr[i]);
var dst = '#'+String(div_arr[i]);
$(function() {
$(vst).click(function(){
var vid_id = $(dst).html();
console.log(vid_id);
$.post("/nodes/iframize/", {video_id: vid_id});
});
})
}
</script>
“img_div{idx}”)%>
var id=“”;
var div_arr=[];
var img_arr=[];
var vid_id=0;
对于(i=0;i
nodes controller中有一个iframize操作和一个js.erb,它将div从respond_更新为format.js。在该操作中,该部分起作用
非常感谢,非常感谢任何建议。问题是dst和vst在您的循环中发生了变化。因此,当单击处理程序运行时,它使用的是dst和vst的最终版本,而不是创建单击处理程序时的值 您需要一个dst和vst的副本,您可以通过创建一个新的上下文来实现这一点。范例
function make_handler(vst, dst) {
$(vst).click(function(){
var vid_id = $(dst).html();
console.log(vid_id);
$.post("/nodes/iframize/", {video_id: vid_id});
});
}
$(function() {
for ( i=0; i < parseInt(ids); i++){
var vst = '#'+String(img_arr[i]);
var dst = '#'+String(div_arr[i]);
make_handler(vst, dst);
}
});
看起来问题在于所有处理程序都在共享
dst
变量。您可以使用该选项,这样就不会依赖于共享闭包变量。JasonWoof建议的选项也有效,你可以选择对你来说更容易的选项
for ( i=0; i < parseInt(ids); i++){
var vst = '#'+String(img_arr[i]);
var dst = '#'+String(div_arr[i]);
$(function() {
$(vst).click({dst: dst}, function(event){
var vid_id = $(event.data.dst).html();
console.log(vid_id);
$.post("/nodes/iframize/", {video_id: vid_id});
});
})
}
请尝试改用.on('click',function(){})。问题是,这行代码试图将for循环传递到
$()
噢,是的,我忘了在$()中放入函数。固定的。当然,我没有测试这个,我希望你能学习如何修复你的代码。
for ( i=0; i < parseInt(ids); i++){
var vst = '#'+String(img_arr[i]);
var dst = '#'+String(div_arr[i]);
$(function() {
$(vst).click({dst: dst}, function(event){
var vid_id = $(event.data.dst).html();
console.log(vid_id);
$.post("/nodes/iframize/", {video_id: vid_id});
});
})
}
$(function() {
var ids = "<%= @node.parent_relation.videos.length %>";
for( var i=0; i < ids; i++){
$("img_div_"+i).click({dst: $("vid_vid_" + i)}, function() {
$.post("/nodes/iframize/", {video_id: event.data.dst.html()});
});
}
});