Leooonard / Notes

2 stars 0 forks source link

两道题目 #15

Open Leooonard opened 8 years ago

Leooonard commented 8 years ago

1. 自己对自己提一道问题。

问题:为什么无法对已访问的链接改变诸如高,宽等css属性。

答:

为了防止用户的浏览历史被泄露,规范中对:visited link做了部分限制,包括

但是,为了区别已访问链接和未访问链接,规范中还是留了几个css属性给开发者,包括:

用户的浏览记录无疑是十分重要的资源,掌握了这些数据就可以分析用户的行为,所以为了防止通过:visited link偷取用户浏览记录,规范做了以上限制。对于getComputedStyle的限制十分容易理解,而对于css属性的限制则令人疑惑,为什么只放出那4个属性?

原因是其他属性的改变将引起如布局的改变,而浏览记录的偷窃者虽然无法获取:visted link的computed style,却仍可以获取其他元素的computed style,布局的改变将势必将引起其他元素的变化,因此偷窃者可以通过监听其他元素的变化来判断用户浏览了哪些链接。下面以width属性为例重现上述场景:

假设规范开放了width属性给:visted link。那么偷窃者可以在所有link后放置一个看不见的元素,将链接与其看做一对,并记录看不见的元素的offsetX,当用户点击link后,link的width发生了改变,自然,看不见的元素的offsetX也发生了改变,也就可以得知用户点击了哪个链接。

而对:visited link颜色的改变则无法通过其他元素进行察觉。

2. dom tree 先序遍历。

dom tree其实是一棵多叉树,所以同样可以通过先序遍历,具体实现不在此多说,网上随便一搜都是。。。但是需要提两点:

2.1 为什么使用先序遍历? 遍历多叉树可以使用深度优先及广度优先的方式,同时深度优先中又有先序,中序,后序三种,先序遍历较其他方式有何优点?理由如下例:

// 有html如下
<p>today<span>is</span></span>monday</span></p>
// 其树结构如下
              p
              |
text node - span - span
      |       |         |
  today     text node text node
              |         |
             is   monday
/*
如果我们想遍历dom tree获取其中的textContent,可以发现,使用先序遍历得到的字符串是today is monday,仍然符合原来顺序,而其他方式则不行。
*/                   

2.2 先序遍历通常会使用递归,而浏览器中对递归栈的上限做了限制,因此通常会使用迭代来代替递归。在此问题上使用迭代替代递归,即自行维护一个将要访问的节点栈。