【问题标题】:Complex Selector breaks in jQuery 1.8, but worked in 1.7.2复杂选择器在 jQuery 1.8 中中断,但在 1.7.2 中有效
【发布时间】:2012-08-13 21:30:17
【问题描述】:

我有一些这样的 HTML(是的,这有点奇怪,但它是一个现有的项目):

<table>
<tr id="21.30---22.00">
    <td class='51'>Text</td>
</tr>
</table>​

还有一些这样的JS:

$(document).ready(function(){
    var time = "21.30---22.00";

    // jQuery needs . to be escaped to \\.
    // Regex needs \ to be escaped as \\. 
    // JS needs \ to be escaped as \\.

    time = time.replace(/\./g,'\\\\\\.');

    $("tr#" + time + " td.51").css("color","blue");
});​

实际上,时间字符串是由一些 JSON 生成的,因此很奇怪。

这在以前的 jQuery 版本中有效,但在 1.8 中没有,可能是由于 Sizzle 的变化。这是一个不工作的例子:

jQuery 1.7.2:http://jsfiddle.net/VnA4m/

jQuery 1.8:http://jsfiddle.net/VnA4m/1/

关于如何从time = "21.30---22.00" 获取适用于 1.8 的选择器的任何想法?

【问题讨论】:

  • stackoverflow.com/questions/70579/… - 这更像是一个建议;但可能值得重新考虑您的 id 值。 :)
  • 是的,我知道。我不知道为什么我会像 2 年前那样写这篇文章,你在 2 年内学到的东西太棒了,不是吗!

标签: javascript jquery sizzle


【解决方案1】:

试试这个代码--- 它将使用属性选择器进行选择

$("[id='21.30---22.00']").foo

【讨论】:

  • +1 因为这是一个更好的解决方案。也许使用自定义的.filter 函数会更加健壮。
【解决方案2】:

正则表达式不需要转义\s - 你的正则表达式中唯一的东西是.。此外,jQuery 的要求是它必须接收斜线;这就是为什么您需要两个以便 JavaScript 解释器不使用它的原因。

所以,\\. 应该足够了:http://jsfiddle.net/VnA4m/2/。这也适用于 jQuery 1.7.2 - 我不确定为什么多余的斜线实际上在那里工作。看起来这是一个错误 - \\\\. 失败,\\\\\\. 再次起作用...

【讨论】:

  • 您最后的陈述不适用于 html5:w3.org/TR/2011/WD-html5-20110525/elements.html#classes - 就像 ID 一样,这些限制已被删除。
  • @Cripstoph:你说得对,但.a 有效,而.1 无效。也许要求在于 CSS 选择器规范。
  • 非常感谢 - 想知道为什么 \\\\\\ 曾经工作过?!虽然你的代码是我使用的代码,但我给了另一个人接受的答案,因为他只有 107 个代表,我从来没有想过这样做:)
  • @pimvdb 仔细看看 - .1 工作 - 这是第一个控制台调用,而 .a 没有......也在你的小提琴 /2/ 你正在使用一个以开头的类一个数字,它也可以工作。
  • @Christoph:你完全正确,我交换了那些。 #\\\\\\. td.a 有效还是很奇怪,但我的推理确实没有意义。
猜你喜欢
  • 2017-10-03
  • 1970-01-01
  • 1970-01-01
  • 2010-12-27
  • 1970-01-01
  • 2015-01-25
  • 2012-10-30
  • 2015-11-12
  • 2021-05-06
相关资源
最近更新 更多