【问题标题】:for loop only applying to last itemfor 循环仅适用于最后一项
【发布时间】:2018-11-29 14:30:06
【问题描述】:

我正在做一个简单的拖放活动,检查所有拖放项目是否都在正确的放置区域中。事情会被打乱,但基本上我正在考虑的方式是每个拖放区检查它是否包含“拖动”+匹配的数组#(即第一个数组项 drag0 位于第一个数组项 [0]放置区)。

但它只对最后一项有效(您只需正确处理最后一项,您就会得到正确的响应)。我已经看到了将其包装在函数中或使用 throw/catch 的选项,但似乎没有任何效果。

item 类是可拖动的项目,dropzone 是可放置区域的类。

function seeResult() {
  var result = document.getElementById("result");
  var drags = document.getElementsByClassName("item");
  var drops = document.getElementsByClassName("dropzone");
  var i;
  for (i = 0; i < drops.length; i++) {
    var num = i;
    if (drops[i].innerHTML.indexOf("drag" + num)) {
      result.style.color = "green";
    } else {
      result.style.color = "red";
    }
  }
};
<div class="item" draggable="true" ondragstart="drag(event)" id="drag0">Drag Item 1</div>
<div class="item" draggable="true" ondragstart="drag(event)" id="drag1">Drag Item 2</div>
<div class="item" draggable="true" ondragstart="drag(event)" id="drag2">Drag Item 3</div>
<div class="item" draggable="true" ondragstart="drag(event)" id="drag3">Drag Item 4</div>

<div id="dropZones">
  <div id="dropZone1" class="dropcon">
    <div class="dropzone" ondrop="drop(event)" ondragover="allowDrop(event)"></div>
    <div class="dragdesc">
      <p>Drop Description 1</p>
    </div>
  </div>
  <div id="dropZone2" class="dropcon">
    <div class="dropzone" ondrop="drop(event)" ondragover="allowDrop(event)"></div>
    <div class="dragdesc">
      <p>Drop Description 2</p>
    </div>
  </div>
  <div id="dropZone3" class="dropcon">
    <div class="dropzone" ondrop="drop(event)" ondragover="allowDrop(event)"></div>
    <div class="dragdesc">
      <p>Drop Description 3</p>
    </div>
  </div>
  <div id="dropZone4" class="dropcon">
    <div class="dropzone" ondrop="drop(event)" ondragover="allowDrop(event)"></div>
    <div class="dragdesc">
      <p>Drop Description 4</p>
    </div>
  </div>
</div>

<div id="seeResult" onclick="seeResult()">See result!</div>
<div id="result">Result</div>

最后要注意的是,这将被添加到一个网站中,内容创建者可以在其中添加/删除他们想要的任意数量的拖放项目,然后将其吐出给最终用户,所以事情必须是相当动态的,可以不要只使用这 4 个特定的数组项。

提前感谢您的帮助!

【问题讨论】:

标签: javascript arrays function for-loop


【解决方案1】:

这样做的方法是假设一切都很好,然后如果你发现有什么不好的地方,那就改变它。看看我是如何更改您的代码以将 result.style.color 最初设置为绿色的,然后如果您发现一个不正确的元素,它会将其设置为红色并返回。

function seeResult() {
    var result = document.getElementById("result");
    result.style.color = "green";
    var drags = document.getElementsByClassName("item");
    var drops = document.getElementsByClassName("dropzone");
    var i;
    for (i = 0; i < drops.length; i++){
        var num = i;
            if(drops[i].innerHTML.indexOf("drag"+num) == -1){
              result.style.color = "red";
              return;                
            }
    }
}

【讨论】:

  • 啊,我喜欢正确然后寻找错误的想法;但是我认为 for 循环或 if 语句仍然存在问题,如果任何拖动项落在任何放置区域中,我都会得到正确的。
  • @TylerB 是的,if 语句有问题。我将代码重构为快速。无论如何,我现在已经纠正了这个问题,它应该可以工作
  • 啊,我明白了,== -1。说得通。回报究竟在做什么? (对不起,我是新手,还在学习)。非常感谢您抽出宝贵时间提供帮助,非常感谢!
  • Return 使 for 循环短路。在一个已经“失败”= 输入if 语句之后,没有必要继续检查所有drops,因为它没有“拖动”。只需要一次失败就可以将结果变为红色。
  • 哦,太好了!再次感谢您的帮助!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-06-27
  • 1970-01-01
  • 2021-02-23
  • 2021-08-14
  • 1970-01-01
  • 1970-01-01
  • 2018-08-31
相关资源
最近更新 更多