【问题标题】:Adding separators between letters在字母之间添加分隔符
【发布时间】:2012-12-06 04:29:04
【问题描述】:

我有以下 HTML 来为一长串项目提供 ABC 链接,这些项目按字母表的字母分成几页。我无法更改 HTML。

<p>
    <a href="A.html">A</a>

    <!-- all the items on this page start with this letter 
         It is not contained in any special div, just floats among the links -->
    B

    <a href="c.html">C</a>        
    <a href="d.html">D</a>        
    <a href="e.html">E</a>        
    <a href="f.html">F</a>        
    <a href="g.html">G</a>

    <!-- and so on through z -->
</p>

我需要在每个字母之间放置一个分隔符(以下 HTML):

<span class="separator">|</span>

但是,如果我在每个链接之前或之后放置一个分隔符,那么纯字母本身和它周围的其中一个链接之间将没有分隔符。

如何在不更改 HTML 的情况下在每个链接之间放置分隔符,记住任何字母都可以是纯文本,不包含 &lt;a&gt; 或除外部 &lt;p&gt; 之外的任何其他标记?

已编辑以显示所需的结果(多种可能性中的两种)。粗体字母不是链接;所有其他字母是:

A |乙| C | D | E | F ...

一个 |乙| C | D | E | F ...

【问题讨论】:

  • 在 CSS 中添加怎么样? p &gt; a{border-left:1px solid black;} p &gt; a:first-child{border-left:none;}
  • @daniel:这对&lt;a&gt;中未包含的信件有何帮助?
  • 我无法完全理解您希望如何在页面上显示普通字母 - 还带有分隔符? - 如果是这种情况,你可以使用 lettering.js->letteringjs.com
  • 查看您的编辑 - letteringjs 绝对是一个选项,它还可以让您对纯文本进行“强大”的 css 控制 - (简而言之:在 p 上调用 lettering 函数将自动包装所有&lt;span&gt; 中的纯文本字母)

标签: javascript jquery html separator


【解决方案1】:
var separator = "<span class='separator'>|</span>";

$("p").contents().each(function(){
    var $this = $(this);

    if($.trim($this.text()).length>0){
        if(this.nodeType == 3){
            // text node, possibly multiple characters that need separation
            var characters = this.nodeValue.replace(/\s/g, "").split("");
            var output = "";

            for(var i=0; i<characters.length; i++){
                output += " " + characters[i] + separator;
            }                    

            $(this).replaceWith(output + " ");                
        } else {
            $this.after(separator);
        }
    }
});

$(".separator:last").remove();

http://jsfiddle.net/kJ3yW/1/

【讨论】:

  • 已更新以处理存在 2 个连续非链接字符的可能性。
  • 非常聪明地考虑到这种可能性。谢谢!
  • 一个问题:我需要添加的不仅仅是 |但是 |
  • 谢谢!还有一件事——必须删除 Z 之后的最后一个 &lt;span class="separator"&gt;|&lt;/span&gt;
  • 知道了 - 在末尾添加了$("span.separator:last").remove();
【解决方案2】:

试试这个:

var p = // some method of getting the correct <p> tag
var c = p.childNodes, i, isfirst = true, s;
for(i=0;i<c.length;i++) { // skip the first child node
  if( c[i].tagName || c[i].nodeValue.match(/[a-z]/)) {
    // if node is a tag or a non-empty text node
    if( isfirst) isfirst = false; // skip first node
    else {
      s = p.insertBefore(document.createElement('span'),c[i]);
      s.className = "separator";
      s.appendChild(document.createTextNode("|"));
      i++; // IMPORTANT! Adding a node requires us to manually iterate forward one step!
    }
  }
}

【讨论】:

  • 使用var p = $(".abcLinks p")获取正确段落时,p.childNodes未定义。
  • 如果我使用p.contents()而不是p.childNodes,s.appendChild(...)会返回错误:Uncaught TypeError: Object [object Object] has no method 'appendChild'
  • 不要使用jQuery,它的麻烦大于它的价值。