jquery和vue复制功能

本文介绍了一种使用jQuery实现的物流单号复制功能及Vue组件自动生成目录的方法。通过简单的代码示例展示了如何在网页上实现物流单号的复制,并利用Vue和相关脚本文件实现页面内容的目录生成。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

jquery

html

1.1奖品列表复制某一行物流单号信息

在这里插入图片描述

1.1.1引入

<!-- copy -->
<script type="text/javascript" src="js/prize/clipboard.js"></script>
<c:if test="${ prize.isExpress }">
	<button type="button" title="复制物流单号" class="am-btn am-btn-secondary copyLogist" id="copyLogist">
	<i class="fa fa-copy"></i>
	</button>
	<p><strong>快递:</strong><span>${ prize.expressName }</span></p><br>
	<p class="logistCode"><strong>快递编号:</strong><span class="logistSpan" id="${ prize.expressId }" data-id="${ prize.expressId }">${ prize.expressCode }</span></p>
</c:if>
$(".copyLogist").on("click",function(){
	$(".prizeLogisticsModal").removeClass("in");
	const range = document.createRange();
	var id = $(this).siblings(".logistCode").children(".logistSpan").data('id');
	range.selectNode(document.getElementById(id));

	const selection = window.getSelection();
	if(selection.rangeCount > 0) selection.removeAllRanges();
	selection.addRange(range);
	document.execCommand('copy');
	var msg="快递编号复制成功";
	succTipMsg(msg);
	$("#my-alertTwo #infoSure").click(function(){
		$("#exampleModal").css("display","none");
	});
})

若是单个复制

<div class="modal-footer line">
  <button type="button" class="btn btn-primary" id="invitationCode" data-dismiss="modal" data-am-modal="{target: '#my-alertTwo'}" onClick="jsCopy();">复制邀请码</button>
</div>
//邀请码
function jsCopy(){
	var e=document.getElementById("inviteUrl");//对象
	e.select(); //选择对象
	tag=document.execCommand("Copy"); //执行浏览器复制命令
	if(tag){ 
		var msg="复制邀请码成功";
		//提示弹框
		succTipMsg(msg);
		$("#my-alertTwo #infoSure").click(function(){
			$("#exampleModal").css("display","none");
		});
	}
}

index.js

import vMenus from '@/components/changeMenus/menus'

export {vMenus}

menus.js

