82

I have a Javascript function that is passed a string. The string that it is passed is an entire webpage, including the header. I need the Javascript to replace the entire current page, head and all with the new content.

Consider the following HTML file:

<html>
  <head>
    <script language="Javascript">
      <!--
      var newContent='<html><head><script language="Javascript">function Hi() {alert("Goodbye World");}</script></head><body onload="Hi();">New Content</body></html>';
      function ReplaceContent(NC) {
        document.body.innerHTML=NC;
      }
      function Hi() {
        alert("Hello World");
        ReplaceContent(newContent);
      }
      -->
    </script>
  </head>
  <body onload="Hi();">
    Original Content
  </body>
</html>

In this case, the passed string is:

<html><head><script language="Javascript">function Hi() {alert("Goodbye World");}</script></head><body onload="Hi();">New Content</body></html>

But of course, since the "ReplaceContent" function is only replacing the body, but not the header, I never get the "Goodbye World" alert.

Ignoring "why I would want to do this", How can I dynamically replace the entire page, including the header, and javascript functions?

Please remember the "source" html ('newContent' above) exists only as a string, it does not exist on a server anywhere, so I cannot just redirect to it.

What changes I make to "ReplaceContent" above to cause the "Goodbye World" alert to appear once the content is replaced? Please keep in mind I cannot know in advance the value of the newContent variable!!

E_net4 - Krabbe mit Hüten
  • 24,143
  • 12
  • 85
  • 121
Joshua
  • 6,413
  • 15
  • 53
  • 76

5 Answers5

78

Use document.write.

<html>
  <head>
    <script language="Javascript">
      <!--
      var newContent='<html><head><script language="Javascript">function Hi() {alert("Goodbye World");}</script></head><body onload="Hi();">New Content</body></html>';
      function ReplaceContent(NC) {
        document.open();
        document.write(NC);
        document.close();
      }
      function Hi() {
        ReplaceContent(newContent);
      }
      -->
    </script>
  </head>
  <body>
    Original Content
    <a href="javascript:Hi()">Replace</a>
  </body>
</html>
Macbric
  • 462
  • 4
  • 10
Dark Falcon
  • 42,395
  • 5
  • 80
  • 94
  • Although this is working for the provided example, if I try it on a real live page, like a facebook page, for example, it doesn't work. The code will work in an iframe, but when I try to "run" the same code by using document.write, I don't get the same result. What else could be missing? – Joshua Nov 27 '10 at 19:03
  • When do you attempt to execute it? Another thing you might try would be a document.open, as recommended in one of the other answers. – Dark Falcon Nov 27 '10 at 21:56
  • Does the script have to be in the head in this case? – GiantCowFilms Dec 29 '14 at 17:20
  • If you have javascript running on the ondocumentready event in the resulting html, it will not execute in IE11/Edge – jnoreiga Aug 22 '18 at 16:41
  • I tried using this method, but it writes the imported js variables again, therefore you get an error for declaring the same variables. Used document.querySelector('html').innerHTML instead – Roy Levy Apr 05 '20 at 09:11
16

Script

javascript:document.open('text/html');document.write('<!DOCTYPE HTML><html><head><meta http-equiv="Content-Type" content="text/html; charset=utf-8"><title>HAI</title></head><body><h1>OMG HAI2U!!!1</h1></body></html>');document.close();

DOM snapshot of the resulting page

<html><head><meta http-equiv="Content-Type" content="text/html; charset=utf-8"><title>HAI</title></head><body><h1>OMG HAI2U!!!1</h1></body></html>
Free Consulting
  • 4,230
  • 1
  • 27
  • 49
6
$("html").html('your page html here');
Robin Maben
  • 20,994
  • 16
  • 62
  • 96
  • Robin, thanks for your answer.This changes the html content of the same page. Is it possible to change the content of another page with this content. Eg; From index.html I want to change index1.html content. Just like $("index1.html").html('your page html here'); – Nijil Nair Nov 05 '13 at 06:04
  • 1
    @NijilNair: I don't understand what you mean by another page. Do you mean you have several `iframe`s embedded in one page? – Robin Maben Nov 05 '13 at 06:33
4

document.getElementsByTagName("html")[0].innerHTML Contains both head and body tags. I Usually avoid document.open\write\close

YoniXw
  • 356
  • 3
  • 9
-5

var script = document.createElement('script');
script.src = 'http://code.jquery.com/jquery-1.7.2.min.js';
script.type = 'text/javascript';
document.getElementsByTagName('head')[0].appendChild(script);