function showTitle(el, title) {
const popover = getPopover()
const popoverStyle = popover.style if (title === undefined) {
popoverStyle.display = 'none'
} else {
const elRect = el.getBoundingClientRect()
const elComputedStyle = window.getComputedStyle(el, null)
const rightOffset = parseInt(elComputedStyle.getPropertyValue('padding-right')) || 0
const topOffset = parseInt(elComputedStyle.getPropertyValue('padding-top')) || 0 popoverStyle.visibility = 'hidden'
popoverStyle.display = 'block'
popover.querySelector('.popover-content').textContent = title
popoverStyle.left = elRect.left - popover.offsetWidth / 2 + (el.offsetWidth - rightOffset) / 2 + 'px'
popoverStyle.top = elRect.top - popover.offsetHeight + topOffset + 'px'
popoverStyle.display = 'block'
popoverStyle.visibility = 'visible'
}
} function getPopover() {
let popover = document.querySelector('.title-popover') if (!popover) {
const tpl = `
<div class="popover title-popover top fade in" style="position:fixed;">
<div class="arrow"></div>
<div class="popover-content"></div>
</div>
`
const fragment = document.createRange().createContextualFragment(tpl) document.body.appendChild(fragment)
popover = document.querySelector('.title-popover')
} return popover
}
export default {
bind(el, binding, vnode) {
// 使用 const 声明一个只读的常量,其值是需要监听的事件类型列表
const events = ['mouseenter', 'mouseleave', 'click']
// 声明一个处理器,以根据不同的事件类型传不同的参数
const handler = (event) => {
if (event.type === 'mouseenter') {
// 显示一个提示框
showTitle(el, binding.value)
} else {
// 隐藏一个提示框
showTitle()
}
} // 在 el 元素上添加事件监听
events.forEach((event) => {
el.addEventListener(event, handler, false)
}) // 在 el 元素上添加一个属性,以在其他钩子进行访问
el.destroy = () => {
// 移除 el 元素上的事件监听
events.forEach((event) => {
el.removeEventListener(event, handler, false)
})
// 移除 el 元素上的 destroy
el.destroy = null
}
},
unbind(el) {
// 移除事件监听和数据绑定
el.destroy()
}
}

使用步骤:

1.建立指令;

2.在要使用的组件中引入并注册指令

 import title from '@/directives/title'
directives: {
title
}

3.页面中使用,将原来的:title=""改为v-title:

 <a v-for="item in contacts" v-title="item.title" :href="item.link" :style="contactStyle" target="_blank">
<i :class="`fa fa-${item.icon}`"></i>
</a>

指令的基础知识补充:

一个指令定义对象可以提供如下几个钩子函数(均为可选):

  • bind:只调用一次,指令第一次绑定到元素时调用,在这里可以进行一次性的初始化设置;
  • inserted:被绑定元素插入父节点时调用;
  • update:所在组件的 VNode(虚拟节点)更新时调用,但是可能发生在其子 VNode 更新之前;
  • componentUpdated:指令所在组件的 VNode 及其子 VNode 全部更新后调用;
  • unbind:只调用一次,指令与元素解绑时调用,在这里可以移除绑定的事件和其他数据;
  • 指令钩子函数会被传入以下参数:

    • el:指令所绑定的元素,可以用来操作 DOM ;
    • binding:一个对象,binding.value 表示指令的绑定值,如 v-title="'我是标题'" 中,绑定值为'我是标题'
    • vnode:Vue 编译生成的虚拟节点;
    • oldVnode:上一个虚拟节点,仅在 update 和 componentUpdated 钩子中可用。

