防止在Vue.js中@click上的锚标记重新加载页面

Posted

技术标签:

【中文标题】防止在Vue.js中@click上的锚标记重新加载页面【英文标题】:Prevent anchor tag reloading page on @click in Vue.js 【发布时间】:2020-11-18 10:37:15 【问题描述】:

我的 vue 文件中有以下代码。我在这里面临的问题是当我单击此处时页面会重新加载。我添加了event.preventDefault(),但无法解决问题。请帮我找出哪里出错了。

<template>
  <p>Please click <a @click="stopProcess">here</a></p>
</template>

<script>  
  export default 
    methods: 
      stopProcess()
        event.preventDefault()
        var page = "../../../pages/page.pdf"
        window.open(page);
      
    
  ;
</script>

【问题讨论】:

你为什么使用window.open? @LeonardoBezerra 因为我想在点击时在新标签中打开页面 window.open 仅适用于绝对链接,使用 https。 "yourdomain.com/pages/page.pdf" 是的,就像 @LeonardoBezerra 它只适用于 http 协议,您还应该添加 'blank' 作为第二个参数以在新标签中打开它 你在这里的真正意图是什么?下载pdf? 【参考方案1】:

如果您在锚标记定义中添加href="javascript:void(0)",则页面不会重新加载。

这是因为 void 操作符返回未定义,浏览器不执行的结果。有关 void 运算符的更多信息,请参阅here。

例如:&lt;a href="javascript:void(0)" @click="stopProcess"&gt;here&lt;/a&gt;

【讨论】:

【参考方案2】:

所以首先你需要知道@click 不像原生点击事件,所以event.preventDefault() 可能无法按预期工作,你需要使用@click.native 来制作你的原生点击事件。然后你需要将event本身传递给你的处理方法(在vue.js中处理事件的最好方法是使用built-in event handlers,所以你可以去掉event.preventDefault()直接使用@987654329 @ 代替).

但是所有这些单独并不能解决您的问题,因为默认情况下,如果请求的路由在同一个域中,则当前页面将在 window.open() 发生之后跟随它,因此您需要将第二个值传递给它,以使确保新路径与当前路径不同(它的首选值是_blank。您可能还需要始终为您的&lt;a&gt; 指明href

<template>
  <p>Please click <a href="#" @click.native="stopProcess">here</a></p>
</template>

<script>
  export default 
    methods: 
      stopProcess(event) 
        event.preventDefault()
        var page = "../../../pages/page.pdf"
        window.open(page, '_blank');
      
    
  ;
</script>

您还可以通过将&lt;a&gt; 目标设置为_blank 来简化此操作,而无需任何复杂的东西。

<template>
  <p>Please click <a href="../../../pages/page.pdf" target="_blank">here</a></p>
</template>

如果您使用的是vue-router,这可能是这样的,而不是上面的:

<template>
  <p>Please click  <router-link to="../../../pages/page.pdf" target="_blank">Home</router-link></p>
</template>

【讨论】:

【参考方案3】:

@click.prevent 是正确的方法,但页面仍然会重新加载。

由于stopProcess() 会因为event 未定义而引发异常,所以prevent 修饰符将不起作用。

请删除 event.preventDefault() 并添加 prevent 修饰符,您会看到它正在工作。

【讨论】:

“A”标签不会导致页面重新加载,因此 prevent 只会阻止页面滚动到页面顶部。【参考方案4】:

根据你的代码我会试试这个,但如果是我,我会使用路由器。

<template>
  <p>Please click <a @click="stopProcess">here</a></p>
</template>

<script>  
  export default 
    methods: 
      stopProcess()
        var page = window.location.origin + "/pages/page.pdf"
        window.open(page);
      
    
  ;
</script>

【讨论】:

这适用于我的应用程序,如果您安装了路由器,它将无法正常工作 是的,我已经安装了路由器。 你建议如何将它与路由器一起使用? 你可能想签出这个而不是pdftron.com/blog/webviewer/how-to-build-a-pdf-viewer-with-vuejs【参考方案5】:

尝试添加prevent修饰符以防止默认行为如下:

  <p>Please click <a @click.prevent="stopProcess">here</a></p>

或者像你一样,但你错过了 event 作为方法参数:

    stopProcess(event)
        event.preventDefault()

【讨论】:

这可能是真的,但这不是重新加载的原因 @LeonardoBezerra 为什么? @user12763413 你试过了吗&lt;a href="../../../pages/page.pdf" target="_blank"&gt;here&lt;/a&gt; 它用 pdf 文件或旧内容重新加载? pdf文件在下一页打开,但我点击的页面被重新加载

以上是关于防止在Vue.js中@click上的锚标记重新加载页面的主要内容,如果未能解决你的问题,请参考以下文章

跨页面的锚点链接

Vue JS 2. 如何防止在两个父级之间导航时重新加载相同的嵌套组件?

Vue @click 不适用于存在 href 的锚标记

添加 href 属性后,ng-click 不适用于 Internet Explorer 中的锚标记

Javascript:如何真正重新加载带有锚标记的网站?

如何在后台保持加载一个 vue.js 单文件组件?