在Internet Explorer中的AJAX请求之后,window.location不起作用

时间:2011-03-14 13:17:41

标签: javascript jquery internet-explorer clickonce window

我正在尝试通过网页上的链接启动ClickOnce应用程序。链接必须转到服务器才能启动应用程序之前请求事务GUID。代码的工作原理如下:

function clickHandler() {
    $.post('/gettransactionid.aspx', function(tranId) {
        console.log("BEFORE");
        window.location = "/deploy/Company.Domain.Product.application?" + tranId;
        console.log("AFTER");
    });
    return false;
}

这在Firefox中完全正常,但在IE中它会导致导航并且不会打开clickonce应用程序。在IE8开发工具的控制台窗口中显示控制台.log BEFORE和AFTER。任何帮助将不胜感激,因为我花了4个小时试图用各种黑客解决它!

我试过了:

  • 将window.location更改为window.open。这只是启动窗口一秒钟而无法启动应用程序。
  • 警告而不是window.location。这没什么。
  • 针对IE7,IE8和IE9。
  • 通过将浏览器安全性添加到队列并在根窗口上下文中处理window.location来规避浏览器安全性。
  • 我检查过gettransactionid.aspx会返回交易ID。
  • 在Firefox中执行 - 它工作正常。

在Microsoft的文档中找到答案:

  

如果您开发了一个使用Active Scripting启动ClickOnce应用程序的自定义网页,您可能会发现该应用程序无法在某些计算机上启动。 Internet Explorer包含一个名为“自动提示文件下载”的设置,该设置会影响此行为。此选项菜单中的“安全”选项卡上提供了此设置,该设置会影响此行为。它被称为自动提示文件下载,它列在下载类别下面。对于Intranet网页,该属性默认设置为“启用”,默认情况下,“Internet网页”设置为“禁用”。当此设置设置为“禁用”时,将阻止以编程方式激活ClickOnce应用程序的任何尝试(例如,通过将其URL分配给document.location属性)。在这种情况下,用户只能通过用户启动的下载启动应用程序,例如,通过单击设置为应用程序URL的超链接。

2011年9月1日更新:具有讽刺意味的是,由于“自动提示下载”被删除,现在已经完全破坏了IE9。

7 个答案:

答案 0 :(得分:4)

答案!

  

如果您开发了一个使用Active Scripting启动ClickOnce应用程序的自定义网页,您可能会发现该应用程序无法在某些计算机上启动。 Internet Explorer包含一个名为“自动提示文件下载”的设置,该设置会影响此行为。此选项菜单中的“安全”选项卡上提供了此设置,该设置会影响此行为。它被称为自动提示文件下载,它列在下载类别下面。对于Intranet网页,该属性默认设置为“启用”,默认情况下,“Internet网页”设置为“禁用”。当此设置设置为“禁用”时,将阻止以编程方式激活ClickOnce应用程序的任何尝试(例如,通过将其URL分配给document.location属性)。在这种情况下,用户只能通过用户启动的下载启动应用程序,例如,通过单击设置为应用程序URL的超链接。

因此,请更改IE安全设置,以便自动提示文件下载。

答案 1 :(得分:3)

我有同样的问题。一种可能的解决方案是将ajax请求从异步更改为同步。如果这样做,则根本不需要“自动提示”。

答案 2 :(得分:0)

尝试稍后调用setTimeout来执行导航。

答案 3 :(得分:0)

您应该为window.location添加完整的网址(包括http://): - )

答案 4 :(得分:0)

我刚才有同样的问题,这与我的FQDN中有一个下划线有关。在FQDN中使用下划线是违法的,但只有Internet Explorer实际阻止它,而其他浏览器使其正常工作。如果您有下划线,Internet Explorer将不会注册cookie ...

如果这不是你的问题,我建议在window.location之前尝试一个e.preventDefault(),看看会发生什么。

答案 5 :(得分:0)

尝试删除第一个斜杠:

window.location = "deploy/Company.Domain.Product.application?" + tranId;

也许IE认为你正试图从根部“部署”。无论如何,我认为使用完整网址=没有误解是一个好习惯

答案 6 :(得分:0)

我同意Mih,因为您无法向用户说明更改其浏览器选项。 如果您使用异步请求,则可以在Internet Explorer中使用。

您可以将$ .post更改为$ .ajax,如下所示:

$.ajax({
  type: 'POST',
  url: url,
  ...
  async:false
});

有关ajax的更多信息:http://api.jquery.com/jQuery.ajax/