模拟元素的title属性,自定义Vue指令的更多相关文章

  1. Spring Cloud实战: 基于Spring Cloud Gateway + vue-element-admin 实现的RBAC权限管理系统,实现网关对RESTful接口方法权限和自定义Vue指令对按钮权限的细粒度控制

    一. 前言 信我的哈,明天过年. 这应该是农历年前的关于开源项目 的最后一篇文章了. 有来商城 是基于 Spring Cloud OAuth2 + Spring Cloud Gateway + JWT ...

  2. 手写一个关于title属性自定义提示框解决浏览器(IE)不兼容问题

    <html> <head> <meta charset="utf-8"> <title>无标题页</title> < ...

  3. 为元素添加 title 属性

    ---恢复内容开始--- 可以使用title属性(不要与title元素混淆)为网站上任何部分加上提示标签. ... <ul title="Table of Contents" ...

  4. 一个能拖动,能调整大小,能更新bind值的vue指令-vuedragx

    一. 背景说明 开发一个可自定义组件化门户配置页面,期间采用了vue框架作为前端视图引擎,作为一个刚入手vue的萌新,开发第一个功能就遇到了拦路虎.需要一个拖动并且可改变大小的容器盒子.当时查看vue ...

  5. 正确使用HTML title属性

    如果你想对使用手机,平板电脑和辅助技术的用户隐藏某些内容,而只对键盘用户显示,那么请使用title属性. 细节 HTML的title属性本身有问题.之所以有问题是因为它在一些重要的方面表现的不够好,尽 ...

  6. vue指令详解和自定义指令

    在vue中,指令以v-开头,是一种特殊的自定义行间属性,指令的职责就是其表达式的值改变时相应地将某些行为应用到DOM上 指令使用的示例 在下面的运行结果中可以看到,v-html是可以解析html标签的 ...

  7. 【CSS进阶】伪元素的妙用2 - 多列均匀布局及title属性效果

    最近无论是工作还是自我学习提升都很忙,面对长篇大论的博文总是心有余而力不足,但又不断的接触学习到零碎的但是很有意义的知识点,很想分享给大家,所以本篇可能会很短. 本篇接我另一篇讲述 CSS 伪元素的文 ...

  8. 自定义类似于Jquery UI Selectable 的Vue指令v-selectable

    话不多说,先看效果. 其实就是一个可以按住鼠标进行一个区域内条目选择的功能,相信用过Jquery UI 的都知道这是selectable的功能,然而我们如果用Vue开发的话没有类似的插件,当然你仍然可 ...

  9. Vue框架(一)——Vue导读、Vue实例(挂载点el、数据data、过滤器filters)、Vue指令(文本指令v-text、事件指令v-on、属性指令v-bind、表单指令v-model)

    Vue导读 1.Vue框架 vue是可以独立完成前后端分离式web项目的js框架 三大主流框架之一:Angular.React.Vue vue:结合其他框架优点.轻量级.中文API.数据驱动.双向绑定 ...

随机推荐

  1. Python 字符串前面加'r'

    在Python的string前面加上‘r’, 是为了告诉编译器这个string是个raw string,不要转意backslash '\' . 例如,\n 在raw string中,是两个字符,\和n ...

  2. 设置 IE 默认模式为 IE8

    <meta http-equiv="X-UA-Compatible" content="IE=EmulateIE8" />

  3. win10 mysql57密码重置

    [摘要: 1.my-default.ini 更名my.ini 正在解压的目次上面复造my-default.ini一份更名字为 my.ini. 2.翻开 Windows 情况变量设置, 新建变量名 MY ...

  4. [RSpec] LEVEL 1: INTRODUCTION

    Install RSpec: Describe Lets start writing a specification for the Tweet class. Write a describe blo ...

  5. html 中几次方,平方米,立方米.

    m的n次方表示法:mn m<sup>n</sup> 10<sup>6</sup> m的n次方表示法:mn m<sub>n</sub&g ...

  6. 删除android ScrollView边界阴影方法

    XML文件中添加以下方法:   android:fadingEdge=”none”   或者,代码中设置为false即可   ScrollView.setHorizontalFadingEdgeEna ...

  7. RMSE均方根误差学习笔记

    1.均方根误差,它是观测值与真值偏差的平方和观测次数n比值的平方根,在实际测量中,观测次数n总是有限的,真值只能用最可信赖(最佳)值来代替.方根误差对一组测量中的特大或特小误差反映非常敏感,所以,均方 ...

  8. hdu 1087 简单dp

    思路和2391一样的.. <span style="font-size:24px;">#include<stdio.h> #include<strin ...

  9. TP框架ajax U方法不解析怎么办?

    TP框架中ajax U方法不解析 ajax U方法不解析 ajax url不解析 问题: 造成问题原因: Js 存在单独的 js文件中和html分离了.造成不解析! 解决方法: 方法一:将js放到ht ...

  10. UVA1614(贪心)

    Hell on the Markets Time Limit:3000MS   Memory Limit:Unknown   64bit IO Format:%lld & %llu [Subm ...