为什么职能假点,如:不()和:有()允许引用参数呢?(Why do functional pseud

2019-06-18 05:01发布

显然,同时作为评论我发现另一个答案 ,jQuery的(而其底层选择器引擎灒 )让你引用参数的:not()选择还有:has()选择。 要机智 :

$('div:not("span")')
$('span:has("span")')

在选择器标准 ,报价总是代表从未选择或关键字串并,所以引述参数:not()始终是无效的。 这不会在选择器4改变。

您还可以看到它的非标准语法通过增加一个不支持CSS选择器如:nth-last-child(1) 使选择完全失败 :

$('div:not("span"):nth-last-child(1)')
$('span:has("span"):nth-last-child(1)')

有没有什么好的理由,技术或其他,允许报价吗? 浮现在脑海中的唯一可能性是:

  • 一致性:contains()它允许两个报价,不带引号的参数,如在看到旧选择器规范 。 除了:contains()接受字符串/关键字,而不是选择...

  • 一致性与使用自定义伪寄存器执行$.expr[':']不带引号的参数,它总是允许引用和。

  • 一致性和易用性移植到他们的方法同行.not().has()只是删除或拆分外报价和改变冒号期?)。

但是,我找不到任何来源,以支持或反对。 事实上,引用选择参数本身的能力不记录任何地方任,也没有,似乎有报价,而不是报价参数之间的任何差别:

$('div:not(span)')
$('span:has(span)')

Answer 1:

这是不特定于:not(...):has(...) selectors-实际上,在所有灒假点允许引用参数。 对于假点参数的图案被定义为:

pseudos = ":(" + characterEncoding + ")(?:\\((?:(['\"])((?:\\\\.|[^\\\\])*?)\\2|([^()[\\]]*|(?:(?:" + attributes + ")|[^:]|\\\\.)*|.*))\\)|)"

这可在线发现91sizzle.js作为831c9c48...

让我们一些缩进补充,让它多一点可读性。 不幸的是,这仍然是一个正则表达式,所以“有点更具可读性”还剩下很多有待改进:

pseudos = (
    ":(" + characterEncoding + ")" +
    "(?:" +
    "\\(" + // literal open-paren
        "(?:" +

                "(['\"])" + // literal open-quote
                    "((?:\\\\.|[^\\\\])*?)" + // handle backslash escaping
                "\\2" + // close-quote

            "|" + // - OR -

                "(" +
                    "[^()[\\]]*" +
                    "|" +
                    "(?:" +
                        "(?:" + attributes + ")" +
                        "|" +
                        "[^:]" +
                        "|" +
                        "\\\\." +
                    ")*" +
                    "|" +
                    ".*" +
                ")" +

        ")" +
    "\\)" + // literal close-paren
    "|" + // ie, 'or nothing'
")"
);

从这个主外卖是:单一或双引号可以围绕以伪属性参数被使用。 反斜杠得到妥善处理,所以任意字符串可以作为参数传递英寸 注意,“字符串”部分中相同的匹配指数在上述正则表达式的“选择器”的一部分卷起; 所以,总之,这就是为什么他们都一视同仁:因为pseudos模式不区分两者。 编辑:在jQuery 1.8.2中,有和没有报价参数是更明确地等同。 我似乎无法找到这个代码在jQuery的git仓库[帮助将不胜感激],而是由谷歌主办的1.8.2版本,其a0f48b6ad5322b35383ffcb6e2fa779b8a5fcffc的SHA1SUM ,有一个"PSEUDO":上线功能4206 ,它不明确检测“援引”和“不带引号的”参数之间的差异,并确保它们都在同一个地方拉闸。 这个逻辑伪的类型(“位置”或不)其中参数是区分。

作为灒使用JavaScript字符串揭开序幕的选择过程中,存在“串”和“选择”当参数传递到函数之间没有区别。 制作那种区别将是可能的,但据我所知,什么是真正需要的是总是很容易从最基本的方面来确定(即:正在使用什么类型的假的),所以没有真正的理由做出区分。 (请在评论改正,如果有哪个我不知道我OF-想知道的任何模糊的情况!)。

那么,如果缺乏字符串和选择之间的区别仅仅是一种实现细节,为什么假点,如:eq(...)明确地拒绝这样的选择?

答案很简单:没有,真的。 至少,不作为的jQuery 1.8.1。 [ 编辑:在jQuery 1.8.2的,它不会在所有。 的“位置”假点的参数可以被引用,就像其他任何东西。 关于1.8.1实施细则下面的注释被留下是一个历史的好奇心]

如功能:eq(...)被实现为:

"eq": function( elements, argument, not ) {
    var elem = elements.splice( +argument, 1 );
    return not ? elements : elem;
}

在那个时间:eq(...)接收的说法,它仍然是一个裸露的参数(报价和所有)的形式。 不同于:not(...)这种说法不通过去compile(...)阶段。 该无效参数的“拒绝”,其实是由于通过快捷铸造+argument ,这将导致NaN任何引用字符串(这反过来,从不匹配任何内容)。 这是又一个实现细节,但在这种情况下,“正确”行为一个(再次,据我所知,有没有的情况下非数字的参数,以这样的功能其实应该匹配?)

编辑:在jQuery 1.8.2的,事情已经有所重构,并且“位置”假点没有再收到“原始”的说法。 其结果是,引用参数现在接受:eq(...)等。 这种变化似乎是另一个bug修正的副作用,因为是在更改日志引用论据,没有提到支持af8206ff .. ,这是为了解决在处理一个错误:first:last ,jQuery的错误# 12303 。 这次提交使用中发现git bisect和相对简单的phantomjs脚本 。 值得注意的是,滋滋声中改写后e89d06c4 .. ,灒不会只是默默地失败的选择,如:eq("3")它实际上将抛出一个异常。 这应该被视为还多的证据表明:eq("3")的支持不是预期的行为。

的确是有关于自定义过滤器,因为他们的言论可能会在某些情况下被认为是弦理论基础,并且有时选择,不管他们表面上看起来,这取决于他们评估的方法......但是,许多将至迂腐。 它应足以说,没有在至少一个区别使事情变得更简单的通话功能,这,不管他们可能代表,期待一个字符串表示的时候。

总之,整个情况可以被认为是一个实现细节,并植根于一个事实,即选择被传来传为首位字符串(怎么回事,你会得到他们进入灒?)。



文章来源: Why do functional pseudos such as :not() and :has() allow quoted arguments?