遍历从数据库 Ruby/Javascript 检索到的元素

Iterate over elements retrieved from database Ruby/Javascript

我正在处理这个问题,当然不知道如何解决。我可能选择了错误的方法,但让我再解释一下。正在从我的 SQLite 数据库中检索某些信息,此类信息用于在我的 DOM 中构建 div 结构。这个 div 结构表示商店中的一个项目,每个元素都应该附加一个动作,我使用一些 JS 来实现。这是现在的样子:

HTML5:

<!-- Iterates over all activities retrieved from database -->

    <div class="row"  id="activity" draggable="true">
        <% @activities.each do |activity| %>

        <div class="large-4 small-6 columns">
            <div><%= image_tag activity.picture_url, :class => "img-style"%></div>

            <div class="panel img-panel" >
            <h5><%= activity.title %></h5>
            <h6 class="subheader"><%= activity.price %></h6>
                    </div>
        </div>

        <% end %>
    </div>

<!-- ends iteration -->

JS:

window.onload = function() {
   var activities = document.getElementById("activity");
   console.log('Length: '   + activities.length);

   var count = 0;
   for (act in activities) {
     var activity = activities[act];
     count++;
     console.log(count);

     activity.addEventListener('dragstart', activityDraggingStart, false);
     }

  function activityDraggingStart(e) {
        this.style.backgroundColor = 'blue';
  }
};

所以问题出在JS代码上:

在这种特殊情况下应该做什么?最好的方法是什么?基本上我想要实现的是将事件侦听器添加到我的 "activity" div,以便在 'dragstart' 和 'dragstop' 事件发生时做一些事情。

我相信您第一个问题的答案是您正在尝试对一个 ID 调用 .length,默认情况下,该 ID 应该只有一个项目。如果您试图获取列出的所有活动的数组,我会将 ID 设为 class 并将您的循环移到所有 div 之外,例如

<% @activities.each do |activity| %>
  <div class="row activity" draggable="true">

    <div class="large-4 small-6 columns">
      <div><%= image_tag activity.picture_url, :class => "img-style"%></div>

      <div class="panel img-panel" >
      <h5><%= activity.title %></h5>
      <h6 class="subheader"><%= activity.price %></h6>
                </div>
    </div>

  </div>
<% end %>

其次,它显示 200 的原因是因为它只有一个项目(因为 "getElementByID")它正在计算字符串中的字符数,将那个坏男孩更改为 "getElementsByClassName."

第三个……好吧……改变这些可能会解决问题……但我不完全确定。无论如何,我希望这对您有所帮助。

在您的示例中,活动不是数组,它是一个元素,没有长度。

不确定您要完成什么,但请尝试:

var activity = document.getElementById("activity");
 var activities = activity.children;

 var activity = document.getElementById("activity");
 var activities = activity.childNodes;

或每个 class 例如面板/列或其他:

var activity = document.getElementById("activity");
var activities = activity.getElementsByClassName('panel');

Id 不直接 return 类数组对象。

认为一个问题可能是您有多个具有相同 ID 名称的元素。尝试将其更改为 class。

我的做法是遍历行并向每个行添加 jquery ui 可拖动。

这里是 fiddle.

https://jsfiddle.net/0wnwt29j/1/

 $(function () {

     var numItems = $('.activity').length;
     $('#myspan').text('num of activities: ' + numItems);

     $(".row").each(function (index) {
         var myelement = $(this);
         myelement.draggable({
             start: function () {
                 myelement.addClass('blue');
             },
             stop: function () {
                 myelement.removeClass('blue');
             }
         });
     });


 });

你所有的麻烦都是因为误用了html属性id

问题 1 的答案

因为 id 是单个 DOM 元素的标识,单个网页不应包含 2 个或更多具有相同 ID 的 DOM 元素。

你可以改变

<div class="row" id="activity" draggable="true">

<div class="row" class="activity" draggable="true">

和select他们

document.getElementsByClassName('activity');

问题 2 和 3 的答案

因为 document.getElementById() returns 只有一个 DOM 元素,你正在遍历它的 200 多个属性,这就是为什么你的 count 变量的数量是,并且为什么不能将事件侦听器附加到它们。如果您根据后一个答案更改了代码,那么应该没问题。