【问题标题】:Can I somehow prevent returns in my code from adding spacing between form elements? [duplicate]我可以以某种方式阻止我的代码中的返回在表单元素之间添加间距吗? [复制]
【发布时间】:2012-07-30 11:13:59
【问题描述】:

可能重复:
Ignore whitespace in HTML

我正在创建一个荷兰食谱网站。问题是通过 Javascript 添加新表单字段时出现的视觉错误。

出现问题的地方

为了描述所有需要的成分,我允许用户在现有的成分表单字段中添加更多的成分表单字段,这些字段是由 HTML 预先定义的。您可以通过按下“添加另一种成分”按钮来添加这些新字段。一个名为 addIngredient() 的 javascript 函数被称为 onclick(为了清楚起见,它被截断,完整代码可以找到 here):

function addIngredient() {
  ingredientCount++;

  //define the elements that should be created
  var Group = document.createElement("span");
  var Quantity = document.createElement("input");
  var Unit = document.createElement("input");
  var Type = document.createElement("input");
  var lineBreak = document.createElement("br");

  //set the attributes for each element
  Group.setAttribute("id", "ingredient_" + ingredientCount);
  Quantity.setAttribute("type", "text");
  Unit.setAttribute("type", "text");
  Type.setAttribute("type", "text");

  //add the ingredient group span and linebreak to the ingredients div
  var ingredientList = document.getElementById("ingredienten");
  ingredientList.appendChild(Group);
  ingredientList.appendChild(lineBreak);

  //add the ingredient form elements to the ingredient group span
  var addElements = document.getElementById("ingredient_" + ingredientCount);
  addElements.appendChild(Quantity);
  addElements.appendChild(Unit);
  addElements.appendChild(Type);
}

会发生什么

通过 JavaScript 添加的输入元素与 HTML 预先创建的元素之间的间距似乎不同。这是显示视觉错误的屏幕截图:

当我从定义预先创建的输入元素的 HTML 中删除返回时,这个多余的间距消失了。

有回报:

<span>
  <input>
  <input>
  <input>
</span><br>

没有回报:

<span>
  <input><input><input>
</span><br>

这使我得出结论,使用 HTML 创建的元素实际上在间距或位置方面受到我编写代码的方式的影响。当然,使用 Javascript 创建的表单元素是在没有任何换行符的情况下生成的,因此这些多余的空格不存在。

我的问题

坦率地说,我有点震惊,在我的 HTML 中点击 return 显然会在网页上输出一些间距。我觉得代码格式化会导致在页面上添加东西是荒谬的。我不想删除代码中的返回值以防止它发生。

除了从我的代码中删除返回以确保我的表单元素之间的那些空格不显示之外,还有其他方法吗?

【问题讨论】:

  • 您不能在生成的 HTML 末尾添加$nbsp; 吗?
  • 当然可以。既然其他用户已经解释了为什么会发生这种情况,这也提供了一个合适的解决方案。
  • 哎呀!我的意思是&amp;nbsp;$ 是如何到达那里的?该死的资本家!
  • 我知道这听起来可能是个奇怪的想法,但我是新来的,我不介意就我提出问题和处理答案的方式提供反馈。根据人们通常的做法,我可能想做不同或更多的事情吗?
  • 我认为你做得很好,你的问题很清楚,你的 cmets 和跟进都很好。我添加了评论而不是答案,因为我想提醒人们&amp;nbsp;,但我不认为它会提供完整的答案。

标签: javascript html webforms


【解决方案1】:

浏览器会进行空格折叠:一个或多个空格字符(空格、制表符、回车)被折叠成一个空格。

我不知道如何规避这种情况。也许您可以将字体大小设置为0?或在您的 JS 中添加一个空格字符。 您还可以尝试将输入字段浮动到左侧 (span &gt; input { float:left; }),它只浮动输入字段而不浮动 span 元素的文本内容。

【讨论】:

    【解决方案2】:

    HTML 标记之间的任何数量的空格,包括换行符、制表符缩进、多个空格等,在呈现时都将被视为一个空格。这是 HTML 的基础。如果您正在使用输出 HTML,则需要注意这一点并在生成 HTML 的代码中相应地处理它。

    【讨论】:

      【解决方案3】:

      在 HTML 元素中,空格被标准化为单个空格。如果您有一些文本、七个空格字符和更多文本,那么这七个空格字符将被规范化为一个空格。同样,如果您有一些文本、一个返回字符和更多文本,则该返回字符将被规范化为一个空格。

      您可能认为这是不可取的,但如果只是默默地删除返回,那么至少会有同样多的奇怪情况。

      您无法阻止这些返回导致输入元素之间存在空格,但您可以在每个动态添加的输入元素之后动态插入空格。这样一来,所有输入、“硬编码”输入和您通过脚本添加的输入之间都有一个空格。

      没有试图让代码看起来漂亮:

      var addElements = document.getElementById("ingredient_" + ingredientCount);
      addElements.appendChild(Quantity);
      addElements.appendChild(document.createTextNode(" "));
      addElements.appendChild(Unit);
      addElements.appendChild(document.createTextNode(" "));
      addElements.appendChild(Type);
      

      那(或类似的东西)应该以与硬编码的间隔相同的方式间隔动态输入。

      【讨论】:

      • 这似乎是要走的路,在这种情况下。感谢您教我有关空白折叠的知识。我必须说我完全没有意识到这一点。这是我第一次遇到它实际上很明显的情况。
      • 值得注意的是,在某些情况下,该规范允许浏览器选择性地完全删除空格。你可能已经猜到了:不同的浏览器在那里表现不同。
      【解决方案4】:

      in another question 所述,这是我知道的唯一解决方案*:

      <span><!--
          --><input><!--
          --><input><!--
          --><input><!--
      --></span><br>
      

      *好吧,如果你想称之为解决方案......

      【讨论】:

        猜你喜欢
        • 2021-07-02
        • 2020-12-25
        • 2015-08-30
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-01-14
        • 1970-01-01
        • 2015-07-05
        相关资源
        最近更新 更多