SCORM:SecurityError:阻止来自访问跨域框架的同源框架。

6

我知道有很多类似的问题,唯一的区别是我在同一个域名下为两个页面提供服务时遇到了此问题。以下示例中可以看到这一点。

    Uncaught DOMException: Blocked a frame with origin "https://content.samba.net" from accessing a cross-origin frame. 
  
at findAPI (https://content.samba.net/00/07/19-10/scorm_support/scorm_support.js:14:10)   
at getAPI (https://content.samba.net/00/07/19-10/scorm_support/scorm_support.js:61:13)   
at https://content.samba.net/00/07/19-10/SCORM.htm:200:16

这不应该只发生在不同的域之间吗?

============================== 编辑 =======================================
当然,我发布文章几秒钟后就找到了问题所在。 SCORM软件包有一个定位SCORM API的函数。它查看顶部和打开程序。在我的情况下,Window Opener在不同的域中,正在尝试访问它。
我会留下来供历史记录。我的回答有详细信息。


如果iframe具有sandbox属性,请尝试将allow-same-origin添加到值中。原因是,如果不包括allow-same-origin,浏览器会将iframe的来源设置为null,并且从https://content.samba.net到null来源的请求是跨源请求。请参阅https://dev59.com/1qLia4cB1Zd3GeqPquoB#44765536和https://dev59.com/KE0GtIcB2Jgan1znypVz#xRDsnYgBc1ULPQZFMzIk的答案,如果您需要更多详细信息,请参见https://dev59.com/31gQ5IYBdhLWcg3wxGzs#42242802。 - sideshowbarker
@sideshowbarker 这很有趣,但我的问题实际上更琐碎和简单 - 我编辑了我的问题以反映它。 - Itay Moav -Malimovka
1个回答

1
问题已经解决,原因是SCORM协议特定的。
当您打开一段SCORM内容(包括html、flash、js和其他媒体文件)时,它首先会尝试查找SCORM API。
SCORM API是JS,必须在加载SCORM内容的窗口中。
在某些SCORM包中,查找API的函数会递归地查找顶级窗口,即启动整个过程的初始窗口。
在我的情况下,它是我站点上的一个窗口,弹出了我CDN上的SCORM启动器,其具有不同的域名。

要解决此问题,我所做的只是欺骗浏览器认为SCORM启动器(我在CDN上弹出的窗口)是顶部窗口,通过在其中添加以下两行JS代码:

window.top=window;
window.opener=window;

尝试在我的父页面上添加此内容,似乎不起作用,仍然遇到相同的问题。 - oma0256
@oma0256 他们是同一个域吗?父页面和 SCORM 窗口? - Itay Moav -Malimovka
不行,领域不同。 - oma0256
@oma0256,我相信(虽然可能有其他方法),容纳SCORM API的窗口必须与内容位于同一域中 - 这就是我做的方式。 - Itay Moav -Malimovka
@ItayMoav-Malimovka 你好,你有这方面的示例代码吗?我尝试将SCORM集成到我的项目中,但仍然失败了,最后一个错误是这个cors问题。如果你能分享一些示例给我,那将非常有帮助,谢谢! - Potamir

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接