【问题标题】:angular2: why window.location.href causes page refresh on Firefox but href don'tangular2:为什么 window.location.href 会导致 Firefox 上的页面刷新,但 href 不会
【发布时间】:2017-06-10 19:30:21
【问题描述】:

我正在使用 Angular2,并且我有一种下载文件的方法...一切正常,但我使用的是 <a> 并使用 href='routetodownload' 下载了文件在某些​​情况下我被要求禁用此链接并且然后决定将<a> 更改为<button>(无论哪种方式,链接都作为按钮工作)并且这样做,而不是使用href 属性,我创建了一个函数。
HTML

<button (click)="download(url)">download</button>

打字稿

download(url) {
    window.location.href = url;
}

但这会在firefox上导致奇怪的行为,当我点击下载时,会出现保存对话框,但在它后面,页面刷新。使用&lt;a href='url'&gt;时,出现另存为对话框时页面不刷新

只有在使用 Firefox 时才会发生这种情况...Edge 和 Chrome 在这两种情况下都可以正常工作。

我想知道为什么 window.location.href 会在 Firefox 上导致自动刷新。

如果有人对此有任何想法,请告诉我

更新

毕竟,问题出在NG Live Development Server(来自 angular-cli ng serve 命令)...我不知道为什么这只发生在 Firefox 上。问题是,我的应用程序托管在 IIS 上,使用它的解决方案没有刷新。

稍后我会和 angular-cli 团队的人一起检查一下这种行为可能是什么......

谢谢大家。

问候

【问题讨论】:

  • @GünterZöchbauer 我虽然是同样的事情,但仍然不明白为什么锚href没有发生这种情况......你知道如何避免这种行为吗?
  • @Pointy 谢谢,但没用。我什至没有表格是这个页面;)

标签: javascript angular firefox typescript


【解决方案1】:

这只发生在本地 angular-cli 实时服务器上,因为默认情况下,所有路由都会路由到 /index.html,它是应用程序的根目录。 Angular 路由器找不到您的文件 URL,只会将您带到默认路由。

【讨论】:

    【解决方案2】:

    我总是用这个:

    &lt;a href="/images/myw3schoolsimage.jpg" download&gt;

    添加下载属性以获得更好的结果。

    【讨论】:

    • 据我所知,Safari 不支持“下载”功能。
    • 是的,它不受 safari 和 I.E caniuse.com/#feat=download 的支持。不确定如果添加 _target="blank" 并将其用作后备会发生什么。
    • 正如我提出的问题,使用a+href 已经可以下载我只是想了解为什么使用window.location.href 在Firefox 中刷新页面
    • 很奇怪,我刚刚在 Firefox 中测试了你的代码,它会在一个完整的浏览器窗口中打开图像(本地和远程),并且不会刷新页面。
    • 我的 url 是一个返回文件的 MVC 操作......也许财政地址以不同的方式工作。
    【解决方案3】:

    禁用链接的另一种方法是使用 Javascript 取消超链接激活事件。

    某些事件被指定为可取消的。对于这些事件,DOM 实现通常具有与事件关联的默认操作。这方面的一个例子是网络浏览器中的超链接。当用户单击超链接时,默认操作通常是激活该超链接。在处理这些事件之前,实现必须检查注册的事件侦听器以接收事件并将事件分派给这些侦听器。然后,这些侦听器可以选择取消实现的默认操作或允许默认操作继续进行。如果是浏览器中的超链接,取消操作会导致超链接不被激活。

    https://www.w3.org/TR/DOM-Level-2-Events/events.html#Events-flow-cancelation

    例如:

    <a [attr.href]="isDisabled(link) ? null : 'link.href'"
       [class.disabled]="isDisabled(link)"
       (click)="!isDisabled(link)">
       {{ link.name}}
    </a> 
    

    【讨论】:

    • 正如我在另一条评论和我的问题中所说:我的下载适用于 &lt;a&gt; 标签正确...我只是决定通过一个按钮进行更改,因为它就像一个按钮...和然后我遇到了这个问题......我没想到会出现这种行为......所以,如果我无法避免这种行为,我将再次使用&lt;a&gt; 标签......;-)
    • 因此您可以在单击按钮时以编程方式添加链接。我在另一个答案中给你一个例子(用于代码装饰)......
    • 问题,毕竟是NG Live Development Server angular CLI 使用它...我不知道为什么它只在Firefox 中刷新页面。我什至没有注意到href 解决方案正在发生这种情况。 window.location.href 工作正常 IIS 和 IIS express。谢谢。
    【解决方案4】:

    window.location.href 试图加载另一个 HTML 页面,但您处于例外情况。

    您应该将其替换为:

    download(url) {
        window.open(url);
    }
    

    或者试试这样的:

    download(url) {
        link = document.createElement('a');
        link.href = url;
        ...
        document.body.appendChild(link);
        link.click();
        document.body.removeChild(link);
    }
    

    【讨论】:

    • 我虽然关于 window.open 但它会在 Firefox 中打开一个新选项卡...如果我在 save as 对话框上按 cancel ,我将在一个空选项卡中.. .using "_self" 给了我与 windows.location.href 相同的行为...我会检查功能设计人员是否同意 window.open 解决方案...如果有任何效果,我将使用 标签再次......我不喜欢,但可能是唯一的原因......谢谢!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-09-09
    • 1970-01-01
    • 1970-01-01
    • 2015-02-07
    • 1970-01-01
    相关资源
    最近更新 更多