当前位置:   article > 正文

前端vue实现系统拦截跳转外链并进入跳转询问界面_vue关闭外部链接

vue关闭外部链接

跳转询问界面如下图所示:

给自己挖坑的实现方式,最终解决方案请看最底下 

思路:正常情况下我们有2种方式跳转外链

第一种非a标签,我们手动添加事件进行跳转

  1. <div class="dingdan public-padding p-item" @click="goOtherWebsite('https://www.baidu.com/')">
  2. <span class="iconfont icon-shezhi" style="color: #818C99;"></span>
  3. <span>非a标签跳转外链</span>
  4. </div>

 第二种a标签

<a href="https://www.baidu.com/" target="">a标签跳转外链</a>

第三种

1.分析下第一种

如果你不进入router,那你在跳转外链的时候vue框架的路由钩子不会监听到,因此我们从进router入手

a.新建一个中转询问页面linkWeb.vue,代码如下:

  1. <template>
  2. <div class="link-container">
  3. <div class="content-box">
  4. <div class="content-title">即将跳转到外部网站</div>
  5. <div class="content-text">您将要访问的链接不属于本站点,请关注您的账号安全。</div>
  6. <div class="content-link">
  7. <div class="external-link-href">{{urlValue}}</div>
  8. </div>
  9. <div class="ui button orange external-link-btn" @click="jumpUrl()">继续前往</div>
  10. </div>
  11. </div>
  12. </template>
  13. <script>
  14. export default{
  15. name: 'linkWeb',
  16. data() {
  17. return {
  18. urlValue:''
  19. }
  20. },
  21. mounted() {
  22. this.urlValue=this.$route.query.target
  23. },
  24. methods:{
  25. jumpUrl() {
  26. window.open(this.urlValue)
  27. }
  28. }
  29. }
  30. </script>

b.修改全局钩子函数beforeEach,代码如下:

  1. router.beforeEach((to, from, next)=>{
  2. console.log('❤❤❤全局导航路由守卫❤❤❤~~~~~~~~~~~~',to)
  3. // console.log(to.path.indexOf('https:')==-1&&to.path.indexOf('http:')==-1)
  4. if(to.path.indexOf('https:')==-1&&to.path.indexOf('http:')==-1) {
  5. next();
  6. } else { // 处理外链
  7. console.log('处理外链')
  8. let tempLinkUrl=to.path
  9. if(tempLinkUrl.indexOf('/')!=-1&&tempLinkUrl.substr(0,1)=='/'){
  10. tempLinkUrl=tempLinkUrl.substr(1)
  11. }
  12. next({
  13. path: '/linkWeb',
  14. query:{
  15. target:tempLinkUrl
  16. }
  17. })
  18. }
  19. })

注意,以上代码可能会报错,报错信息如:...via a navigation guard.,为解决此问题,我们需要在 Vue.use(Router)代码之前添加以下代码:

  1. // 这段代码是为了解决跳转路由时报...via a navigation guard.的问题 start
  2. const originalPush = Router.prototype.push
  3. Router.prototype.push = function push (location, onResolve, onReject) {
  4. if (onResolve || onReject){
  5. return originalPush.call(this, location, onResolve, onReject)
  6. }
  7. return originalPush.call(this, location).catch(err => err)
  8. }
  9. // 这段代码是为了解决跳转路由时报...via a navigation guard.的问题 end

 

2.分析下第一种a标签跳转

我们需要手动禁止掉a标签默认的href属性跳转链接行为,将其转化为跳转我们自己的路由页面

关键代码如下:

  1. mounted() {
  2. this.$nextTick(() => {
  3. document.querySelectorAll('a').forEach((item) => {
  4. item.addEventListener('click', this.linksPermissions)
  5. })
  6. })
  7. },
  8. beforeDestroy () {
  9. document.querySelectorAll('a').forEach((item) => {
  10. item.removeEventListener('click', this.linksPermissions)
  11. })
  12. },
  13. methods:{
  14. linksPermissions (e) {
  15. console.log('=== 禁止a标签跳转直接外部链接 ===', e.target.href)
  16. e.stopPropagation()
  17. e.preventDefault()
  18. this.$router.push({
  19. path: e.target.href
  20. });
  21. }

本来一切都进行的ok了,功能也都实现了,但突然发现有一个致命的问题:如果配置了{ path: '*', component: NotFound }匹配404界面,那以上全局路由守卫的代码完全就失效了,没有任何意义,跳外链的时候直接就匹配到404的路由上去了

失效了

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/小蓝xlanll/article/detail/188445
推荐阅读
相关标签