import '@/components/changeMenus/menus.scss'
import {scan} from '@/components/changeMenus/scan'
export default {
  name: 'v-menus',
  props: {
    contentId: {
      type: String,
      default: null
    },
    contentFlag: {
      type: String,
      default: 'content_tag'
    },
    menuFlag: {
      type: String,
      default: 'menu_link'
    },
    canToggle: {
      type: Boolean,
      default: false
    },
    opened: {
      type: Boolean,
      default: true
    },
    scanLevel: {
      type: Number,
      default: 2
    },
    scanAll: {
      type: Boolean,
      default: true
    },
    defalutMenuName: {
      type: String,
      default: '文章开头'
    }
  },
  data () {
    return {
      menuList: []
    }
  },
  mounted () {
    this.$nextTick(() => {
      this.loadMenus()
    })
    window.addEventListener('scroll', this.listenScroll)
  },
  destroyed () {
    window.removeEventListener('scroll', this.listenScroll)
  },
  render (h) {
  //生成目录
    const genMenu = (menu, level) => {
      let self = this
      let iClasses = ''
      let liClasses = ''
      if (menu.menus && menu.menus.length > 0) {
       iClasses = this.canToggle
      } else {
        liClasses = 'listStyle'
      }
      return h('li', {class: ['menu_level menu_level_' + level, liClasses]}, [
        h('a', {
          class: [this.menuFlag + ' menu_item_' + level, menu.current ? 'current' : ''],
          attrs: {
            href: 'javascript:void(0)',
            link: '#' + menu.id
          },
          on: {click: () => self.jumpToTarget('#' + menu.id)}
        }, [
          h('i', {class: iClasses}),
          menu.text
        ]),
        genMenuList(menu.menus, level + 1)
      ])
    }

    const genMenuList = (menus, level) => {
      const menuLis = []
      if (menus && level < this.scanLevel + 1) {
        menus.forEach(menu => {
          menuLis.push(genMenu(menu, level))
        })
      }
      return h('ul', {class: 'menu_list menu_list_' + level}, menuLis)
    }

    return genMenuList(this.menuList, 1)
  },
  
  methods: {
    loadMenus () {
      this.menuList = scan({
        contentId: this.contentId,
        contentFlag: this.contentFlag,
        scanAll: this.scanAll,
        firstMenu: this.defalutMenuName
      })
      this.$emit('is-empty-menu', this.menuList && this.menuList.length > 0)
    },
    //点击跳转到相应的目录区域
    jumpToTarget (linkTarget) {
      let menuObj = $('a[link="' + linkTarget + '"]')
      if (this.canToggle) {
        menuObj.find('i.fa').toggleClass('fa-caret-down').toggleClass('fa-caret-right')
        menuObj.next().toggleClass('hide')
      }
      $('.' + this.menuFlag + '.current').removeClass('current')
      menuObj.addClass('current')
      $('html, body').animate({scrollTop: $(linkTarget).offset().top - 68}, 500)
      //禁止滚动事件,0.8秒后重新启用
      window.removeEventListener('scroll', this.listenScroll)
      setTimeout(()=>{
        window.addEventListener('scroll', this.listenScroll)
      },800)
    },
    //滚动文章内目录标题时,右侧目录选中当前的标题,如果右侧目录过多,滚动到的目录不在可视区域,使其滚动到可视区域显示
    listenScroll () {
      let that = this
      let scrollTop = $(window).scrollTop()
      let menuItems = $('.' + that.menuFlag)
      let currentLi = $('.menusBox li').find('a.current')
      let lis = $('.menusBox li').find('a')
      let fixDivScrollTop = fixDivIndex * 30;//这个元素正好在可视区域上方的scrollTop值
      let addFixDivScrollTop = fixDivScrollTop - 140 //滚动到的位置,因我是需要显示到中间,所以减了接近5个li的高度
      // console.log(fixDivScrollTop)
      //选中的目录是否在可视区域
      if(fixDivScrollTop > 270 ){
        //不在可视区域
        $('.masg_menus').scrollTop(addFixDivScrollTop);
      } else if(fixDivScrollTop < 270){
        //在可视区域内
        $('.masg_menus').scrollTop(0);
      }
      $('#' + that.contentId + ' .' + that.contentFlag + ', #' + that.contentId + '.' + that.contentFlag).each(function (n, ct) {
        let tagTop = $(ct).offset().top
        let distance = tagTop - scrollTop
        if (distance >= 68) {
          $('.' + that.menuFlag + '.current').removeClass('current')
          // let ind = n === 0 ? n : n - 1
          // console.log(ind)
          // console.log($(menuItems[ind]).html())
          $(menuItems[n]).addClass('current')
          return false
        }
      })
    }
  }
}

menus.css

ul.menu_list_1 {
  padding: 0px 0px 15px 3px;
  li {
    //list-style-type: disc;
    list-style-type: none;
    line-height: 28px;
    list-style-position:inside;
    border-left: 1px solid #E8E8E8;
  }
  li.menu_level_1 {
    color: #B5B5B5;
  }
  li.menu_level_1.current {
    color: #6D59B8;
  }
  a.menu_item_1 {
    //color: #333333;
    color: #666666;
    font-size: 12px;
    font-weight: 500;
    i{
      display: inline-block;
      width: 5px;
      height: 5px;
      border-radius: 50%;
      background: #B5B5B5;
      position: relative;
      top: -2px;
      margin-left: -3px;
      margin-right: 0px;
      box-shadow: 0px 0px 10px 6px #F3F3F6;
    }
    .menusName{
      display: inline-block;
      width: 84%;
      margin-left: 15px;
      vertical-align: top;
      word-break:keep-all;/*不换行*/
      white-space:nowrap;/*不换行*/
      overflow:hidden;/*内容超出宽度时隐藏超出部分的内容*/
      text-overflow:ellipsis;/*当对象内文本溢出时显示省略标记(...);需与overflow:hidden;一起使用。*/
    }
  }
  a.current {
    //color: #61649F;
    color: #6D59B8;
    font-weight: bold;
    i{
      display: inline-block;
      width: 9px;
      height: 4px;
      margin-left: -4px;
      margin-right: 0;
      box-shadow: 0px 0px 10px 6px #F3F3F6;
      background: url("~@/images/menus/towMenus.svg") no-repeat;
      border-radius: 0;
    }
    .menusName{
      display: inline-block;
      width: 84%;
      margin-left: 12px;
      vertical-align: top;
      word-break:keep-all;/*不换行*/
      white-space:nowrap;/*不换行*/
      overflow:hidden;/*内容超出宽度时隐藏超出部分的内容*/
      text-overflow:ellipsis;/*当对象内文本溢出时显示省略标记(...);需与overflow:hidden;一起使用。*/
    }
  }
  ul.menu_list_2 {
    //padding: 0px 0px 0px 20px;
    padding: 0;
    li.menu_level_2 {
    }
    a.menu_item_2 {
      //color: #333333;
      color: #999999;
      font-size: 12px;
      font-weight: 400;
      i{
        display: inline-block;
        width: 9px;
        height: 4px;
        //margin-right: 16px;
      }
      .menusName{
        display: inline-block;
        width: 84%;
        margin-left: 16px;
        vertical-align: top;
        word-break:keep-all;/*不换行*/
        white-space:nowrap;/*不换行*/
        overflow:hidden;/*内容超出宽度时隐藏超出部分的内容*/
        text-overflow:ellipsis;/*当对象内文本溢出时显示省略标记(...);需与overflow:hidden;一起使用。*/
      }
    }
    a.current {
      //color: #61649F;
      color: #6D59B8;
      font-weight: bold;
      i{
        display: inline-block;
        width: 9px;
        height: 4px;
        position: relative;
        top: -2px;
        margin-left: -4px;
        box-shadow: 0px 0px 10px 6px #F3F3F6;
        background: url("~@/images/menus/towMenus.svg") no-repeat;
      }
      .menusName{
        display: inline-block;
        width: 84%;
        margin-left: 20px;
        vertical-align: top;
        word-break:keep-all;/*不换行*/
        white-space:nowrap;/*不换行*/
        overflow:hidden;/*内容超出宽度时隐藏超出部分的内容*/
        text-overflow:ellipsis;/*当对象内文本溢出时显示省略标记(...);需与overflow:hidden;一起使用。*/
      }
    }
  }
  i.fa-caret-right, i.fa-caret-down {
    color: #61649F;
    font-size: 16px;
    margin-right: 10px;
  }
  ul.menu_list li.listStyle {
    //list-style: circle;
    list-style-type: none;
    color: #61649F;
    list-style-position: inside;
    border-left: none;
  }
  .hide {
    display: none;
  }
}

