Javascript {x:expression(…)}做什么?
我遇到了IE7的Javascript {x:expression(…)}做什么?,javascript,expression,Javascript,Expression,我遇到了IE7的queryselectoral多填充: 我本以为我在JavaScript中是Okayish,但我从未见过类似polyfill第9行中引用的部分: {x:expression(document.__qsaels.push(this))} 显然,它是一个JavaScript对象,具有keyx和value表达式(document.\uqsaels.push(this)),但除了我所知道的这一点,它对我来说是神秘的。这个表达式函数做什么?我无法通过谷歌找到任何接近的内容。您正在查看生
queryselectoral
多填充:
我本以为我在JavaScript中是Okayish,但我从未见过类似polyfill第9行中引用的部分:
{x:expression(document.__qsaels.push(this))}
显然,它是一个JavaScript对象,具有key
x
和value表达式(document.\uqsaels.push(this))
,但除了我所知道的这一点,它对我来说是神秘的。这个表达式
函数做什么?我无法通过谷歌找到任何接近的内容。您正在查看生成的CSS规则。这不是一个JavaScript对象,而是一个CSS声明块
线路
styleTag.styleSheet.cssText = selector + "{x:expression(document.__qsaels.push(this))}";
将带有声明块的CSS选择器连接到CSS字符串中。声明块包含一个名为x
的伪CSS属性,其值为expression(document.\uqsaels.push(this))
expression()
是旧版IE的一项非标准功能,它允许作者直接执行任意JavaScript并获取CSS中使用的值。因此,虽然整个字符串是一个CSS声明块,document.\uu qsaels.push(this)
实际上是一个JavaScript表达式
此表达式的作用是将与CSS选择器匹配的任何元素推送到\uqsaels
数组中,以便polyfill可以将其作为选择器匹配的元素集返回。1本质上,这就是polyfill的工作方式
例如,调用polyfilleddocument.querySelectorAll(“.foo”)
会导致IE7将以下CSS附加到文档样式表中:
.foo{x:expression(document.__qsaels.push(this))}
带有一些缩进和换行符,因此它类似于传统的CSS:
.foo {
x: expression(document.__qsaels.push(this))
}
在这里,您可以看到此CSS规则将应用于与.foo
匹配的任何元素,从而使每个元素在返回之前都添加到\uu qsaels
1无论出于何种原因,IE似乎很乐意在未知属性上执行
expression()
语句(假设即使在IE7上也没有名为x
的属性,但我知道什么?).还要记住,x
的值不是表达式函数,而是它的结果。我知道代码被附加到样式表中。不知道为什么。@MikeC:是的,我明白了。这个类似的问题提供了指向CSS表达式的指针,感谢您的挖掘。以前有人偶然发现过它。这是一个相当天才的polyfill。Mike C,但它不像ptdixon在那里提到的那样工作。@Stack0Overflow它在怪癖模式下工作。所以这不是一个完美的解决方案,但我不知道你甚至可以在旧IE中做到这一点。@BoltClock:非常感谢。现在我了解到它实际上是css表达式,而不是JavaScript,我能够挖掘出一些东西。还在研究。