Loading

《前端们,贺老 Live 面试你了!》所引发的思考与实践

贺老在知乎live中提到了一个这样的问题:

  产品经理提出了一个需求:用户点击文章阅读,返回之后阅读其他文章。当用户看得多了,容易点到自己看过的文章,造成时间浪费。所以想给点击过的文章加一个标记,如:《新闻一二三》-(已读)。问:如何实现

 

我想这问题简单啊,直接遍历给每个a标签添加click事件,点击后改变a标签内的文字。然后在微信群里就有人说:visited,我去,这个更好点,刚开始竟然没想到。

事实上,很多人入坑了,是我(们)有点naive。。。(大家可以自行尝试:visited是否可以实现= =)

贺老不断强调有思路很好,但是要写出来。不一会就有人说:visited实现不了,浏览器没反应,根本不渲染,然而我发现我的方法同样不能实现,这个时候贺老说:为什么不能实现,于是听众纷纷去谷歌。问题找到了:

“Privacy and the :visited selector”

详细内容请访问:https://developer.mozilla.org/en-US/docs/Web/CSS/Privacy_and_the_:visited_selector

原因由于浏览器的隐私保护,:visited只能改变访问过元素的

真是眼界大开啊,之前从未遇到过这样的问题。贺老继续问道,问题出现之后不能抛下不管,那么应该如何解决呢?

live中有人提到了一些 css奇淫技巧,用localStorage存取点击链接的索引,交给后端解决等。

css奇淫技巧是提前设置好a标签元素的内容,让“已阅读”文字颜色与背景色一致,点击后更改“已阅读”文字颜色,确实很棒,但是也有缺点,全选之后就全露馅了。。

与由于我不是很熟悉后端这边具体的解决思路,于是决定使用localStorage存取点击过的连接来实现,那么接下来就是实践部分:

如果不太熟悉localStorage,首先请阅读:《localStorage和sessionStorage的区别》:http://www.cnblogs.com/diligenceday/p/4073136.html

下面是代码,css就不贴了

html:

                <a href="http://www.baidu.com" >百度123</a>
        <a href="http://www.baidu.com" >百度222</a>
        <a href="http://www.baidu.com" >333</a>
        <a href="http://www.baidu.com" >444</a>
        <a href="http://www.baidu.com" >555</a>
        <a href="http://www.baidu.com">666</a>
        <a href="http://www.baidu.com">777</a>
        <a href="#dsad">888</a>            

js:

 1 var a = Array.from(document.querySelectorAll("a"));//类数组对象转换为数组对象
 2 
 3         a.forEach(function(e,index){
 4             e.addEventListener("click",function(){
 5                 if(window.localStorage){ //判断浏览器是否可以使用localStorage
 6                 if(!localStorage.getItem(index)) //防止重复设置
 7                 {
 8                     localStorage.setItem(index,"(====已读)");
 9                 }
10                 }
11                 else{
12                     alert("浏览器不支持localStorage")
13                 }
14             });
15         })
16         window.addEventListener("load",function(){ 
17             var localS=Array.from(localStorage);
18             localS.forEach(function(e,index){ //当页面重载,查询localStorage是否存在,
19 
20                 if (localS[index]) {
21                     a[index].innerHTML+=localS[index]; //改变每个被点击过的元素的innerHTML
22                 }    
23                 
24             })
25         })

运行效果:

大概思路:每个a标签被点击》设置localStorage{“index”,“已读”}》window监听load事件》如果localStorage存在一个索引相对的“已读”》设置a数组中该索引的a元素的innerHTML=“已读”

文章中如果出现错误,请果断评论指出,谢谢

文章为原创,转载请注明出处

 

posted @ 2016-12-02 20:28  低吸埋伏  阅读(975)  评论(4编辑  收藏  举报