在Internet Explorer中,进行AJAX请求后,window.location无法工作

6

我正在尝试通过网页上的链接启动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应用程序。BEFORE和AFTER的console.log在IE8开发工具的控制台窗口中显示。任何帮助将不胜感激,因为我已经花了4个小时尝试使用各种方法解决它!
我尝试过: - 将window.location更改为window.open。这只是启动一个窗口一秒钟后就无法启动应用程序。 - 使用alert而不是window.location。这什么也没做。 - 对抗IE7、IE8和IE9。 - 通过将其添加到队列并在根窗口上下文中处理window.location来规避浏览器安全性。 - 我已经检查了gettransactionid.aspx返回事务ID。 - 在Firefox中操作 - 它正常工作。
在Microsoft的文档中找到答案: 如果您开发了一个自定义Web页面,使用Active Scripting启动ClickOnce应用程序,您可能会发现该应用程序在某些计算机上无法启动。Internet Explorer包含一个称为文件下载的自动提示设置,它会影响此行为。此设置位于选项菜单的安全选项卡中,影响此行为。它被称为文件下载的自动提示,并且在下载类别下列出。默认情况下,该属性对于内部网页设置为启用,对于Internet网页设置为禁用。当此设置被设置为禁用时,任何试图以编程方式激活ClickOnce应用程序(例如,通过将其URL分配给document.location属性)都将被阻止。在这种情况下,用户只能通过用户启动的下载来启动应用程序,例如,通过单击设置为应用程序URL的超链接。
更新:2011年9月1日,由于“自动提示下载”被删除,这在IE9中完全失效了。

你尝试过window.location.href吗? - Ian
是的,我不幸地有过这种经历。结果一样。什么也没发生。 - Deleted
是的。我可以直接使用URL或window.location启动它,但在ajax完成后却不能。 - Deleted
似乎IE9由于新的下载管理器而破坏了这种行为,因此现在不可能实现。Joy - Deleted
7个回答

4

答案!

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

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


这个设置在IE9里吗?我找不到它——“下载”类别只包含两个项目:文件下载和字体下载,而且两者都已经设置为“启用”。有趣的是,在我的情况下,IE会请求.application文件,但却什么也不做。然而,如果我将window.location更改为指向文件下载,它就可以开始工作了(两种情况都发生在jquery document.ready处理程序中)。 - Ben M
有趣。我会在我的IE9虚拟机上看一下。 - Deleted
好的,我看了一下。在IE9 RTM中没有必要这样做。它按预期工作。 - Deleted
这个问题现在在IE9上已经停止工作了,因为自动提示文件下载的功能丢失了。我已经向微软提出了支持案例,让他们来解决这个问题。 - Deleted

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

0

尝试去掉第一个斜杠:

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

可能IE认为您正在尝试从根目录获取“deploy”。无论如何,我认为使用完整的URL是一个好习惯=没有误解


看起来是这样,但它没有启动 ClickOnce 启动器。此外,在 IE9 中,根据分析器没有任何请求被发出,尽管状态栏和地址栏会闪烁一下。 - Deleted

0

我同意Mih的观点,因为你不能要求用户更改他们的浏览器选项。 如果您使用异步请求,则在Internet Explorer中可能会运行良好。

您可以将$.post更改为以下形式的$.ajax:

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

更多关于Ajax的信息请参见这里:http://api.jquery.com/jQuery.ajax/


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

0

你应该为你的window.location添加完整的URL(包括http://):-)


我尝试过了 - 在IE中不起作用。但在Firefox中仍然可以使用。 - Deleted

0

我之前遇到过完全相同的问题,那是因为我的FQDN中有一个下划线。在FQDN中使用下划线是不合法的,但只有Internet Explorer会阻止它,而其他浏览器则可以正常工作。如果您的FQDN中有下划线,Internet Explorer也无法注册cookie...

如果这不是您的问题,我建议在window.location之前尝试e.preventDefault()以查看发生了什么。


FQDN中没有任何内容。在这种情况下,它是IIS7上的本地主机。preventDefault也没有成功。 - Deleted

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