scan.js

export const scan = ({contentId, contentFlag = 'content_tag', scanAll = false, firstMenu = '文章开头'}) => {
  let h1s = $('#' + contentId).find('h1')
  let h2s = $('#' + contentId).find('h2')
  let h3s = $('#' + contentId).find('h3')
  let h4s = $('#' + contentId).find('h4')
  let h5s = $('#' + contentId).find('h5')
  let h6s = $('#' + contentId).find('h6')

  let headCounts = [h1s.length, h2s.length, h3s.length, h4s.length, h5s.length, h6s.length]
  let h1Tag = null
  let h2Tag = null
  $.each(headCounts, function (n, value) {
    if (value > 0) {
      if (h1Tag === null) {
        h1Tag = 'h' + (n + 1)
      } else if (h2Tag === null) {
        h2Tag = 'h' + (n + 1)
      } else {
        return false
      }
    }
  })
  if (h1Tag === null) {
    return []
  }
  let hTags = h1Tag
  if (h2Tag !== null) {
    hTags += (',' + h2Tag)
  }

  let menus = []
  let h1Index = 0
  let h2Index = 0
  $('#' + contentId).removeClass(contentFlag)
  $('#' + contentId).find(hTags).each(function (n, item) {
    let hTag = $(item).get(0).tagName.toLowerCase()
    if (hTag === h1Tag) {
      h1Index++
      h2Index = 0
      let menu1 = {}
      menu1.id = 'menu' + h1Index
      menu1.num = '' + h1Index
      menu1.text = $(item).text()
      menu1.current = false
      menu1.menus = []
      menus.push(menu1)
      $(item).attr('id', menu1.id)
      $(item).addClass(contentFlag)
    } else if (hTag === h2Tag) {
      if (h1Index === 0) {
        if (scanAll) {
          h1Index++
          let menu1 = {}
          menu1.id = contentId
          menu1.num = '' + h1Index
          menu1.text = firstMenu
          menu1.current = false
          menu1.menus = []
          menus.push(menu1)
          $('#' + contentId).addClass(contentFlag)
        } else {
          return true
        }
      }
      h2Index++
      let menu2 = {}
      menu2.id = 'menu' + h1Index + '_' + h2Index
      menu2.num = h1Index + '.' + h2Index
      menu2.text = $(item).text()
      menu2.current = false
      menus[h1Index - 1].menus.push(menu2)
      $(item).attr('id', menu2.id)
      $(item).addClass(contentFlag)
    }
  })
  menus[0].current = true

  return menus
}

效果图

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值