JSでHTMLタグ内のHTML全体を文字列として取得する方法はありますか?
document.documentElement.??
document.body.parentElement.innerHTML
JSでHTMLタグ内のHTML全体を文字列として取得する方法はありますか?
document.documentElement.??
document.body.parentElement.innerHTML
回答:
MSが追加outerHTML
とinnerHTML
いくつかの時間前にプロパティを。
MDNによればouterHTML
、Firefox 11、Chrome 0.2、Internet Explorer 4.0、Opera 7、Safari 1.3、Android、Firefox Mobile 11、IE Mobile、Opera Mobile、およびSafari Mobileでサポートされています。outerHTML
であるDOM構文解析とシリアライズ仕様。
ブラウザの互換性については、quirksmodeを参照してください。すべてのサポートinnerHTML
。
var markup = document.documentElement.innerHTML;
alert(markup);
できるよ
new XMLSerializer().serializeToString(document)
IE 9より新しいブラウザー
html
サーバーが実際に送信したことのない属性がタグに追加されました:(
私はdocument.documentElement.outerHTML
あなたのためにそれを返すべきだと思います。
MDNによればouterHTML
、Firefox 11、Chrome 0.2、Internet Explorer 4.0、Opera 7、Safari 1.3、Android、Firefox Mobile 11、IE Mobile、Opera Mobile、およびSafari Mobileでサポートされています。outerHTML
であるDOM構文解析とシリアライズ仕様。
outerHTML
プロパティのMSDNページには、IE 5以降でサポートされていることが記載されています。Colinの回答はW3Cのquirksmodeページへのリンクであり、ブラウザー間の互換性(他のDOM機能についても)の優れた比較を提供しています。
何が返ってくるのか、いろいろ答えてみました。Chromeの最新バージョンを使用しています。
提案がdocument.documentElement.innerHTML;
返されました<head> ... </body>
ギャビーの提案document.getElementsByTagName('html')[0].innerHTML;
は同じことを返しました。
「doctype」以外のすべての提案がdocument.documentElement.outerHTML;
返さ<html><head> ... </body></html>
れました。
あなたはとDOCTYPEオブジェクトを取得することができますdocument.doctype;
:あなたはHTML5を含めまでのすべてのdoctypeのための文字列となどの詳細を抽出するために必要がある場合は、それがここで説明され、この戻りオブジェクトではなく、文字列をJavaScriptで文字列として取得DOCTYPE HTMLの
HTML5だけが欲しかったので、ドキュメント全体を作成するには次のように十分でした。
alert('<!DOCTYPE HTML>' + '\n' + document.documentElement.outerHTML);
document.documentElement.outerHTML
outerHTML
であるDOM構文解析とシリアライズ仕様。
おそらくIEのみ:
> webBrowser1.DocumentText
1.0からのFFの場合:
//serialize current DOM-Tree incl. changes/edits to ss-variable
var ns = new XMLSerializer();
var ss= ns.serializeToString(document);
alert(ss.substr(0,300));
FFで動作する可能性があります。(source-textの非常に最初から非常に最初の300文字、主にdoctype-defsを表示します。)
ただし、FFの通常の[名前を付けて保存]ダイアログは、ページの現在の状態を保存するのではなく、元々読み込まれたX / h / tml-source-textを保存しない場合があることに注意してください。(いくつかの一時ファイルへのssのPOST-upとそれにリダイレクトすると、以前に行われた変更/編集を含む保存可能なソーステキストが配信される可能性があります。)
FFは、「戻る」との状態/値のNICE包含「(など)を保存...」上の良好な回復で驚きますが、入力のようなFIELDS、TextAreaのではないのcontentEditable /ののdesignModeの要素上など、...
xhtml-respでない場合。xml-file(mime-type、filename-extensionだけではありません!)、document.open/write/closeを使用してアプリケーションを設定できます。FFのFile / Saveメニューからのユーザーのsave-dialogに保存されるソースレイヤーへのコンテンツ。参照:http : //www.w3.org/MarkUp/2004/xhtml-faq#docwrite resp。
https://developer.mozilla.org/en-US/docs/Web/API/document.write
X(ht)MLの質問に中立、「view-source:http:// ...」を(script-made !?)iframeのsrc-attribの値として試してください-iframesにアクセスするには- FFのドキュメント:
<iframe-elementnode>.contentDocument
、apprについてはgoogle "mdn contentDocument"を参照してください。たとえば、「textContent」のようなメンバー。'その数年前に手に入れましたが、それをうろつくのは好きではありません。それでも緊急の必要がある場合は、これについて言及してください。
を使用しdocument.documentElement
ます。
ここで同じ質問に回答:https : //stackoverflow.com/a/7289396/2164160
.outerHTML
、を取得するために必要なことdocument.doctype
であり、最も完全な答えはPaoloです。
また<html>...</html>
、<!DOCTYPE ...>
宣言の外側にあるものを取得するには、最も重要なのは、document.childNodesをウォークスルーして、それぞれを文字列に変換することです。
const html = [...document.childNodes]
.map(node => nodeToString(node))
.join('\n') // could use '' instead, but whitespace should not matter.
function nodeToString(node) {
switch (node.nodeType) {
case node.ELEMENT_NODE:
return node.outerHTML
case node.TEXT_NODE:
// Text nodes should probably never be encountered, but handling them anyway.
return node.textContent
case node.COMMENT_NODE:
return `<!--${node.textContent}-->`
case node.DOCUMENT_TYPE_NODE:
return doctypeToString(node)
default:
throw new TypeError(`Unexpected node type: ${node.nodeType}`)
}
}
このコードをnpmのdocument-outerhtmlとして公開しました。
編集上記のコードは関数に依存することに注意してくださいdoctypeToString
。その実装は次のようになります(以下のコードはnpmでdoctype-to-stringとして公開されています)。
function doctypeToString(doctype) {
if (doctype === null) {
return ''
}
// Checking with instanceof DocumentType might be neater, but how to get a
// reference to DocumentType without assuming it to be available globally?
// To play nice with custom DOM implementations, we resort to duck-typing.
if (!doctype
|| doctype.nodeType !== doctype.DOCUMENT_TYPE_NODE
|| typeof doctype.name !== 'string'
|| typeof doctype.publicId !== 'string'
|| typeof doctype.systemId !== 'string'
) {
throw new TypeError('Expected a DocumentType')
}
const doctypeString = `<!DOCTYPE ${doctype.name}`
+ (doctype.publicId ? ` PUBLIC "${doctype.publicId}"` : '')
+ (doctype.systemId
? (doctype.publicId ? `` : ` SYSTEM`) + ` "${doctype.systemId}"`
: ``)
+ `>`
return doctypeString
}
いつも使う
document.getElementsByTagName('html')[0].innerHTML
おそらく正しい方法ではないでしょうが、見れば理解できます。
<html...>
タグを返さないため、これは正しくありません。
私はdoctype htmlが必要で、IE11、Edge、Chromeで正常に動作するはずです。私は以下のコードを使用しましたが、うまく機能します。
function downloadPage(element, event) {
var isChrome = /Chrome/.test(navigator.userAgent) && /Google Inc/.test(navigator.vendor);
if ((navigator.userAgent.indexOf("MSIE") != -1) || (!!document.documentMode == true)) {
document.execCommand('SaveAs', '1', 'page.html');
event.preventDefault();
} else {
if(isChrome) {
element.setAttribute('href','data:text/html;charset=UTF-8,'+encodeURIComponent('<!doctype html>' + document.documentElement.outerHTML));
}
element.setAttribute('download', 'page.html');
}
}
アンカータグでは次のように使用します。
<a href="#" onclick="downloadPage(this,event);" download>Download entire page.</a>
例
function downloadPage(element, event) {
var isChrome = /Chrome/.test(navigator.userAgent) && /Google Inc/.test(navigator.vendor);
if ((navigator.userAgent.indexOf("MSIE") != -1) || (!!document.documentMode == true)) {
document.execCommand('SaveAs', '1', 'page.html');
event.preventDefault();
} else {
if(isChrome) {
element.setAttribute('href','data:text/html;charset=UTF-8,'+encodeURIComponent('<!doctype html>' + document.documentElement.outerHTML));
}
element.setAttribute('download', 'page.html');
}
}
I just need doctype html and should work fine in IE11, Edge and Chrome.
Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.
<p>
<a href="#" onclick="downloadPage(this,event);" download><h2>Download entire page.</h2></a></p>
<p>Some image here</p>
<p><img src="https://placeimg.com/250/150/animals"/></p>
私はouterHTML
要素(メイン<html>
コンテナー)、およびXMLSerializer
を含む他のすべて<!DOCTYPE>
、<html>
コンテナー外のランダムコメント、またはそこにある可能性のあるものすべてに使用しています。空白は<html>
要素の外側では保持されないようですので、デフォルトでで改行を追加していますsep="\n"
。
function get_document_html(sep="\n") {
let html = "";
let xml = new XMLSerializer();
for (let n of document.childNodes) {
if (n.nodeType == Node.ELEMENT_NODE)
html += n.outerHTML + sep;
else
html += xml.serializeToString(n) + sep;
}
return html;
}
console.log(get_document_html().slice(0, 200));