目标:
我有一个名为“ 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/