模拟元素的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.数据驱动.双向绑定 ...
随机推荐
- poj 1330 Nearest Common Ancestors 题解
Nearest Common Ancestors Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 24618 Accept ...
- C 语言高效编程的几招——A few action of efficient C language programming
编写高效简洁的C 语言代码,是许多软件工程师追求的目标.本文就工作中的一些体会和经验做相关的阐述,不对的地方请各位指教. 第1 招:以空间换时间 计算机程序中最大的矛盾是空间和时间的矛盾,那么,从这个 ...
- linux CentOS6.5 yum安装mysql 5.6(转载&删改)
按:下面文章经过我一路测试没有问题,是篇好文,在此感谢作者 别踩我袈裟 .另因原文有些啰嗦,我自己有所删改,并尾后增加了一大段. 出处:https://www.cnblogs.com/renjido ...
- MySQL中删除数据的两种方法
转自:http://blog.csdn.net/apache6/article/details/2778878 1. 在MySQL中有两种方法可以删除数据: 一种是delete语句,另一种是trunc ...
- Nginx TCP Proxy模块的编译安装
这次用一个国内开发者在GitHub上的开源项目https://github.com/yaoweibin/nginx_tcp_proxy_module 我的系统已经安装了最新的Nginx,现在需要下载源 ...
- 协议名称处理函数xxxprotoxxx()
为了方便操作,Linux提供了一组用于查询协议的值及名称的函数. xxxprotoxxx()函数: 上面的函数对文件/etc/protocols中的记录进行操作,文件中记录了协议的名称.值和别名等值, ...
- RootMotionComputer 根运动计算机
using UnityEngine; using System.Collections; /* * -------------------------------------------------- ...
- QtGui.QLineEdit
A QtGui.QLineEdit is a widget that allows to enter and edit a single line of plain text. There are u ...
- setTimeout模拟setInterval调用
在开发环境下,尽量不用间歇调用,原因是后一个间歇调用可能会在前一个间歇调用结束之前启动. 尽量使用超时调用来模拟间歇调用. 示例代码: <!DOCTYPE html> <html l ...
- JavaScript ,Css and Jquery In OpenERP 7.0
From: http://openerpbay.blogspot.jp/2013/02/javascript-css-and-jquery-in-openerp-70.html Hi fellows, ...