Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/395.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 是否从动态创建的div数组中注册onclick事件?轨道&x2B;Jquery?_Javascript_Jquery_Ruby On Rails_Ruby On Rails 3_Onclick - Fatal编程技术网

Javascript 是否从动态创建的div数组中注册onclick事件?轨道&x2B;Jquery?

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",

在使用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", :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()});
        });
    }
});