4

I am using javascript to open a popup and execute some code once it is loaded.

This is the code:

// Öffnen des Print Popups binden.
$('#revi_print').unbind();
$('#revi_print').click(function() {

    // Popup erstellen.
    popup = window.open('report_handle/print.php?filter_report=' + $('#revi').data('filter_report'), "Popup", "width=1024, height=768, scrollbars=yes, toolbar=no, status=no, resizable=yes, menubar=no, location=no, directories=no, top=10, left=10");

    // Code erst ausführen, wenn das Popup geladen ist.
    popup.addEventListener('load', handle_popup, false);
});

It does work fine in Firefox and Google Chrome, however I have realized, that it does not work in the newest Internet Explorer.

From what I have read, addEventListener should be supported above IE9, so theoretically IE 11 should support it - however it seems this is not the case.


This error indicates, that IE11 is not supporting the method...

enter image description here


Is there a simple workaround to make this work?


I have just tried this pice of code:

if (popup.addEventListener){
    alert("firefox, chorome, etc");
    popup.addEventListener('load', handle_popup, false); 
} else if (popup.attachEvent){
    alert("IE");
    popup.attachEvent('load', handle_popup);
}   

Apparently this should work according to different other threads, but it is not the case. The browser does go to the else if, when IE is used - however it still refuses to work.

Could it be, that attachEvent in IE does not work on popups?

enter image description here


I have just tried the method indicated in the first answer.

It works in firefox and chrome, but IE refuses to work, even tough this method does not have the EventListener any more:

// Öffnen des Print Popups binden.
$('#revi_print').unbind();
$('#revi_print').click(function() {

    // Popup erstellen.
    popup = window.open('report_handle/print.php?filter_report=' + $('#revi').data('filter_report'), "Popup", "width=1024, height=768, scrollbars=yes, toolbar=no, status=no, resizable=yes, menubar=no, location=no, directories=no, top=10, left=10");

    // Code erst ausführen, wenn das Popup geladen ist.
    //popup.addEventListener('load', handle_popup, true);

    popup.window.onload=function() { parent.handle_popup(popup); }
});

// Code zum handeln des Popups.
function handle_popup(popup) {
    var selected_report = $('#revi').data('filter_report');
    var jqplot_object = $('#revi_filter_ddReport_' + selected_report + '_jqplot_object').html();
    var has_chart = $('#revi_filter_ddReport_' + selected_report + '_has_chart').html();
    var obj = $.parseJSON($('#revi').data('data').trim());

    // Den Kontent kopieren.
    popup.$('#revi_sec_report_container').html($('#revi_report_container').html());

    // Den Print Button entfernen.
    popup.$('#revi_print').remove();

    // Das chart entfernen.
    popup.$('#revi_chart').empty();

    // Wenn ein Chart gezeichnet werden soll.
    if (has_chart == 1) { 
        var execute_string = $.base64.decode(jqplot_object);
        eval(execute_string); 
    }
}

Next attempt (half successful):

I have added this line of code to the HTML of the POPUP:

enter image description here

This are the changes on the javascript side:

// Öffnen des Print Popups binden.
$('#revi_print').unbind();
$('#revi_print').click(function() {

    // Popup erstellen.
    popup = window.open('report_handle/print.php?filter_report=' + $('#revi').data('filter_report'), "Popup", "width=1024, height=768, scrollbars=yes, toolbar=no, status=no, resizable=yes, menubar=no, location=no, directories=no, top=10, left=10");

    $('body').data('the_popup', popup);

    // Code erst ausführen, wenn das Popup geladen ist.
    //popup.addEventListener('load', handle_popup, true);

    //window.onload=function() { handle_popup(popup); }
});

// Code zum handeln des Popups.
function handle_popup() {

    var popup = $('body').data('the_popup');

    var selected_report = $('#revi').data('filter_report');
    var jqplot_object = $('#revi_filter_ddReport_' + selected_report + '_jqplot_object').html();
    var has_chart = $('#revi_filter_ddReport_' + selected_report + '_has_chart').html();
    var obj = $.parseJSON($('#revi').data('data').trim());

    // Den Kontent kopieren.
    popup.$('#revi_sec_report_container').html($('#revi_report_container').html());

    // Den Print Button entfernen.
    popup.$('#revi_print').remove();

    // Das chart entfernen.
    popup.$('#revi_chart').empty();

    // Wenn ein Chart gezeichnet werden soll.
    if (has_chart == 1) { 
        var execute_string = $.base64.decode(jqplot_object);
        eval(execute_string); 
    }
}

