I got a portion of javascript code embedded in HTML (generated on the server side) that looks like this:
function winWriteMail2(){
var win = open(\'\',\'wi
Have a look at writeCapture.js
Utility to assist the Ajax loading of HTML containing script tags that use document.write
Google Analytics does it this way:
var _gat, gaJsHost = (("https:" == document.location.protocol) ? "https://ssl." : "http://www."); document.write(unescape("%3Cscript src='" + gaJsHost + "google-analytics.com/ga.js' type='text/javascript'%3E%3C/script%3E"));
This code worked for me:
function winWriteMail2(){
var win = open('','wininfo', 'width=400,height=300,scrollbars=yes,resizable=yes');
win.document.open();
win.document.write('<HTML><HEAD><META http-equiv="Content-type" content="text/html; charset=iso-8859-2"><LINK rel="stylesheet" type="text/css" href="/css/main.css">');
win.document.write('</HEAD><BODY BGCOLOR="#f7f3e7">');
win.document.write('this is the body content');
win.document.write('</BODY></HTML>');
win.document.close();
var h = win.document.getElementsByTagName("head")[0];
var js = win.document.createElement("script");
js.type = "text/javascript";
js.src = "js/scriptfile.js";
h.appendChild(js);
}
Here is what I needed to change in your code to make it work:
//From
var js = document.createElement("script");
//To
var js = win.document.createElement("script");
You need to create the script element in the same document that you are appending.
Think your DOM-based code is fine, but try to (a) use the absolute script URL, (b) set the script type and (c) update src after appending, this should make it working more reliably:
var head = document.getElementsByTagName("head")[0];
var script = document.createElement("script");
script.type = "text/javascript";
head.appendChild(script);
script.src = "http://host.tld/js/JSFILE.js";
Hope this helps.
EDIT
By the way, it is good idea to set up kind of callback, to make sure script was loaded before using its code. Code can look similarly to this:
// most browsers
script.onload = callback;
// IE
script.onreadystatechange = function() {
if(this.readyState == "loaded" || this.readyState == "complete") {
callback();
}
}
Here callback is literally the function to execute.
i know this is a 4 y/o thread, but I wanted to add a fix I just combined via a few different articles/questions:
rather than appending the documents (.css, .js, etc) after the document.write call, I altered my open call to look like:
var win = window.open("//"+document.domain, "_blank");//document.domain is the fix
if(win != null)
win.document.write('...');//insert your content, wherever you got it (hand-coded, ajax, etc)
adding '//' will automatically set the protocol (http vs https) and document.domain = well, your domain. essentially, this sets the address bar correctly in IE so that using /foo/bar.js
type src's and href's will be located and work correctly.
hope this helps someone! :P