模拟元素的title属性,自定义Vue指令
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指令的更多相关文章
- Spring Cloud实战: 基于Spring Cloud Gateway + vue-element-admin 实现的RBAC权限管理系统,实现网关对RESTful接口方法权限和自定义Vue指令对按钮权限的细粒度控制
一. 前言 信我的哈,明天过年. 这应该是农历年前的关于开源项目 的最后一篇文章了. 有来商城 是基于 Spring Cloud OAuth2 + Spring Cloud Gateway + JWT ...
- 手写一个关于title属性自定义提示框解决浏览器(IE)不兼容问题
<html> <head> <meta charset="utf-8"> <title>无标题页</title> < ...
- 为元素添加 title 属性
---恢复内容开始--- 可以使用title属性(不要与title元素混淆)为网站上任何部分加上提示标签. ... <ul title="Table of Contents" ...
- 一个能拖动,能调整大小,能更新bind值的vue指令-vuedragx
一. 背景说明 开发一个可自定义组件化门户配置页面,期间采用了vue框架作为前端视图引擎,作为一个刚入手vue的萌新,开发第一个功能就遇到了拦路虎.需要一个拖动并且可改变大小的容器盒子.当时查看vue ...
- 正确使用HTML title属性
如果你想对使用手机,平板电脑和辅助技术的用户隐藏某些内容,而只对键盘用户显示,那么请使用title属性. 细节 HTML的title属性本身有问题.之所以有问题是因为它在一些重要的方面表现的不够好,尽 ...
- vue指令详解和自定义指令
在vue中,指令以v-开头,是一种特殊的自定义行间属性,指令的职责就是其表达式的值改变时相应地将某些行为应用到DOM上 指令使用的示例 在下面的运行结果中可以看到,v-html是可以解析html标签的 ...
- 【CSS进阶】伪元素的妙用2 - 多列均匀布局及title属性效果
最近无论是工作还是自我学习提升都很忙,面对长篇大论的博文总是心有余而力不足,但又不断的接触学习到零碎的但是很有意义的知识点,很想分享给大家,所以本篇可能会很短. 本篇接我另一篇讲述 CSS 伪元素的文 ...
- 自定义类似于Jquery UI Selectable 的Vue指令v-selectable
话不多说,先看效果. 其实就是一个可以按住鼠标进行一个区域内条目选择的功能,相信用过Jquery UI 的都知道这是selectable的功能,然而我们如果用Vue开发的话没有类似的插件,当然你仍然可 ...
- 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.数据驱动.双向绑定 ...
随机推荐
- mysql中避免使用保留字和关键字做列的名字
设计数据表时,应尽量避免使用MySQL的关键字和保留字作为表名或列名. 比如key和keys为保留字,如果不小心使用关键字或者保留字作为列名字,执行下面的语句会出现语法错误: select * fro ...
- ARM指令集—SWP指令
ARM指令集-SWP指令 SWP和SWPB是ARM指令集中对存储单元的原子操作.即对存储单元的一次读和一次不可被切割. SWP和SWPB分别完毕存储器和寄存器之间 一个字(32bit)和一个字节(8b ...
- Hibernate查询语言
HQL(Hibernate Query Language)查询语言是完全面向对象的查询语言,它提供了更加面向对象的封装,它可以理解如多态.继承和关联的概念.HQL看上去和SQL语句相似,但它却提供了更 ...
- C#使用DirectShow播放视频文件 [转]
原文网址:http://blog.csdn.net/openzpc/article/details/48442751 最近在开发一个视频播放软件,主要要求就是循环播放多个视频文件,并且要求两个视频文件 ...
- jQuery序列化表单数据 serialize()、serializeArray()及使用
1.serialize() 方法: serialize() 方法通过序列化表单值,创建 URL 编码文本字符串. 您可以选择一个或多个表单元素(比如 input 及/或 文本框),或者 form 元素 ...
- java设计模式4--建造者模式(Builder)
本文地址:http://www.cnblogs.com/archimedes/p/java-builder-pattern.html,转载请注明源地址. 建造者模式 将一个复杂对象的构建与它的表示分离 ...
- Javascript-history.go()和history.back()的用法和区别
简单的说就是:go(-1): 返回上一页,原页面表单中的内容会丢失:back(): 返回上一页,原页表表单中的内容会保留. history.go(-1):后退+刷新 history.back():后退 ...
- (剑指Offer)面试题53:正则表达式匹配
题目: 请实现一个函数用来匹配包括'.'和'*'的正则表达式.模式中的字符'.'表示任意一个字符,而'*'表示它前面的字符可以出现任意次(包含0次). 在本题中,匹配是指字符串的所有字符匹配整个模式. ...
- angularjs中ng-repeat的使用
第一个例子:使用ng-repeat最简单的例子 <html ng-app="myApp"> <head> <title>angularjs-de ...
- xmpp 服务器配置 open fire for windows 及 spark 测试
xmpp 服务器配置 open fire for windows 此文章为 XMPP windows服务器配置,使用的是 open fire 3.9.1.exe 1: 下载 open fire ope ...