11

I am trying to open a popup like this:

$('#btn').click(function () {
    var popup = window.open('mypage.php', '_blank', 'width=500,height=500');
    var dom = popup.document.body;
    for (i in dom) {
        console.log(dom[i]);
    }
});

Now what I want to do is to get the html from the popup window and also be able to use maybe a jQuery function from the window.opener (the page that opened the popup)

PS. In the console there are a lot of things printed but no html source.

Use this to try: http://jsfiddle.net/JRqTy/

Thanks in advance.

Oscar Jara
  • 14,129
  • 10
  • 62
  • 94

2 Answers2

6

Try:

var html = popup.document.documentElement.outerHTML

EDIT

The window is not loaded immediately. Something like this will work, assuming that you're not attempting to violate the same-origin policy:

$('#btn').click(function() {
    var popup = window.open('[Your URL HERE]', '_blank', 'width=500,height=500');
    
    popup.onload = function() {
        setTimeout(function(){ console.log(popup.document.documentElement.outerHTML) }, 2000);
    }  
});​

Here's a working fiddle.

Note: If you control both the parent and the child source, you could also have the child invoke a method on the parent that passes in it's html:

Child Window

// Call when body is loaded
function SendHtmlToParent() {
    window.opener.HtmlReceiver(document.outerHTML);
}

Parent

function HtmlReceiver(html) {
    console.log(html);
}
James Hill
  • 60,353
  • 20
  • 145
  • 161
  • Actually, the fiddle example is not working, nor can I get it working myself. I've spent several hours and cannot get windows or iframes working with access by the parent/opener. Firefox 63.0.3 (64bit) – David Spector Nov 30 '18 at 18:40
  • @DavidSpector, are you violating the same origin policy? Are the parent and child window on the same domain, or are both of the domains under your control with a valid same origin policy? – James Hill Nov 30 '18 at 19:05
  • They are not only in the same domain but in the same directory. I'm working on a tool to help design websites and it never has to work across different domains. It does have to have a window or pane showing the page under development and be able to manipulate its elements. Thanks for asking. Getting help is hard enough without getting accusations. – David Spector Nov 30 '18 at 23:46
  • Please update your same-origin policy link - it's dead. – Peter VARGA Jan 04 '22 at 09:10
1

Wait...

Note that remote URLs won't load immediately. When window.open() returns, the window always contains about:blank. The actual fetching of the URL is deferred and starts after the current script block finishes executing. The window creation and the loading of the referenced resource are done asynchronously.

MDN

And if you wait, you will get this error:

Unsafe JavaScript attempt to access frame with URL https://www.google.co.il/ from frame with URL http://fiddle.jshell.net/_display/. Domains, protocols and ports must match.

So it can be done with google, unless you're working there...

Fiddle

If you open something "valid" it will work fine.

Working DEMO

gdoron
  • 147,333
  • 58
  • 291
  • 367