Чи є спосіб у 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специфікації .
Сторінка MSDN на outerHTML
властивості зазначає, що вона підтримується в IE 5+. Відповідь Коліна посилається на сторінку Quirksmode W3C, яка пропонує хороше порівняння сумісності між браузерами (і для інших функцій DOM).
Я спробував різні відповіді, щоб побачити, що повернуто. Я використовую останню версію Chrome.
Пропозиція document.documentElement.innerHTML;
повернулася<head> ... </body>
Пропозиція Габі document.getElementsByTagName('html')[0].innerHTML;
повернула те саме.
Пропозиція document.documentElement.outerHTML;
повернулася <html><head> ... </body></html>
- це все, крім «доктрипу».
Ви можете отримати об’єкт doctype за допомогою document.doctype;
цього повертає об’єкт, а не рядок, тому, якщо вам потрібно витягнути деталі у вигляді рядків для всіх типів до та включаючи HTML5, це описано тут: Отримайте DocType HTML як рядок з Javascript
Я хотів лише HTML5, тому мені було достатньо наступного, щоб створити весь документ:
alert('<!DOCTYPE HTML>' + '\n' + document.documentElement.outerHTML);
document.documentElement.outerHTML
outerHTML
знаходиться в специфікації DOM для розбору та серіалізації .
ПРОБЛЕБНО ТІЛЬКИ IE:
> webBrowser1.DocumentText
для FF з 1,0:
//serialize current DOM-Tree incl. changes/edits to ss-variable
var ns = new XMLSerializer();
var ss= ns.serializeToString(document);
alert(ss.substr(0,300));
може працювати у ФФ. (Показує ДУЖЕ ПЕРШИХ 300 символів від ДУЖЕ початку початку вихідного тексту, переважно доктіфів.)
Але врахуйте, що звичайний "Зберегти як" -Діалог FF НЕ МОЖЕ зберегти поточний стан сторінки, скоріше спочатку завантажений X / h / tml-source-text !! (POST-ups ss до деякого temp-файлу та переадресація до нього може доставити збережений вихідний текст З попередньо внесеними до нього змінами / правками.)
Хоча FF дивує хорошим відновленням на "назад" та NICE включенням станів / значень у "Зберегти (як) ..." для вхідних полів, textarea тощо, а не на елементи в contenteditable / designMode ...
Якщо НЕ xhtml- відповідно. xml-файл (тип mime, НЕ просто розширення імені файлу!), можна використовувати document.open/write/close для встановлення програми. вміст у вихідний рівень, який буде збережено у діалоговому вікні збереження користувача з меню Файл / Зберегти FF. див .: http://www.w3.org/MarkUp/2004/xhtml-faq#docwrite респ.
https://developer.mozilla.org/en-US/docs/Web/API/document.write
Нейтрально до запитань X (ht) ML, спробуйте "view-source: http: // ..." як значення src-attrib (iframe !?) iframe, - для доступу до iframes- документ у ФФ:
<iframe-elementnode>.contentDocument
, див. google "mdn contentDocument" для програми. членів, наприклад, "textContent", наприклад. "Зрозумів, що років тому, і не люблю повзати за цим. Якщо все-таки нагальна потреба, згадайте про це, що я повинен зануритися в ...
Використовуйте document.documentElement
.
На те саме запитання відповіли тут: https://stackoverflow.com/a/7289396/2164160
.outerHTML
і отримати document.doctype
, і найповніша відповідь - це Паоло .
Щоб також отримати речі поза <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}`)
}
}
Я опублікував цей код як document-externalhtml у npm.
редагувати Примітка. Код, наведений вище, залежить від функції 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...>
тег.
Мені просто потрібний HTML-файл doctype, і він повинен добре працювати в 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));
Ви повинні переглядати документ дочірніх вузлів і отримання зовнішнього вмісту HTML.
у VBA це виглядає приблизно так
For Each e In document.ChildNodes
Put ff, , e.outerHTML & vbCrLf
Next e
використовуючи це, ви можете отримати всі елементи веб-сторінки, включаючи вузол <! DOCTYPE>, якщо він існує