1

これは奇妙に思えるかもしれません。IDが「quotes」のdivがあり、その中にblockquoteがあります。引用されたテキストが詩である場合、改行を追加するのは興味深いと思いました。条件付きの改行として「@」を使用し、次のようにこれを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 に答える