javascript-重新加载iframe内容后获取iframe的网址在Chrome和Safari中不起作用

时间:2019-09-12 09:30:20

标签: javascript google-chrome iframe safari

我正在开发一个移相器游戏,该游戏将通过iframe嵌入到网站中。该游戏支持多种语言,因此我们已经开始使用从其访问游戏的网站作为指标(phaser-game.com/ru将使用俄语,phaser-game.com / ar将使用阿拉伯语,等等)

这是到目前为止的代码(通过window.addEventListener('load', getDomainSetLanguage);触发:

function getDomainSetLanguage()
{
    let url = (window.location !== window.parent.location) ? document.referrer : document.location.href;
    console.log('url = ' + url);

    for (let i = 0; i < COUNTRIES_DOMAIN.length; i++)
    {
        if (url.indexOf(COUNTRIES_DOMAIN[i].URL) >= 0)
        {
            DOMAIN_ID = COUNTRIES_DOMAIN[i].ID;
            LANGUAGE_ID = COUNTRIES_DOMAIN[i].LANGUAGE_ID;
            break;
        }
    }

    if (DOMAIN_ID === -1)
    {
        DOMAIN_ID = 1;
    }

    if (LANGUAGE_ID === -1)
    {
        LANGUAGE_ID = 1;
    }

    console.log('DOMAIN_ID = ' + DOMAIN_ID + "; LANGUAGE_ID = " + LANGUAGE_ID);
}

现在,这在表面上可以正常工作。但是,游戏确实会不时触发一次重新加载,并且当游戏返回时,它现在会获得它自己的URL,而不是父代的/ iframe的。

这导致游戏语言默认为英语。

请注意,这仅在Chrome和Safari中发生。 FireFox可以正常工作。

有什么我想念的吗?或者还有什么我可以尝试的?

我尝试记录document.referrerdocument.location.href的值,但是我只是在浏览器中遇到有关权限和内容的错误,并且游戏默认为英语。

我从here读到,Chrome(可能还有Safari)不会触发iframe中对象的onload函数,但是我不确定这是否适用于我,因为我还有很多其他的与onload相关联的功能可以正常工作。

应该提到我无法修改iframe本身,因此任何解决方案都必须来自游戏本身。

谢谢!

1 个答案:

答案 0 :(得分:0)

let url = (window.location !== window.parent.location) ? document.referrer : document.location.href;

代码中的这一行可以使您在iframe内时,document.referrer用作从中确定语言的URL。

按照MDN page on Document.referrer:

  

Document.referrer属性返回链接到该页面的页面的URI。

     

<iframe>内部,Document.referrer最初将被设置为与父窗口的href的{​​{1}}相同的值。

这意味着它可以按您的经验在初始负载下正常运行。 据我所知,the specification isn't explicit关于如何处理重新加载。这可能是导致浏览器行为不同的原因。认为在重新加载后应该为空不是太疯狂了,因为那一次它不是从父页面加载的。


另一种解决方案是使用Window.location,它始终引用window.parent.location.href父窗口的URL(在Difference between document.referrer and window.parent.location.href中有更多信息)。

您的代码行可能看起来像这样:

iframe