【问题标题】:addEventListener does not work in IE 11addEventListener 在 IE 11 中不起作用
【发布时间】:2018-05-15 08:19:27
【问题描述】:

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

这是代码:

// Ö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 中无法运行。

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


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


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


我刚刚尝试了这段代码:

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 - 但是它仍然拒绝工作。

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


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

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

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

下一次尝试(成功一半):

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

这是 javascript 方面的更改:

// Ö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 上完美运行,弹出窗口打开,并显示应在弹出窗口上绘制的图表。

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

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


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

【问题讨论】:

  • 也许你处于“兼容”模式
  • 默认情况下是否开启了兼容模式?不这么认为.. 我刚刚检查了一下,似乎我必须将页面添加到兼容性视图中 - 对我来说,默认情况下它看起来是关闭的。
  • 为什么不$(popup.document).ready( handle_popup )?
  • 请将popup.window.onload=function() { parent.handle_popup(popup); }改为popup.window.onload=function() { opener.handle_popup(popup); }

标签: javascript internet-explorer popup


【解决方案1】:

听起来像是Detecting the onload event of a window opened with window.open的骗子

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

但为什么不这样做

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

在子窗口中?不需要可能永远不会触发的附加事件,因为您的附加可能是在加载触发之后

TRY IT

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

【讨论】:

  • 嗨,我已经尝试过了,它在 firefox 和 chrome 中有效,但在 IE 中无效 - 请参阅我原来问题中的代码。
  • IE不再使用你的方法生成警告或错误消息,它根本不这样做。
  • window.onload=function() { parent.handle_popup(popup);不工作 - 甚至在 firefox 或 chrome 中都没有......在弹出窗口上没有 javascript,弹出窗口只是一个非常裸露的 HTML 页面。加载弹出窗口后,必须在父窗口上执行所有 javascript。我发布的所有代码都存在于父页面上而不是弹出窗口中。
  • 对不起 - 开瓶器,不是家长。查看更新:plungjan.name/SO/testpopup/parent.html
  • @mplungjan 谢谢!
【解决方案2】:

正如“https://github.com/angular/zone.js/issues/535”中所解释的,另一个原因有时是IE需要时间来返回window.open返回的窗口对象。因此,当您的 addEventlistener 代码执行时,该对象没有此功能。 我使用的解决方法是:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-02-22
    • 2015-05-06
    • 2016-10-13
    • 2018-03-29
    • 2017-08-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多