addEventListener 在 IE 11 中不起作用

2022-01-20 00:00:00 internet-explorer popup javascript

我正在使用 javascript 打开一个弹出窗口并在加载后执行一些代码.

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

这是代码:

// Ö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);
});

它在 Firefox 和 Google Chrome 中运行良好,但我意识到它在最新的 Internet Explorer 中无法运行.

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

根据我的阅读,addEventListener 应该在 IE9 以上得到支持,所以理论上 IE 11 应该支持它——但似乎情况并非如此.

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.

这个错误表明,IE11不支持该方法...

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

是否有一个简单的解决方法来完成这项工作?

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);
}   

显然这应该根据不同的其他线程工作,但事实并非如此.如果使用 IE,浏览器会转到 else if - 但是它仍然拒绝工作.

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.

难道 IE 中的 attachEvent 对弹出窗口不起作用?

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

我刚刚尝试了第一个答案中指出的方法.

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

它在firefox和chrome下都可以,但是IE拒绝工作,即使这个方法也没有EventListener了:

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):

我已将这行代码添加到 POPUP 的 HTML 中:

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

这是 javascript 方面的更改:

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); 
    }
}

在 firefox 和 Chrome 上完美运行,弹出窗口打开,并显示应在弹出窗口上绘制的图表.

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

现在 IE 也执行弹出窗口的代码,这非常好,但现在只有 IE JQPLOT 确实在库的某个地方抛出错误.

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.

我不知道为什么会发生这种情况,我只能猜测在执行 jqplot 的代码时弹出窗口没有完成加载.

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.

现在一切正常 - jqplot 问题现已修复...

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

推荐答案

听起来像 检测用window.open打开的窗口的onload事件

但我无法在其中看到您问题的具体答案.

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

但为什么不这样做

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

试试

在 Chrome Edge、IE11 和 FX 中经过测试和工作(允许弹出窗口后)

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

相关文章