目标:

我有一个名为“ ImageGallery”的ReactJs Web应用程序,当前已集成到我们的业务套件系统中(这是一个包含旧技术(主要是Web表单)的庞大系统)。在我们的系统中,我们需要添加一个按钮以启动浏览器窗口以旋转应用程序。

ImageGallery应用程序依赖于当前系统将数据传递给它,以进行显示,这意味着,当ImageGallery应用程序加载时,它将在业务套件系统端调用一个函数,例如

window.parent.loadData()


由于数据是通过JavaScript传递的,因此没有ajax调用。

码:

function showImage() {
    var imageGalleryWindow = window.open('/ImageGallery', '_blank', 'height=' + window.screen.availHeight + ',width=' + window.screen.availWidth + ',scrollbars=yes,menubar=no,resizable=yes,toolbar=no,location=no,status=no');
    imageGalleryWindow.loadData= loadData;
}


loadData()函数在当前JavaScript文件上可用,并将被传递到新窗口,以便ReactJS应用程序可以使用它。

问题:

该应用程序可与Chrome / Firefox / Edge完美配合,但不适用于IE11。有时会加载IE 11,有时无法加载。仔细观察之后,我发现存在比赛条件。

基本上,每当应用程序失败时,loadData()函数都不会传递到新创建的窗口。同样,仅适用于IE11,所有其他浏览器似乎都不错。

我尝试过的

我尝试了以下方法:

1>试图在这样的ImageGallery应用程序中放置一个等待功能:

static resolveDocuments(){
    if(typeof window.parent.loadData === 'function'){
      // do the work to show image
    } else {
      setTimeout(this.resolveDocuments, 2000);
    }
  }


我正在使用redux thunk,但没有得到任何运气。

2>将imageGalleryWindow.loadData= loadData;放入window.onload(),不好的主意,但是还是尝试了

3>将imageGalleryWindow.loadData= loadData;放入imageViewerWindow.document.addEventListener("DOMContentLoaded", function (event) {}仍然是个坏主意,但还是尝试了

4>创建了一个新的ImageGallery.html,使用iframe托管ImageGallery应用。在部分中,包括来自父级的JavaScript文件。没运气

5>创建了一个Webform页面ImageGallery.aspx,使用iframe托管ImageGallery应用。在部分中,包括来自父级的JavaScript文件。没运气。

感谢您抽出宝贵的时间阅读完此问题,如果您有想法可以尝试,请告诉我。

非常感谢!

射线

最佳答案

我最终拥有的解决方案是html 5本地存储:


在调用window.open()填充新窗口之前,请在html 5本地存储中创建一个需要传递的所有数据的条目。
加载图片库应用程序时,请检查是否存在本地存储项目,如果存在,请提取数据。数据将一直存在,因为它在生成新窗口之前进行设置,并且由于两个页面都来自同一域,因此它们都可以访问相同的本地存储。
为了避免安全问题,图库应用程序从本地存储读取数据后,我将数据保留在应用程序中,然后删除本地存储条目。


希望这对其他人有帮助。

关于javascript - 带有JavaScript脚本的IE 11 window.open()加载竞争条件问题,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/45017450/

10-11 14:07