tauri学习(2)-a链接伪类visited失效问题
接上节继续,在前端开发中,a链接常用a:visited伪类,用于区分链接点击过后的呈现效果。
在tauri项目模板中,把App组件中添加3个链接:

然后在App.css中添加几个样式:

程序跑起来后,却意外发现:其它几个伪类都起作用,唯独:visited这个伪类,在tairu桌面应用中一点反应都没有,参见下面,上面为tauri桌面应用,下面为浏览器窗口。

从动图效果看出,在浏览器中:visited是能正常生效的,点击后的链接显示为orange橙色,但是在上面的tauri应用中却没反应。其实不光是tauri有这个问题,electron同样也有类似问题。
StackOverFlow上有外国网友给出了解决思路:将访问过的链接,写入localStorage中,然后在组件生命周期的DidUnmount中,给这些链接,强行附加一个额外样式。
先定义2个常量,分别用于localStorage存放访问过的a链接记录,另1个则是强行附加的样式类名
const LOCAL_STORAGE_HISTORY_KEY = "visitedHistory";
const VISITED_CLASS_NAME = "visited";
核心代码1:setVisited
从localStorage中取出点击过的a链接记录(先不管如何存入localStorage的,后面会讲到,假如已经有了),然后判断记录是否过期,如果过期了则删除(重要!否则一直不停点,一直不停向localStorage中存,列表越来越大,早晚崩溃),然后将每个a链接的href跟访问记录匹配,对上了,则追加1个visited的样式(当然:这个样式要额外写)
/**
* 根据localStorage里的历史记录,将a附加上visited样式
* by 菩提树下的杨过http://yjmyzz.cnblogs.com/
*/
function setVisited() {
let localstorageSimuHistory = localStorage.getItem(LOCAL_STORAGE_HISTORY_KEY);
let simuHistory = localstorageSimuHistory ? JSON.parse(localstorageSimuHistory) : []; //过期访问记录清理
const now = new Date();
let hasExpired = false;
for (let i = simuHistory.length - 1; i >= 0; i--) {
let item = simuHistory[i];
//过期的访问记录删除
if (now.getTime() > item.expire) {
simuHistory.splice(i, 1)
hasExpired = true
}
}
if (hasExpired) {
if (simuHistory.length <= 0) {
localStorage.removeItem(LOCAL_STORAGE_HISTORY_KEY);
}
else {
localStorage.setItem(LOCAL_STORAGE_HISTORY_KEY, JSON.stringify(simuHistory));
}
} //遍历所有a,访问过的,则强制附加visited样式
let elements = document.getElementsByTagName('a');
for (let i = 0; i < elements.length; i++) {
for (let h = 0; h < simuHistory.length; h++) {
if (elements[i].href === simuHistory[h].url && elements[i].className.indexOf(VISITED_CLASS_NAME) === -1) {
elements[i].className += ` ${VISITED_CLASS_NAME}`;
}
}
}
}
localStorage中的数据,大致长这样:

核心代码2:addHref
每个链接点击后,将自身的href存入localStorage
/**
* a链接点击后将url加入localStorage
* @param url
*/
function addHref(url: String) {
let localstorageSimuHistory = localStorage.getItem(LOCAL_STORAGE_HISTORY_KEY);
let simuHistory = localstorageSimuHistory ? JSON.parse(localstorageSimuHistory) : [];
let found = false;
const now = new Date();
//访问记录过期时间设置(此处仅为示例:30秒)
const ttl: number = 1000 * 30; for (let i = simuHistory.length - 1; i >= 0; i--) {
let item = simuHistory[i];
if (item.url === url) {
found = true;
//过期时间续租
simuHistory[i] = { "url": url, "expire": new Date().getTime() + ttl };
break;
}
}
//如果本链接不在访问列表里,则添加
if (!found) {
simuHistory[simuHistory.length] = { "url": url, "expire": new Date().getTime() + ttl };
localStorage.setItem(LOCAL_STORAGE_HISTORY_KEY, JSON.stringify(simuHistory));
} //此处只是为了方便,把所有点过的a全刷了一把,还可以再优化下(略)
setVisited();
}
核心代码3:bindAddHref
给每个a链接的click绑定事件
function bindAddHref() {
let elements = document.getElementsByTagName('a');
for (let i = 0; i < elements.length; i++) {
elements[i].onclick = () => {
addHref(elements[i].href);
}
}
setVisited();
}
有了上面3个核心方法,就可以在App的生命周期"DidMount"挂载阶段,调用bindAddHref,为每个a链接自动绑定click事件

当然App.css里得手动添加.visited样式
.visited {
color: orange !important
}
最后运行的效果如下:

