js解决el-table头部label统一增加tooltip提示功能最新 - - 升级版

本次优化:

 1.解决当一个页面存在多个表格,文本提示框出现错位现象

 2.解决新增Dom节点无法正常删除,导致页面出现多个节点

 问题描述: 要求el-tabel表格头部和表内容的文字,当文字超出表格宽度是隐藏并显示省略号,并且鼠标浮上去时以文字提示框的形式显示

难点:1.表格表体部分可以通过element-ui中自带的属性:show-overflow-tooltip 解决,但无法解决表头问题

难点2:表头可以用render-header函数逐一设置,但表格数量太多,页面太多,不太显示,写起来费时费力,过度重复的工作是写代码的大忌

解决思路:

1.通过全局设置js函数(方便全局去调用)

2.创建一个需要显示文本提示框的Dom节点

3.讲Dom节点显示在对应的所需要显示的表头位置

4.将Dom节点针对body定位,获取表头元素的横纵坐标(相对于窗口),用于确定定位的位置坐标

5.设置事件(onmouseover)事件和(onmouseout)鼠标移出事件,鼠标进入显示,鼠标移出隐藏

6.将函数挂在到Vue上

Vue.prototype

函数名

代码部分:

 MyTooltips.js

exports.MyTooltip = function(h = 0) {
    const elTooltip = document.createElement('div')
    const div = document.createElement('div')
    elTooltip.style.position = 'absolute'
    elTooltip.style.width = '120px'
    elTooltip.style.fontSize = '12px'
    div.style.borderRadius = '5px'
    elTooltip.style.left = '81px'
    elTooltip.style.zIndex = '9999'
    elTooltip.className = 'toolTipSire'
    div.className = 'bubbleTail'
    // 创建显示元素
    let sapns
    // 获取表头标签
    const htmls = document.querySelectorAll('table > thead > tr')
    // 获取表格元素  如果页面中有两个表格请用下标来区分 默认拿第一个表格
    const selectWrap = document.querySelectorAll('.el-table__body-wrapper')[h]
    // 滚动距离
    let rollLeft = 0
    // 循环遍历所有节点
    for (let i = 0; i < htmls.length; i++) {
      for (const a in htmls[i].children) {
        sapns = htmls[i].children[a]
        // 添加类似hover事件
        if (sapns.children) {
          if (sapns.children[0] !== undefined) {
            sapns.children[0].onmouseover = function(event) {
              rollLeft = selectWrap.scrollLeft
              const lefts = getLeft(this)
              const tops = getTop(this)
              // 判断字体是否省略隐藏
              if (this.scrollWidth > this.offsetWidth) {
                elTooltip.style.left = (lefts - 40 - rollLeft) + 'px'
                elTooltip.style.top = (tops - 50) + 'px'
                // 获取选中元素的文字
                div.innerText = event.target.innerText
                div.style.backgroundColor = '#1f2f3d'
                div.style.color = '#fff'
                div.style.visibility = 'visible'
              }
            }
            // 鼠标移除事件
            sapns.children[0].onmouseout = function() {
              div.style.visibility = 'hidden'
            }
          }
        }
      }
    }
    // 添加提示文本框
    document.querySelector('body').appendChild(elTooltip)
    elTooltip.appendChild(div)
    // 清除多余的文本框元素
    const rubbishNode = document.querySelectorAll('.toolTipSire')
    if (rubbishNode.length > 1) {
      document.body.removeChild(document.querySelector('.toolTipSire'))
    }
  }
  // 获取元素的纵坐标(相对于窗口)
  function getTop(e) {
    var offset = e.offsetTop
    if (e.offsetParent != null) offset += getTop(e.offsetParent)
    return offset
  }
  // 获取元素的横坐标(相对于窗口)
  function getLeft(e) {
    var offset = e.offsetLeft
    if (e.offsetParent != null) offset += getLeft(e.offsetParent)
    return offset
  }
  

MyTooltips.css

.bubbleTail {
  visibility: hidden;
  text-align: center;
  padding: 5px 0;
  border-radius: 6px;
  /* 定位 */
  position: absolute;
  z-index: 1;
  border-radius: 5px;
  width: 120px;
  height: 30px;
  background-color: rgb(31, 47, 61);
  color: rgb(255, 255, 255);
  line-height: 22px;
}
.bubbleTail::after {
  content: " ";
  position: absolute;
  top: 100%;
  left: 50%;
  margin-left: -5px;
  border-width: 5px;
  border-style: solid;
  border-color: black transparent transparent transparent;
}

main.js

import { MyTooltip } from './MyTooltips'
Vue.prototype.headShow = function(h) {
  MyTooltip(h)
}

页面引用

//如果页面中存在一个表格无需传参直接调用
this.$nextTick(() => {
          this.headShow()
        })
//如果页面中存在多个表格在切换表格时需要传参
this.$nextTick(() => {
          this.headShow(1)
        })

hardfault_handler(硬件错误处理函数)是一种常见的嵌入式系统中的异常处理机制,用于处理当发生特定的硬件错误时,保护系统免受崩溃或不可预测行为的影响。然而,硬件错误的原因往往是复杂而多样的,因此很难将hardfault_handler的故障归咎于一个单一的真凶。 硬件错误可能的来源包括但不限于内存出错、指令错误、算术错误、栈溢出、总线错误等。这些错误的发生可能是由于硬件故障、电压噪声、电磁干扰、程序设计错误等多种因素的综合作用。 在嵌入式系统中,除了硬件错误之外,软件程序错误也可能导致hardfault_handler的触发。例如,非法指令、空指针引用、数组越界、递归溢出等等。这些软件错误可能是由于编程错误、内存管理错误、数据类型不匹配等原因造成的。 因此,将hardfault_handler的真凶归结于一个单一的因素是不准确的。硬件错误的发生可能是由多重因素引起的,这需要进行详细的故障分析和排除。在排查硬件错误时,可以进行硬件测试、检查电路连接、测量电压和电流等方法;而在排查软件错误时,可以通过调试、日志记录、代码审查等手段来找出程序中的错误。 总之,hardfault_handler的真凶往往是硬件错误和软件错误的综合结果,需要综合多方面的因素来进行分析和解决。通过合理的硬件设计和软件编程,可以减少硬件错误和软件错误的发生,提高系统的稳定性和可靠性。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值