A pesar de que tu src = encodeURI
deberías funcionar, yo habría tomado un camino diferente:
var iframe = document.createElement('iframe');
var html = '<body>Foo</body>';
document.body.appendChild(iframe);
iframe.contentWindow.document.open();
iframe.contentWindow.document.write(html);
iframe.contentWindow.document.close();
Como esto no tiene restricciones de dominio x y se realiza completamente a través del iframe
controlador, puede acceder y manipular el contenido del marco más adelante. Todo lo que debe asegurarse es que los contenidos se hayan procesado, lo que (según el tipo de navegador) comenzará durante / después de que se emita el comando .write, pero no necesariamente cuando close()
se llama.
Una forma 100% compatible de hacer una devolución de llamada podría ser este enfoque:
<html><body onload="parent.myCallbackFunc(this.window)"></body></html>
Iframes tiene el evento onload, sin embargo. Aquí hay un enfoque para acceder al html interno como DOM (js):
iframe.onload = function() {
var div=iframe.contentWindow.document.getElementById('mydiv');
};