Bizarre behavior with :select in .find()

时间:2017-04-06 16:55:58

标签: jquery

I'm in the process of updating a site that currently uses jQuery 1.3.2 to at least 1.10.2. When I do, the site chokes on commands like this:

this.form.find(':select[name="fieldtype"]');

This shouldn't work - it should be: this.form.find('select[name="fieldtype"]'); - without the colon - but it in fact works.

I've found nothing that suggests ':select...' is valid. Is it possible that the colon was simply ignored in jQ 1.3.2?

1 个答案:

答案 0 :(得分:1)

修改

我完全忘记了自定义伪选择器。如果出于传统目的,您需要更新版本的jQuery来处理:select select,您可以这样做:

jQuery.extend(jQuery.expr[':'], {
    select: function (el) {
        return jQuery(el).is('select');
    }
});

现在jQuery(':select')jQuery('select')是等效的表达式。

<强>解释

jquery使用的sizzle css选择器引擎似乎是一个错误,因此jquery可以在document.querySelectorAll之前选择dom元素(或广泛使用的东西)。 jQuery 1.3.2使用sizzle 0.9.3(pre version 1!),jQuery的下一个版本1.4.0使用sizzle 1.0.0,其中没有bug。

该错误特别似乎是以“:”为前缀的正确标签将被解释为标签而不是无效的伪

你可以证明嘶嘶声是罪魁祸首:

  • 下载jquery 1.3.2和jquery 1.4
  • 复制sizzle 1.0.0块 超出1.4并替换1.3.2
  • 中的sizzle 0.9.3块

您的“混合1.3.2”版本现在也将拒绝选择器。