禁止 浏览器title属性的默认效果

简介: 正好回答了一个问题,浏览器哪个事件里可以 禁止 浏览器对title显示默认行为? 。今天整理一下相关的测试 demo。

分析问题



先找一下关键词,从里面找一下解决问题的思路。


  1. ssr


  1. title


  1. 默认行为


  1. seo


  1. 自定义 tooltip 行为


解决问题



阻止浏览器默认行为(失败了)


event.preventDefault() 可以用来阻止浏览器的默认行为,比如说 onsubmit 表单提交、onkeydown 键盘输入、<a> 页面跳转等等。


那么 title 行为可以阻止吗?在什么事件中可以阻止?

因为我们也不确定什么事件可以,索性我们直接覆盖所有事件。


a = document.createElement('a')
// eventList 存放所有可以触发的事件
eventList = [];
// 通过 for i 的特性,我们把on开头的全部存起来。
for(var i in a) /^on/.test(i)&&eventList.push(i);
// console.log(eventList)
// 阻止默认事件
preventDefaultFun = e => {e.preventDefault(),console.log(e.type)};
// 绑定所有事件
eventList.forEach(v=>a[v]=preventDefaultFun)
// 增加内容,追加到 DOM 中测试
a.title = 'www.lilnong.top'
a.innerText = '微信公众号:前端linong'
document.body.appendChild(a)


可以看到,title 的默认行为还是触发了,所以通过事件阻止默认行为失败了。


css 阻止


  1. shadow DOM 我们通过这个可以实现一些效果,隐藏 <video> 的下载功能,隐藏 <input type="number"> 的右侧按钮。但是 title 不属于这部分,所以无法控制。


  1. pointer-events 通过设置为 none 的确可以阻止 title ,但是也无法接收事件了。


js 阻止


js 方案肯定是兼容性最好的方法,我们再来看看题目,Vue 的 ssr 为了 seo 给标签增加了 title。


那么我们可以有针对性的提出几个方案:

  1. 钩子函数移出 title 属性。


  1. 实现 hover 效果,移除 title 属性。


  1. 覆盖标签、或者标签替换等方案。


SSR 的生命周期钩子函数


组件生命周期钩子函数


生命周期钩子函数中,只有 beforeCreatecreated 会在服务器端渲染 (SSR) 过程中被调用。其他生命周期钩子函数中的代码(例如 beforeMountmounted ),只会在客户端执行。


SEO 抓取 & 搜索引擎的蜘蛛


有个常识性的东西:抓取的只是静态的 HTML。


不知道有杠精没,我简单说一下吧:因为只抓取静态的,所以我们普通的 Vue 渲染的页面是不会抓取的,所以才要使用 SSR 服务端渲染这个方案。


基于这个常识,我们 js 操作 DOM 不会影响 SEO。



实现方案(mounted 钩子移除)


基于上面的逻辑,那么我们就可以在 mounted 中把所有 title 隐藏就好了。

这样用户使用的时候就是一个没有 title 属性的标签,也就不会有默认效果了。


<a :title="isShowTitle&&title"></a>
data: {
    isShowTitle: true,
    title: 'https://www.lilnong.top'
},
mounted(){
    this.isShowTitle = false
}


实现方案(hover 效果)


mouseenter、mouseleave 动态的移除和添加 title 属性。


如果觉得绑定事件太复杂,可以用原生使用事件委托来搞。


实现方案(jquery&原生 用选择器来移除)


$('[title]')document.querySelectorAll('[title]') 就可以获取到所有存在 title 属性的标签。然后遍历把title属性移除就可以

相关文章
|
7月前
|
Web App开发 前端开发
Chrome 浏览器插件 V3 版本 Manifest.json 文件中 Action 的类型(Types)、方法(Methods)和事件(Events)的属性和参数解析
Chrome 浏览器插件 V3 版本 Manifest.json 文件中 Action 的类型(Types)、方法(Methods)和事件(Events)的属性和参数解析
237 0
|
4月前
|
存储 缓存 前端开发
前端谷歌浏览器面版属性
【8月更文挑战第19天】前端谷歌浏览器面版属性
55 0
|
5月前
|
存储 Web App开发 JavaScript
浏览器【详解】Cookie(含Cookie的起源,属性,个数和大小限制,作用,优点,缺点,JS 的操作方法等)
浏览器【详解】Cookie(含Cookie的起源,属性,个数和大小限制,作用,优点,缺点,JS 的操作方法等)
248 0
|
7月前
|
编解码 JavaScript 前端开发
BOM和DOM:BOM(浏览器对象模型)提供了与浏览器交互的能力,如弹窗、定时器等;DOM(文档对象模型)提供了操作HTML元素的能力,如获取、修改元素内容和属性。
BOM和DOM:BOM(浏览器对象模型)提供了与浏览器交互的能力,如弹窗、定时器等;DOM(文档对象模型)提供了操作HTML元素的能力,如获取、修改元素内容和属性。
80 2
|
JavaScript
inert 属性,让浏览器忽略所有用户交互
在浏览器中,用户交互包括永远排在第一位,不可被打断,哪怕浏览器在假死的状态下,用户的交互行为也是不可被打断的; 但是在inert属性的作用下,用户的交互行为就会被忽略,接下来就带你一起来看看inert
133 0
|
存储 Web App开发 编解码
浏览器原理 32 # 跨站脚本攻击(XSS):为什么Cookie中有HttpOnly属性?
浏览器原理 32 # 跨站脚本攻击(XSS):为什么Cookie中有HttpOnly属性?
192 0
浏览器原理 32 # 跨站脚本攻击(XSS):为什么Cookie中有HttpOnly属性?
|
Windows
el-input在ie浏览器下readonly属性出现光标
el-input在ie浏览器下readonly属性出现光标
206 0
Selenium成长之路-16获取当前页面的title、url及浏览器version等
Selenium成长之路-16获取当前页面的title、url及浏览器version等
258 0
Springboot项目启动后获取配置属性,打开浏览器
Springboot项目启动后获取配置属性,打开浏览器
257 0