On firefox and Chrome it works perfectly, the popup opens, and the chart that should be drawn on the popup shows up.

Now IE also executes the code for the popup, which is very good, but now only for IE JQPLOT does throw an error somewhere in the library.

I have no clue why this happens, I can only guess that the popup is not jet finished loading, when the code for jqplot is executed.


Got everything working now - the jqplot thing is fixed now...

Andreas
  • 545
  • 2
  • 11
  • 24
  • Possible duplicate of [addEventListener not working in IE8](https://stackoverflow.com/questions/9769868/addeventlistener-not-working-in-ie8) – moon Dec 01 '17 at 09:05
  • perhaps you're in "compatibility" mode – Jaromanda X Dec 01 '17 at 09:07
  • is compartibility mode on per default? dont think so.. I just checked and it seems I have to add pages to compartibility view - to me it looks as it is off per default. – Andreas Dec 01 '17 at 09:12
  • why not `$(popup.document).ready( handle_popup )`? – gurvinder372 Dec 01 '17 at 09:39
  • Please change `popup.window.onload=function() { parent.handle_popup(popup); }` to `popup.window.onload=function() { opener.handle_popup(popup); }` – mplungjan Dec 01 '17 at 12:47

2 Answers2

3

Sounds like a dupe of Detecting the onload event of a window opened with window.open

but I could not see a specific answer of your question in it.

But why not do

window.onload=function() { opener.handle_popup() } // or attachEventListener

in the child window? Not need for attach events that may never be triggered because your attaching may be after the load triggered

TRY IT

Tested and working (after allowing popups) in Chrome Edge, IE11 and FX

mplungjan
  • 169,008
  • 28
  • 173
  • 236
  • Hi, I have tried this and it does work in firefox and chrome but not in IE - see the code in my original question. – Andreas Dec 01 '17 at 11:49
  • The IE does not generate a warning or error message any more by using your method, it simply does not do it. – Andreas Dec 01 '17 at 11:51
  • window.onload=function() { parent.handle_popup(popup); } does not work - not even in firefox or chrome... On the popup there is no javascript, the popup is only a pretty naked HTML page. All javascript has to be executed on the parent window once the popup has loaded. All code I have posted exists on the parent page not at the popup. – Andreas Dec 01 '17 at 12:03
  • Sorry - OPENER, not PARENT. See update: http://plungjan.name/SO/testpopup/parent.html – mplungjan Dec 01 '17 at 12:16
  • In firefox and chrome it works perfectly. In IE it works also, but for some reason I do not understand, IE does not want to draw the chart by using this method - jqplot throws an exception... – Andreas Dec 01 '17 at 12:37
  • I will describe it more complete in my original question. – Andreas Dec 01 '17 at 12:37
  • @mplungjan Do you still have this example online somewhere? I got a 404 on the page you linked to. – Rich May 26 '20 at 16:37
  • @Rich it's there now – mplungjan May 26 '20 at 17:49
  • 1
    @mplungjan Thanks! – Rich May 26 '20 at 18:03
1

As explained in "https://github.com/angular/zone.js/issues/535", another reason sometimes is that IE takes time to return the window object returned by window.open. As a result by the time your addEventlistener code executes, the object doesn't have this function. The workaround I used was:

popup = window.open('report_handle/print.php?filter_report=' + $('#revi').data('filter_report'), "Popup", "width=1024, height=768, scrollbars=yes, toolbar=no, status=no, resizable=yes, menubar=no, location=no, directories=no, top=10, left=10");
var interval = setInterval(function(){
   if(typeof popup.addEventListener === "function"){
   clearInterval(interval);
    popup.addEventListener('load', handle_popup, false);
   }
},100);
Prakash Pazhanisamy
  • 997
  • 1
  • 15
  • 25
NVCoder
  • 201
  • 3
  • 5