1

クラスのすべての子要素を解析する次の関数を作成しました。

function getBodyHTML(data){
    var elements = "";
    var content = $(data).find(".mw-content-ltr").children();
    $(content).each(function(i, row){
        if($(row).is("h2")){        
            elements = elements.concat("<h2 class="header2">Header 2 content is: "+($(row).text())+"</h1>");
        }else if($(row).is("h1")){
            elements = elements.concat("<h1 class="header1">Header 1 content is: "+($(row).text())+"</h1>");
        }else if($(row).is("h3")){
            elements = elements.concat("<h3>"+($(row).text())+"</h3>");
        }else if($(row).is("p")){
            elements = elements.concat("<p>"+$(row).text()+"</p>");
        }

    });

        return elements;
    }

その関数は、この種の html に必要なことを行います。

<h2 class="main-header">Some Text</h2>
<p>Lorem ipsum dolor sit amet, consectetuer adipiscing elit, 
sed diam nonummy nibh. </p>
<p>euismod tincidunt ut laoreet dolore magna aliquam erat 
volutpat. Ut wisi enim</p>
<h1>Another text</h1>
<p>euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim</p>

しかし、HTML が次のようになると、全文を取得できません。

<h2 class="main-header">Some Text</h2>
Lorem ipsum dolor sit amet, consectetuer adipiscing elit, 
sed diam nonummy nibh.
<h1>Another text</h1>
<p>euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim</p>

ご覧のとおり、h2の後の最初のテキストにはタグがありません。

タグなしでそのような種類のテキストを選択するには、関数にどの条件を追加する必要がありますか?

前もって感謝します!

4

3 に答える 3

3

テキストノードを取得するcontents()代わりに使用できます。children()

テキスト ノードには のnodeTypeがあり3ます。

以下にいくつかの例を示します。

http://jsfiddle.net/A2Lyx/

コードを変更する方法は次のとおりです。

function getBodyHTML(data) {
    var elements = "";
    var content = $(data).find(".mw-content-ltr").contents();
    $(content).each(function (i, row) {
        if (row.nodeType == 3) {
            var text = $.trim(row.textContent);
            if (text.length > 0)
                elements = elements.concat("text content: " + text);
        else if ($(row).is("h2")) {
            elements = elements.concat("<h2 class="
            header2 ">Header 2 content is: " + ($(row).text()) + "</h1>");
        } else if ($(row).is("h1")) {
            elements = elements.concat("<h1 class="
            header1 ">Header 1 content is: " + ($(row).text()) + "</h1>");
        } else if ($(row).is("h3")) {
            elements = elements.concat("<h3>" + ($(row).text()) + "</h3>");
        } else if ($(row).is("p")) {
            elements = elements.concat("<p>" + $(row).text() + "</p>");
        }
    });

    return elements;
}
于 2013-09-25T17:50:12.960 に答える
2

.contents()の代わりにメソッドを使用して、ノード.children()を確認できます。nodeType

$(data).find(".mw-content-ltr").contents().each(function(_, row) {
    // ...
    } else if ( row.nodeType === 3 && $.trim(row.nodeValue).length ) {
       var textNodeValue = $.trim(row.nodeValue);
    }
});
于 2013-09-25T17:49:56.500 に答える
1

if ブロックに else を追加する

else{
   elements = elements.concat($(row).html());
}

何かのようなもの:

function getBodyHTML(data){
var elements = "";
var content = $(data).find(".mw-content-ltr").children();
$(content).each(function(i, row){
    if($(row).is("h2")){        
        elements = elements.concat("<h2 class="header2">Header 2 content is: "+($(row).text())+"</h1>");
    }else if($(row).is("h1")){
        elements = elements.concat("<h1 class="header1">Header 1 content is: "+($(row).text())+"</h1>");
    }else if($(row).is("h3")){
        elements = elements.concat("<h3>"+($(row).text())+"</h3>");
    }else if($(row).is("p")){
        elements = elements.concat("<p>"+$(row).text()+"</p>");
    }
    else{
       elements = elements.concat($(row).html());
    }

});

    return elements;
}
于 2013-09-25T17:42:04.867 に答える