2017-01-05 2 views
-1

У меня есть расширение, которое я использую конфиденциально, что иногда нужно превратить документ svg в html-документ.Правильный способ создания HTML-страницы из пустого документа SVG

Если я обнаруживаю, что страница не содержит элемент тела, и что location.href содержит текст «.svg» (документ является SVG документ) Стараюсь следующие

document.removeChild(document.firstChild); 
var body = document.createElement("body") 
var html = document.createElement("html"); 
html.appendChild(document.createElement("head")); 
html.appendChild(body); 
document.appendChild(html); 

Который, кажется, работает , Осматривая страница показывает стандартный документ

<html> 
    <head></head> 
    <body></body> 
</html> 

Но когда я пытаюсь получить доступ к document.body.style я получаю ошибку пустого Referance. document.body равно null Fair достаточно, я затем попытаться установить document.body элемент непосредственно

// leading on from first snippet 
document.body = body; // line 8712 

и я получаю Uncaught TypeError: Failed to set the 'body' property on 'Document': The provided value is not of type 'HTMLElement'. at contentscript.js:8712

Я просто не могу показаться, чтобы создать годную к употреблению HTML документ из пустого документа. Возможно ли это?

Мне действительно нужна страница, так как перенаправление удалит домен и связанную с ним сессию.

+0

Вам нужно полностью уничтожить документ в пользу нового или вы можете просто создать новое содержимое для 'body'? –

+0

@ScottMarcus Мне нужно избавиться от содержимого svg. Это то, что начинается с страницы «», и все это содержит – Blindman67

+1

@ aw04 Вы начали с документа svg? т.е. адресная строка имеет что-то вроде «http://someDomain.com/someImage.svg» – Blindman67

ответ

2

См http://alohci.net/static/Blindman67_1.svg, который использует

<svg xmlns="http://www.w3.org/2000/svg"> 
    <script type="application/ecmascript"> 
     document.removeChild(document.firstChild); 
     var body = document.createElementNS("http://www.w3.org/1999/xhtml", "body") 
     var html = document.createElementNS("http://www.w3.org/1999/xhtml", "html"); 
     html.appendChild(document.createElementNS("http://www.w3.org/1999/xhtml", "head")); 
     html.appendChild(body); 
     document.appendChild(html); 
     var i = document.createElementNS("http://www.w3.org/1999/xhtml", "i"); 
     i.appendChild(document.createTextNode("Italic text")); 
     document.body = body; // Needed for Firefox. Not needed for Chrome 
     document.body.appendChild(i); 
    </script> 
</svg> 

поставить элементы в правильном пространстве имен.

document.createElement() в документе SVG (т. Е. Документ, не относящийся к XHTML, XML), создаст элементы в нулевом пространстве имен, где они нужны в пространстве имен HTML.

+0

Yup, пространство имен было проблемой. Я смог написать новый DOM, но не смог обработать какой-либо из HTML. Вы также можете использовать '.replaceChild()' вместо '.removeChild()' и (fyi), вы можете создать новый 'DOCTYPE' с' var newDoctype = document.implementation.createDocumentType ('html', '', ' «); document.insertBefore (newDoctype, document.childNodes [0]); ', а не то, что он будет полезен, поскольку документ необходимо перезагрузить для его обработки. –

+0

Спасибо, у меня есть рабочий HTMLDocument, хотя теперь мне нужно создать все элементы с помощью 'document.createElementNS (" http://www.w3.org/1999/xhtml ", elementType)', если я не хочу, чтобы элементы не получали стиль атрибута.Есть два libs и 10K строк кода, а не refactor. Я назначаю свою собственную функцию 'document.createElement', которая работает, но другое расширение, которое я использую, терпит неудачу из-за отсутствующих атрибутов стиля. Есть ли быстрое решение? Если не все, отправьте это как вопрос в другой раз. – Blindman67

Смежные вопросы