3

現在、私は Internet Explorer アドオンに取り組んでいます。これは、HTML ドキュメントをスキャンしてプレーン テキストの URL を探し、それらを「リンク化」することになっています。

私は Web サイトの DOM にアクセスでき、すべての DOM ノードをトラバースし、RegEx を使用して「リンク」を検索して、これらのテキストを HTML コードに置き換えることを考えていましたが、IHTMLElement オブジェクトの「InnerText」プロパティを変更する場合、そのすべての子ノードが失われ、Web サイトが深刻に混乱します。

ここにいくつかのコードがあります:

//This method is called when IE has finished loading a page
void _webBrowser2Events_DocumentComplete(object pDisp, ref object URL)
{
    if (pDisp == _webBrowser2)
    {
        HTMLDocument pageContent = _webBrowser2.Document;
        IHTMLElement bodyHtmlElmnt = pageContent.body;
        fixElement(bodyHtmlElmnt);
    }   
}

そして、ここに fixElement-method があります:

void fixElement(IHTMLElement node)
{
    if (node.innerText!=null && ((IHTMLElementCollection)node.children).length==0)
    {
        node.innerText= node.innerText.Replace("testString", "replaceWithThis");
    }

    foreach (IHTMLElement child in (node.children as mshtml.IHTMLElementCollection))
    {
        fixElement(child);
    }
}

これは機能しますが、子を持たないノードに対してのみです。

誰でもこの問題で私を助けてくれませんか、私はとても感謝しています!

よろしく

//ヘンリク

4

4 に答える 4

2

まあ、私には明らかなようです(しかし、私はそれをテストしませんでした)、削除する必要があります

((IHTMLElementCollection)node.children).length==0

メソッド fixElement の最初の行から:

void fixElement(IHTMLElement node)
{
    if (node.innerText!=null) // && ((IHTMLElementCollection)node.children).length==0)
    {
         node.innerText= node.innerText.Replace("testString", "replaceWithThis");
    }
    ...
}
于 2012-11-21T08:24:18.573 に答える
2

このような javascript を使用したくない理由 http://userscripts.org/scripts/review/1352 次に、C# コードを使用してこの javascript を実行します。ただ

webBrowser1.Navigate(new Uri("javascript:<YOURSCRIPT>"));

これの良いところは、再発明することなく多くのことを実行できることです.

スクリプトがある場合 (このような大きい場合、このスクリプトを使用して *.js ファイルから挿入できます)

javascript:(function(){document.body.appendChild(document.createElement('script')).src='<YOUR SCRIPT URL>';})();

インターネットまたはローカルでホストされている JavaScript に置き換えます (ローカルで file:// url 形式を使用する場合)

于 2010-09-27T11:25:40.370 に答える
1

できることは、子ノードを一時 IHTMLElement に格納し、目的の要素を変更してから、ノードを変更された要素に再度挿入することです。

お役に立てば幸いです。

于 2010-09-26T19:09:22.277 に答える
1

おそらく、innerHTML プロパティの代わりに innerText を使用する必要があります。その後、この条件を削除できます: ((IHTMLElementCollection)node.children).length==0

于 2010-09-26T19:10:36.323 に答える