【问题标题】:Avoid line break when using jquery append() or html()使用 jquery append() 或 html() 时避免换行
【发布时间】:2013-03-08 23:25:30
【问题描述】:

起初我的 DOM 中有这个:

<li>
  <span>A</span>
</li>

当我这样做时:

$("li").append("&lt;span&gt;B&lt;/span&gt;");


如果我查看 DOM,这就是我得到的结果:

<li>
  <span>A</span>
  <span>B</span>
</li>


但我想拥有

<li>
   <span>A</span><span>B</span>
</li>


我需要在同一行显示 span 以避免在两个元素之间显示空白。

使用 javascript innerHTML,问题与 jQuery 相同,用于 append 和 html 函数。

Here is a jsFiddle

感谢您的帮助

【问题讨论】:

  • 如果您使用 firebug 查看源代码,您会看到它的格式与您的第一个示例相同。
  • 您确定这样做时会出现一个空格?
  • 它似乎可以与 .append 正常工作,因为你有它:jsfiddle.net/ExplosionPIlls/LZy6L
  • 没有换行符,这只是您的源代码查看器格式化它以提高可读性的方式。
  • 两种情况的输出是一样的

标签: jquery html append line-breaks


【解决方案1】:

您可以通过简单地使用after() 代替append() 来解决或至少避免该问题:

$("li span").last().after("<span>C</span>");

$("li span").last().after("<span>C</span>");
$('#generatedHTML').text($('li').html());
#generatedHTML {
  white-space: pre-wrap;
  font-family: mono;
  padding: 0.5em;
  margin: 0;
  background-color: #eee;
}
#generatedHTML::before {
  content: "Created HTML: ";
  color: #999;
  display: block;
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<ul>
  <li>
    <span>A</span>
  </li>
</ul>
<div id="generatedHTML"></div>

另外,请注意我更正了您的 HTML:li ulol 的直接子代有效(不应包含在 任何其他元素)。

此外,您可以使用更复杂的替代方法:

$("li").append("<span>B</span>").contents().filter(function(){
    return this.nodeType === 3;
}).remove();

$("li").append("<span>B</span>").contents().filter(function(){
    return this.nodeType === 3;
}).remove();
$('#generatedHTML').text($('li').html());
#generatedHTML {
  white-space: pre-wrap;
  font-family: mono;
  padding: 0.5em;
  margin: 0;
  background-color: #eee;
}
#generatedHTML::before {
  content: "Created HTML: ";
  color: #999;
  display: block;
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<ul>
  <li>
    <span>A</span>
  </li>
</ul>
<div id="generatedHTML"></div>

虽然已经有一段时间了,但我认为还值得添加上面的纯 JavaScript 版本:

let htmlToAppend = '<span>B</span>',
  span = document.querySelector('li span');

span.insertAdjacentHTML(
  'afterend', htmlToAppend
);
document.querySelector('#generatedHTML').textContent = span.parentNode.innerHTML;

let htmlToAppend = '<span>B</span>',
  span = document.querySelector('li span');

span.insertAdjacentHTML(
  'afterend', htmlToAppend
);
document.querySelector('#generatedHTML').textContent = span.parentNode.innerHTML;
#generatedHTML {
  white-space: pre-wrap;
  font-family: mono;
  padding: 0.5em;
  margin: 0;
  background-color: #eee;
}

#generatedHTML::before {
  content: "Created HTML: ";
  color: #999;
  display: block;
}
<ul>
  <li>
    <span>A</span>
  </li>
</ul>
<div id="generatedHTML"></div>

参考资料:

【讨论】:

  • 很好的答案!非常感谢您的帮助!
  • 不客气,我很高兴能帮上忙! =)
  • 我喜欢参考 :) 即使它看起来比以前有点奇怪,但它完全有道理并且像魅力一样工作。
【解决方案2】:

因此,答案是您在源代码中看到的情况并非如此:只有一行或几行标记,它们都由浏览器实现为相等的 DOM。空白问题可能是由错误的样式引起的。所以,我建议你先检查一下。

【讨论】:

  • 我已经检查了空白问题并找到了不同的解决方案。更好的方法是将跨度放在同一条线上。似乎没有跨浏览器的 CSS 解决方案(对某些浏览器不使用 hack)
  • 这不是真的。内联元素之间的空白(并且换行符算作一个)将导致呈现的 HTML 中的空白。 There are some hacks around it 但他们中的大多数人需要控制 HTML 源代码,所以提问者有一个有效的观点。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-10-17
  • 1970-01-01
  • 1970-01-01
  • 2015-11-08
  • 2011-03-02
相关资源
最近更新 更多