当前位置:网站首页>你的 Link Button 能让用户选择新页面打开吗?
你的 Link Button 能让用户选择新页面打开吗?
2022-08-09 21:54:00 【InfoQ】
1. 什么是Link Button?
什么是导航能力?
<a>href<button>hrefonclick2. 用户怎么选择新页面打开?
2.1 新标签页(tab)打开
Command(Mac)/Ctrl(Windows) + 鼠标左键click
- 鼠标中键click
- 鼠标右键click,在菜单选择“在新标签页中打开链接”
- (无障碍)通过
Tab,选中链接时,按Command(Mac)/Ctrl(Windows) + 回车键Enter
2.2 新窗口(window)打开
Shift+ 鼠标左键click
- 鼠标右键click,在菜单选择“在窗口中打开链接”
- (无障碍)通过
Tab,选中链接时,按Shift+ 回车键Enter
3. 什么是极致的用户体验?
4. 如何优雅的实现“Link Button”
4.1 新手方案:
<button>
+
onclick
<button>onclickwindow.open(url)window.document.href = urlwindow.location.replace(URL)- 用户根本无法选择在新页面or本页面打开,只能接受你的实现。
- 用户根本不知道点击按钮后会发生什么。(如果是
<a>标签,用户hover时,会在浏览器左下方看到新页面 URL)
4.2 中手方案:
<button>
+
onclick
+
event
CommandCtrl// buttonElement 是html中某个<button>元素
buttonElement.onclick = function (event) {
if (event.ctrlKey || event.metaKey) {
window.open('某个url');
} else {
window.document.href = '某个url';
}
};
onclickeventCtrlCommand4.3 高手方案:
<a>
+
onclick
+
event
<a><a>4.3.1 样式问题
<button><a><a><a>a, a:link, a:visited, a:hover, a:active {
color: inherit;
text-decoration: none;
}
4.3.2 JS逻辑问题
<a>href- 跳转时,需要传路由state。
- 某些逻辑,只希望本页面跳转时执行,不允许新页面打开时执行(因为JS只能执行本页面的JS,如果在新页面打开,本页面应该保持不变,不能执行那段JS,例如React Router中的
<Link>)。
- 某个按钮,直接点击时是
window.history.back(),但也允许新窗口打开上个页面地址(这个问题更加复杂,请期待我的下篇文章,会做详细讲解)
这些问题的解决方案
// aElement是html中的某个包含href的<a>元素: <a href="某个url">某个链接</a>
aElement.onclick = function (event) {
if (event.button !== 0) return;
if (event.ctrlKey || event.metaKey || event.shiftKey || event.altKey) return;
event.preventDefault();
// 如果用户期望本页面跳转(而非新窗口打开),则执行以下逻辑
window.history.pushState({ pageState: 123 }, '', 'new-page.html');
};
event.button
- 0:主按键,通常指鼠标左键或默认值
- 1:辅助按键,通常指鼠标滚轮中键
- 2:次按键,通常指鼠标右键
- 3:第四个按钮,通常指浏览器后退按钮
- 4:第五个按钮,通常指浏览器的前进按钮
event.xxxKey
event.ctrlKey: MAC上表示Control键,Windows上表示Ctrl键。
event.metaKey: MAC上表示Command键,Windows上表示Windows键。
event.shiftKey: Shift键。
event.altKey: MAC上表示Option键,Windows上表示Alt键。
ctrlKey+click: Mac上表示右键点击该元素,Windows上表示新标签页打开页面。
metaKey+click: Mac上表示新标签页打开页面,Windows上打开Windows开始菜单。
shiftKey+click: 新窗口打开页面。
altKey+click: 下载页面。
event.preventDefault()
<a>5. 写在最后
MenuButtonLinkLink边栏推荐
- Easyui 表单验证「建议收藏」
- Interviewer: How to deal with Redis big key?
- 孙正义亏掉1500亿:当初投贵了
- 面试官:Redis 大 key 要如何处理?
- json case
- OpenMLDB + Jupyter Notebook:快速搭建机器学习应用
- Cookie、session、token
- AI Knows Everything: Building and Deploying a Sign Language Recognition System from Zero
- nvm下node安装;node环境变量配置
- One Pass 2074: [21CSPJ Popularization Group] Candy
猜你喜欢

AI+Medical: Using Neural Networks for Medical Image Recognition and Analysis
6个规则去净化你的代码

台风生成,广州公交站场积极开展台风防御安全隐患排查

论文解读(DropEdge)《DropEdge: Towards Deep Graph Convolutional Networks on Node Classification》
![[Implementation of the interface for adding, deleting, checking, and modifying a double-linked list]](/img/49/ebedcd4d27aa608360ac17e504f36d.png)
[Implementation of the interface for adding, deleting, checking, and modifying a double-linked list]

肝通宵写了三万字把SQL数据库的所有命令,函数,运算符讲得明明白白讲解,内容实在丰富,建议收藏+三连好评!

【微服务~Nacos】Nacos服务提供者和服务消费者

阿里云架构师金云龙:基于云XR平台的视觉计算应用部署

js十五道面试题(含答案)
6 rules to sanitize your code
随机推荐
TF生成均匀分布的tensor
技术分享 | 接口自动化测试如何处理 Header cookie
几种绘制时间线图的方法
一文让你快速了解隐式类型转换【整型提升】!
编译原理之文法
Chatting embarrassing scenes, have you encountered it?Teach you to get the Doutu emoticon package with one click, and become a chat expert
Technology Sharing | How to use the JSON Schema mode of interface automation testing?
This article lets you quickly understand implicit type conversion [integral promotion]!
腾讯继续挥舞降本增效“大刀”,外包员工免费餐饮福利被砍了
Metasploit常用命令、技术功能模块
面试官:MySQL 中 update 更新,数据与原数据相同时会执行吗?大部分人答不上来!
How to Make Your Company Content GDPR Compliant
README_Albumentations
【微服务~Nacos】Nacos服务提供者和服务消费者
Flask之路由(app.route)详解
LeetCode26:删除有序数组中的重复项
Evolution of MLOps
nvm下node安装;node环境变量配置
台风生成,广州公交站场积极开展台风防御安全隐患排查
Bean生命周期