Как использовать getComputedStyle с документом, созданным DOMParser (без defaultView или оконных объектов)?

У меня есть этот код (упрощенно):

var s = '<div>html...</div>';  
var parser = new DOMParser();  
var doc = parser.parseFromString(s, 'text/html');  

Полученный объект документа не имеет ни defaultView, ни свойств окна, так есть ли способ вызвать getComputedStyle()?

Чтобы объяснить больше: я использую подобный код в расширении Firefox, который выполняет пакетную обработку DOM для файлов HTML и сериализует, а затем записывает измененные документы обратно на диск.

Как указал Майк, существует скрытое окно DOMWindow, поэтому я адаптировал его код примерно так:

const { Services } = Cu.import("resource://gre/modules/Services.jsm");
var s = '<div style="color:red;font-family:Tahoma">html...</div>';  
var parser = new DOMParser();  
var doc = parser.parseFromString(s, 'text/html');  
var div = doc.querySelector("div");
var win = Services.appShell.hiddenDOMWindow;

var div2 = win.document.importNode(div, true);
var style = win.getComputedStyle(div2);
alert( style.getPropertyValue('color') ); //alerts rgb(255, 0, 0) which is correct!

Спасибо Майк, я никогда не знал, что было скрытое окно DOMWindow.

1 ответ

Решение

Это должно работать с контентом или расширением:

var s = '<div>html...</div>';  
var parser = new DOMParser();  
var doc = parser.parseFromString(s, 'text/html');  
var div = doc.querySelector("div");

var style = window.getComputedStyle(div);

Если у вас нет доступа к окну, например, из расширения, вы можете сделать это следующим образом:

const { Services } = Cu.import("resource://gre/modules/Services.jsm");

var s = '<div>html...</div>';  
var parser = new DOMParser();  
var doc = parser.parseFromString(s, 'text/html');  
var div = doc.querySelector("div");
var win = Services.appShell.hiddenDOMWindow;

var style = win.getComputedStyle(div);
Другие вопросы по тегам