2

I generate some html content dynamically like:

var content = "<head><title>testtitle</title></head><body>testbody</body>";

Then I get myself a new tab with about:blank, and now I want to display my generated html in this tab. If the tab's contentDocument is newDoc, I thought I just do:

newDoc.documentElement.innerHTML = content;

However, that doesn't work. It seems to have no effect at all. In firebug it seems to work once but screws up firebug at the same time, so I can't verify, source view remains unchanged.

I then tried:

newDoc.getElementsByTagName("head")[0].innerHTML = headContent;
newDoc.body.innerHTML = bodyContent;

Which doesn't change the displayed empty page, also not in the source view, but if I alert newDoc.documentElement.innerHTML, it reflects the changes. It seems like this isn't the document that's displayed any more. Weird.

So my question: how do I do that? Specifically in a firefox extension, if that is important.

Is there maybe a href format with "text://..." instead of "file://..." or something?

Update:

It turns out that I can't only replace the full code this way, I can't even body.appendChild, but I'm sure I did that before, so I compared. Here I get my document this way:

var tab = getBrowser().addTab(); //make new tab
getBrowser().selectedTab = tab;  //bring it to front
var browser = getBrowser().getBrowserForTab(tab); //get the window of the tab
var newDoc = browser.contentDocument;   

Now I can do:

newDoc.location.href = url;

And this works, it loads the given page. So I thought this is the correct document, but if I don't assign a url, but instead try to build the dom myself, it simply doesn't work.

If I do those changes to window.content.document after the tab is in front, it works. So how come these documents are different? If newDoc is the wrong one, how come assigning a location does anything?

Although I can get it to work now, I don't particularly like the solution of getting the document by bringing the tab to the front and then grabbing the window.content document, that feels like a hack and depends on timing.

Lightness Races in Orbit
  • 378,754
  • 76
  • 643
  • 1,055
peter
  • 429
  • 2
  • 7
  • 16
  • 6
    Yes, it's important that you're talking about a Firefox extension, as the programming model is significantly different than programming within web content. – Pointy Jun 27 '10 at 11:45

1 Answers1

0

I just found a nifty jQuery method that might accomplish this: http://api.jquery.com/html/#html2

I created a page with a button that calls the script:

$("html").html("<span>Hello <b>World</b></span>");

This replaces the entire page DOM.