他の回答者はあなたの望み(文字列操作なしでDOMを解析する)が理にかなっているかどうかを推測することに焦点を当てていますが、私はこの答えを合理的なDOM解析方法の比較に捧げます。
<body>
公平に比較するために、解析されたDOMの要素(ルートコンテナーとして)が必要であると想定します。http://jsperf.com/domparser-vs-innerhtml-vs-createhtmldocumentでベンチマークを作成しました。
var testString = '<body>' + Array(100001).join('<div>x</div>') + '</body>';
function test_innerHTML() {
var b = document.createElement('body');
b.innerHTML = testString;
return b;
}
function test_createHTMLDocument() {
var d = document.implementation.createHTMLDocument('');
d.body.innerHTML = testString;
return d.body;
}
function test_DOMParser() {
return (new DOMParser).parseFromString(testString, 'text/html').body;
}
最初の方法は現在の方法です。すべてのブラウザでサポートされています。
2番目の方法には完全なドキュメントを作成するオーバーヘッドがありますが、最初の方法に比べて大きな利点があります。リソース(画像)が読み込まれません。ドキュメントのオーバーヘッドは、最初のドキュメントの潜在的なネットワークトラフィックと比較してわずかです。
最後の方法は、-執筆時点で-Firefox 12以降でのみサポートされており(GreaseMonkeyスクリプトを作成しているため、問題ありません)、このジョブに固有のツールです(前の方法と同じ利点があります)。名前が示すように、これはDOMパーサーです。
ベンチマークは、元のメソッドが最速の4.64 Ops / sであり、次にDOMParserメソッド4.22 Ops/sであることを示しています。最も遅い方法は、3.72 Ops/sのcreateHTMLDocument
方法です。ただし、違いはごくわずかなので、前述の理由から、をお勧めします。DOMParser
あなたがGM_xmlhttprequest
データの取得に使用していることを知っています。ただし、XMLHttpRequest
代わりに使用できる場合は、次の方法を試してみることをお勧めします。応答としてプレーンテキストを取得する代わりに、応答としてドキュメントを取得できます。
var xhr = new XMLHttpRequest();
xhr.open('GET', 'http://www.example.com/');
xhr.responseType = 'document';
xhr.onload = function() {
var bodyElement = xhr.response.body; // xhr.response is a document object
};
xhr.send();
Greasemonkeyスクリプトが単一のページで長時間アクティブになっている場合でも、CORSをサポートしていない他のドメインでこの機能を使用できます。ドメインが他のドメインと等しいドキュメントにiframeを挿入し(例http://example.com/favicon.ico
)、プロキシとして使用します(このページのGMスクリプトもアクティブにします)。iframeを挿入するオーバーヘッドは重要であるため、このオプションは1回限りのリクエストには実行できません。
同一生成元の要求の場合、このオプションが最適な場合があります(ベンチマークはされていませんが、中間の文字列操作の代わりにドキュメントを直接返すとパフォーマンスが向上すると主張できます)。DOMParser
+ text / htmlメソッドとは異なり、responseType="document"
Chrome 18以降、Firefox 11以降、IE10以降などのより多くのブラウザでサポートされています。