从运行效果上看,"大致"跟浏览器上的表现相同,但值得说明的是,这毕竟只是一种变相的解决方法,二者还是有差别的,如果用开发者工具,把localStorage清了,而浏览器并不清除缓存(反过来也一样),二者的表现还是有差异,不过大多数情况下,上述解决方案,应该能满足业务要求了。
文中示例代码:https://github.com/yjmyzz/tauri-visited-solution
tauri学习(2)-a链接伪类visited失效问题的更多相关文章
- css---3链接伪类与动态伪类
链接伪类link:表示作为超链接,并指向一个未访问的地址的所有锚 链接伪类不可以加在div上 <!DOCTYPE html> <html> <head> <m ...
- 从零开始学 Web 之 CSS(三)链接伪类、背景、行高、盒子模型、浮动
大家好,这里是「 Daotin的梦呓 」从零开始学 Web 系列教程.此文首发于「 Daotin的梦呓 」公众号,欢迎大家订阅关注.在这里我会从 Web 前端零基础开始,一步步学习 Web 相关的知识 ...
- CSS链接伪类:超链接的状态
一.状态: a:link{属性:值;} 链接默认状态 a:visited{属性:值;} 链接访问之后的状态 a:hover{属性:值;} 鼠标放到链接上显示的状态 a:active{属性:值;} 链接 ...
- 【IE6的疯狂之八】链接伪类(:hover)CSS背景图片有闪动BUG
IE6下链接伪类(:hover)CSS背景图片有闪动BUG,主要原因ie会再一次请求这张图片,或者说图片没被缓存. 例如: CSS代码 a:hover{background:url(imagepath ...
- 【转】链接伪类(:hover)CSS背景图片有闪动BUG
来源:http://www.css88.com/archives/744 --------------------------------------------------------------- ...
- CSS学习笔记2:伪类
w3c对伪类的定义是:CSS伪类是用来添加一些选择器的特殊效果. 在我目前看来就是动态的对元素的修饰 它的基本语法是 选择器:伪类{} 伪类有以下几种 常用的伪类: :link,:vi ...
- IOS 伪类:active失效
IOS中不兼容:active伪类,所以在状态控制上就会有问题,解决办法是,添加一个空的点击事件: 移动端添加:ontouchstart <a class="m-btn" on ...
- 有关css伪类visited样式无效的解决方法
错误写法 将visited写在hover和active之后,例如: .ui-page-theme-a .digilinx-ui-btn{background:#00a325;border-color: ...
- 深入学习css伪类和伪元素及其用法
前言 CSS的伪类和伪元素在平时的代码中经常会出现,可是一旦别人问你,什么是伪类,什么是伪元素,可能还是不能完整的表述出来,下面我们来一探究竟. 伪类和伪元素定义 伪类用于在页面中的元素处于某个状态时 ...
- css 伪类: 1)a:link , a:visited, a:hover, a:active 2):first-child
1. 链接伪类: <!DOCTYPE html> <html lang="zh-CN"> <head> <meta charset=&qu ...
随机推荐
- 8.6K star!完全免费+本地运行+无需GPU,这款AI搜索聚合神器绝了!
嗨,大家好,我是小华同学,关注我们获得"最新.最全.最优质"开源项目和高效工作学习方法 FreeAskInternet是一款革命性的开源项目,它完美结合了多引擎搜索和智能语言模型, ...
- 可持久化 01-trie 简记
本文略过了 trie 和 可持久化的介绍,如果没学过请先自学. 在求给定一个值 \(k\) 与区间中某些值的异或最大值时,可以考虑使用在线的数据结构可持久化 01-trie 来维护. 01-trie ...
- Java5新特性--可变参数
可变参数 public class Test01 { public static void main(String[] args) { System.out.println(add(123)); Sy ...
- 中国版 Cursor:CodeBuddy
我正在参加CodeBuddy「首席试玩官」内容创作大赛,本文所使用的 CodeBuddy 免费下载链接:腾讯云代码助手 CodeBuddy - AI 时代的智能编程伙伴 一句话即可让 AI 助手生成网 ...
- Intel指令集及SIMD数据加速
查看CPU相关信息 执行结果举例: 查看电脑CPU支持的指令集: cat /proc/cpuinfo | grep "processor" | wc -l 支持的指令集: 向量指令 ...
- sympy简明用法
系统学习Sympy 什么是Sympy Sympy 是一个可以进行符号运算的第三方科学计算库,数学对象可以被精确的表达,而不是近似值,这也意味着带有未计算的未知量可以以符号的形式留在数学表达式中. im ...
- Nuxt的SEO实践
第9章:Nuxt的SEO实践 1. 引言 Nuxt框架在SEO方面的优势主要体现在以下几个方面: 服务器端渲染(SSR): Nuxt默认支持SSR,这意味着搜索引擎爬虫可以直接看到完整的页面内容,而不 ...
- Error: A JNI error has occurred, please check your installation and try again Exception in thread "main" java.lang.UnsupportedClassVersionError: HelloWorld has been compiled by a more
一个新手容易遇到的问题,电脑上装了多个版本的java,比如8和11,导致javac和java的版本不一样 在控制面板里将其他版本卸载,留个8就行 然后在环境变量里重新配置一下就ok
- 集合操作交并补的三种Java实现
基本概念 为了便于理解,下面首先介绍集合的三个基本操作:并集.交集和补集. 并集:以属于A或属于B的元素为元素的集合称为A与B的并(集),记作A∪B(或B∪A),读作"A并B" ...
- Linux vmstat命令快速入门
vmstat是Virtual Meomory Statistics(虚拟内存统计)的缩写,可对操作系统的虚拟内存.进程.CPU活动进行监控.是对系统的整体情况进行统计,不足之处是无法对某个进程进行深入 ...