如果您的CSS是自托管的,您可以:
- 获取所有CSS块的列表
- 过滤掉在块的选择器中不包含
:first-letter
的CSS块
- 迭代剩余CSS块的列表,并以目标元素作为接收者,以当前CSS块的选择器作为参数运行
matchesSelector()
。
- 如果
matchesSelector()
返回true
,则当前CSS块的规则会影响目标元素的第一个字母。
- 否则,继续进行列表中的下一个CSS块
如果CSS不是自托管的且CDN未发送CORS标头,则由于隐私问题,无法读取CSS文件源,并且无法执行此操作。
我还从算法中省略了规则级联的解决方法。另一个问题是找出伪类选择器如何以错误的方式影响
matchesSelector
。
例如,请考虑:
p.webkitMatchesSelector("p:first-letter") //false
因此,在尝试匹配之前,必须从字符串中删除伪类,例如
:first-letter
,因为它们是不相关的(但像
:nth-child
这样的伪类则不然,因为它们确实会影响匹配)。
演示
http://jsfiddle.net/PBuzb/5/(请记住,我提到的问题在这里处理得不太好)(代码的基础原本由Crush撰写)。
为什么在跨域情况下不允许读取CSS源代码?
您只能从其他域名显示图像、运行css/js等,但绝不能以任何方式访问其数据的原因是隐私。
最容易解释的案例是图片。假设我已登录facebook,而facebook使用如
http://facebook.com/myprofile.png这样的URL来访问私人照片。现在我去了evil.com,而evil.com可以加载该图像,因为我已经登录到facebook,facebook将给他们该图像。通常情况下,他们无法访问图像或以任何方式窃取它,但如果我们启用了跨域数据访问,他们现在可以访问我的私人照片并传播它们出去。
CSS中也可能发生同样的情况,facebook服务器生成的特定于用户的CSS可能包含我私人朋友的用户ID。如果任何我可以访问的网站都可以链接到该CSS并开始阅读它,那么它们将不再是那么私密。
是的,主要问题在于浏览器在跨域请求中发送cookie的方式,如果浏览器在从evil.com请求facebook图像/CSS时没有发送cookie,则facebook无法响应特定于用户的CSS或我的私人照片,因为cookie是必需的以识别我。
现在想象一下,如果浏览器不发送cookie。evil.com仍然可以通过这种方式访问任何内部数据,因为我的浏览器可以访问内部网。能够在evil.com网站上显示
http://intranet/Myboss.jpg
作为图像不是问题,但evil.com能够读取图像数据,从而能够复制和传播它是一个问题。
.initial
类?如果应用了,那么你就知道:first-letter
伪元素样式已经应用了 - 如果有第一个字母的话(并且浏览器支持:first-letter
)。 - crush