1

这可能看起来很奇怪。我有一个 id 为 'quotes' 的 div,里面有一个块引用。如果引用的文本是诗歌,我认为添加换行符会很有趣,并且我认为您可以使用“@”作为条件换行符,然后将其替换为 br 元素,如下所示:

function addBr() {
    var c = document.getElementById("quotes");
    var t = c.getElementsByTagName("blockquote");    
    var reg = new RegExp("@", "g");
    for (var i = 0; i < t.length; i++) {
        var r = t[i].lastChild.nodeValue.match(reg);
        if (r !== null) {
            var text = t[i].childNodes[0];
            var q = t[i].lastChild.nodeValue.indexOf("@");
            var x = document.createElement("br");
            t[i].insertBefore(x, text.splitText(q));
            t[i].lastChild.nodeValue = t[i].lastChild.nodeValue.replace(/\@/g, "");
        }
    }
}

这有效,但仅适用于第一个实例,所以我需要一个循环,但我无法弄清楚。div 应该是这样的:

<div id = 'quotes'>
<blockquote> Some line, @ Some line, @ Some line@ </blockquote>
</div>

任何提示将不胜感激。

4

2 回答 2

1

@从文本节点中的最后一个匹配开始并向后工作。以下函数执行此操作,并且还具有消除不必要的正则表达式的好处,使用更清晰的变量名称并且更短:

function addBr() {
    var c = document.getElementById("quotes");
    var t = c.getElementsByTagName("blockquote");
    for (var i = 0; i < t.length; i++) {
        var splitPos, textNode = t[i].lastChild;

        while ( (splitPos = textNode.data.lastIndexOf("@")) != -1 ) {
            var newTextNode = textNode.splitText(splitPos);

            // Remove the @ from the start of the new text node
            newTextNode.deleteData(0, 1);

            var br = document.createElement("br");
            t[i].insertBefore(br, newTextNode);
        }
    }
}
于 2011-04-17T23:06:40.533 回答
0

我建议简单地这样做:

function addBr() {
    var c = document.getElementById("quotes");
    var t = c.getElementsByTagName("blockquote");    
    for (var i = 0; i < t.length; i++)
        r.innerHTML = r.innerHTML.replace(/@/g, "<br />");
}

什么是“条件换行”?我在您的代码中看不到任何决定何时换行的内容...

于 2011-04-17T21:18:31.477 回答