【问题标题】:Generate 3000 squares procedurally程序生成 3000 个正方形
【发布时间】:2017-04-04 02:36:27
【问题描述】:

我需要构建一个包含 3000 个正方形的小部件。手动执行此操作将花费很长时间,也许你们中的一些人知道生成类 .square 3000 次的最简单方法?我还需要能够更改每个方块的内容,例如颜色、标题等。谢谢朋友!

<div class="square">
  <h1>10</h1>
</div>

https://jsfiddle.net/srowf8hg/

【问题讨论】:

标签: javascript php procedure dynamically-generated auto-generate


【解决方案1】:

var container = $('#container');
for (var i = 0; i < 3000; i++) {
  container.append($('<div class="square"><h1>10</h1></div>'));
}
.square {
  background: #fa5339;
  color: #fff;
  width: 100px;
  height: 100px;
  float: left;
  border: 1px solid #d63d26;
}
h1 {
  height: 50%;
  width: 100%;
  display: flex;
  align-items: center;
  justify-content: center;
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<div id="container"></div>

【讨论】:

  • OP 说他需要能够单独访问每个方格。您的解决方案无法让他轻松做到这一点。
  • 所以这是对我的答案投反对票的理由吗?它确实回答了核心问题。
  • 您的解决方案没有解决问题的核心要求之一,因此它并没有真正提供好的答案。
  • 只有一个核心要求,那就是问题的标题。其他的是“我也需要”——要求。
  • 您给出的答案不符合 OP 标准。这不是一个好的答案。如果我走进代码审查并告诉我的同行我的代码解决了它应该解决的 50% 的问题,你认为它会被接受吗?不要这么个人化。
【解决方案2】:

您只需要一个循环并在每次迭代时创建一个新方块。为了能够单独访问每个方格,每个生成的方格都有自己的唯一 ID:

var cont = document.getElementById("container");

for(var i = 1; i <3001; ++i){
 var div = document.createElement("div");
 div.setAttribute("class", "square");
 div.setAttribute("id", "div" + i);
 
 var h1 = document.createElement("h1");
   h1.textContent = i;
   div.appendChild(h1);
   cont.appendChild(div);
 }
.square{
  background:#fa5339;
  color:#fff;
  width:100px;
  height:100px;
  float:left;
  border:1px solid #d63d26;
}
h1{
    height: 50%; 
    width:100%;
    display:flex;
    align-items: center;
    justify-content: center;
}
<div id=container>
  
</div>

【讨论】:

    【解决方案3】:

    最好的方法是使用 JavaScript 为您制作它们

    我在这里做的一个例子会做你想做的事,并为每个人设置一个唯一的 id,以便可以对其进行编辑。

    <div id="square_container"> </div>
    <script>
        var i, square, text, container = document.getElementById("square_container");
        for (i = 1; i <= 3000; i += 1) {
            square = document.createElement("div");
            square.id = "square" + i;
            square.classList.add("square");
            text = document.createElement("h1");
            text.innerHTML = i;
            text.id = "text" + i;
            square.appendChild(text);
            container.appendChild(square);
        }
    </script>
    

    【讨论】:

    • 当值不包含任何 HTML 时,不应使用 innerHTML
    • @ScottMarcus 我不明白你所说的不包含 HTML 是什么意思?你的意思是它应该只用于在自身内部设置更多的 HTML 标签,而不仅仅是用于设置文本?
    • @PhilipEagles Scott 只是试图在其他人的答案中找出缺陷,以便他可以批评他们。帮助使其他人的答案看起来有问题,因此他的答案被选中的机会增加了。这次成功了!
    • @connexo 我只是想解释一些通常被误解的东西。 innerHTML 接收一个字符串,然后将该字符串解析为 HTML 内容。如果字符串不包含/不包含任何 HTML,则不应使用它,因为它会导致不必要的内部工作。 .textContent 属性将是正确使用的属性。
    • 你真的加快了我的工作。在这一点上,使用的技术对我来说并不重要,这个项目更复杂。你们所有的回答对我真的很有帮助,非常感谢你们!
    【解决方案4】:

    你的问题很模糊。

    您愿意(或在家庭作业等项目的情况下能够)使用哪些技术来实现您的目标?

    如果你不知道怎么做,那么我建议你开始学习一些 jQuery,这是一个 javascript 框架,它可以让你做一些非常酷和简单的事情。

    如果你最终使用 jquery,你所要做的就是创建一个元素让我们说:

    <div id="container"></div>
    

    然后在您的 javascsript 中的某个地方,您将拥有一个 javascript 数组,其中包含您正在为其渲染的对象,例如一个名为 square { color,title,text,name,this,that }

    的对象

    然后您可以创建一个循环,将您的 html 元素构造为字符串并使用 jquery 将元素附加到您的 DOM 中。 一个例子是:

    var myContainer = $('#container'); <--- this holds a reference to the container element using jquery
    for(var i=0,len=myArray.length;i<length;i++){ <-- in my array you would have your "square" objects so that you can modify each square based on parameters like name,title,color etc
        var elementInString = '<div class="square" style="color:"'+myArra[i].color+'>';   <-- and create your parameterised square here
        $(myContainer).append(elementInString);
    }
    

    这是一种方法。其他方式包括使用其他框架(Knockout、Angular 等)

    希望对你有帮助

    【讨论】:

    • 这是一个好方法。不过,您应该使代码更具可读性(长行)。
    • 为什么要将 JQuery 带入其中?这是一个简单的纯 JS 答案的简单问题。 Angular 和 Kockout 完全不需要,Arrays 也是如此。
    • 说实话我还不知道如何在这里编写正确的代码块!
    • 感谢 MKougiouris 的解释。这是一项功课,当时我会坚持使用 jQuery,但我会研究所有技术,所有这些解决方案。
    • 我引入了 jQuery,因为从他的照片中我可以看出他一定是学生,所以这是他尝试 jQuery 和学习新事物的好时机,以防他不知道 jquery。另外这就是为什么我要引入淘汰赛和 angular,他正在迈出在 dom 元素上创建响应行为的第一步,这是一个更好的时间让他在 angular 和淘汰赛上稍微搜索一下 :)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-04-06
    • 2015-07-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多