SetTimeout重定向不适用于Firefox

时间:2013-12-20 16:08:39

标签: javascript firefox redirect settimeout

我一直在使用一个页面,将用户重定向到已安装的应用程序或网页(后备)。当页面首次通过ClientScript.RegisterStartupScript加载时调用此方法; Javascript部分看起来像这样:

<script type='text/javascript'>var a = window.location.search; setTimeout(function(){ window.location.pathname = '/Fallback.aspx'}, 500); window.location='myapp://open' + a;</script>

到目前为止,此代码段始终在Google Chrome中按预期运行,只要“myapp:// open”无法在指定的时间内正确打开,用户就会将用户重定向到“后备”页面。在Internet Explorer中,它仅在超时值设置为100或更低时才有效。我目前的问题是Firefox,无论超时值设置为何,都无法正确重定向。 (对于Firefox,我已经尝试过低至25和高达2000的值。)

有没有人知道Firefox浏览器可能会采取哪些措施来阻止它重定向,如果有的话,是否有任何已知的解决方法?

非常感谢您的时间和建议。

更新:我从Firefox获得的确切错误页面标题为“地址未被理解”,描述类似于以下内容:“Firefox不知道如何打开此地址,因为协议(myapp) )与任何程序无关。“

更新:要对此进行测试,您可以使用“www.google.com”替换代码中的“/Fallback.aspx”。如果在IE或Chrome中尝试过此操作,则浏览器将无法打开myapp:// open并应将您重定向到Google;这是预期的功能,因为未安装应用程序。但是,在Firefox中,您可能会被留在错误页面,告诉您协议无法识别;它将无法重定向到后备。我希望这有帮助,我为我的问题的原始措辞道歉。

1 个答案:

答案 0 :(得分:0)

我找到了一些不同的方法来解决这个问题,因为任何可能会遇到同样问题的人都会遇到这个问题。 =)第一个是在代码背后使用重定向代码,单挑出需要以不同方式处理的Firefox浏览器:

string userAgent = Request.ServerVariables["HTTP_USER_AGENT"];
                if (userAgent.Contains("Firefox") && !userAgent.Contains("Seamonkey"))
                {
                    ClientScript.RegisterStartupScript(this.GetType(), "checkForApp", "<script type='text/javascript'>var a = window.location.search; try { window.location.href='myapp://open' + a; } catch(e) { window.location.pathname = './Fallback';  }</script>");    //Firefox Only
                }
                else
                {
                    ClientScript.RegisterStartupScript(this.GetType(), "checkForApp", "<script type='text/javascript'>var a = window.location.search; setTimeout(function(){ window.location.pathname = './Fallback.aspx'; }, 100); window.location.href='myapp://open' + a;</script>");    // IE & Chrome
                }

虽然它有效,但我不喜欢这种方法,因为它会检查用户代理。在此之后,有人向我建议我应该在我的后备页面上放置一个iframe来打开应用程序,然后将所有人都引导到后备页面(它仍会打开,但如果安装了应用程序,它也应该打开。)这适用于大多数浏览器但不是Internet Explorer:

<iframe name="open_app" id="open_app" src="myapp://open" style="height: 1px; width: 1px; visibility:hidden;" ></iframe>

我最终决定使用的方法是后备页面上的对象标记。到目前为止,这似乎适用于大多数主流浏览器,并使用Chrome,Firefox,Safari和Internet Explorer成功测试。使用此功能后,仍会在用户的浏览器中打开后备页面,但如果已安装该应用程序,也会打开该应用程序。

<object data="myapp://open<%= Request.Url.Query %>"/>