2017-10-19 62 views
1

我正在研究一些前端功能。实际上,我正在做Ajax请求并在调用que后修改UI。JQuery CSS选择器奇怪的行为,为什么?

我确定相关项目/视图,以我的模型(前)使用,因为我通过组合类+ ID选择不同的项目,这将不会是唯一的ID。

简单的例子:

<div id="23"class="status_ic btn btn-info">Status Name</div> 
<div class="botones_applies" id="23"> 
    <div class="btn btn-xs btn-primary btn-acept" id="23"> 
    Acept 
    </div> 
    <div class="btn btn-xs btn-borrar btn-danger btn-deny" id="23"> 
     Deny 
    </div> 
</div> 

我这样做:

$('.botones_applies#23').empty(); 
status_btn = $('.status_ic#23'); 
status_btn.removeClass('btn-info'); 
status_btn.addClass('btn-primary'); 
status_btn.text('Acepted'); 

我没有使用这种选择没有任何问题,但在这里,我遇到了奇怪的行为,更多的意见我第一个选择器不工作,而另一个工作,他们使用相同的逻辑。我注意到,如果我将订单更改为$('#23.botones_applies'),则按预期工作。我可以做到这一点,因为不会破坏任何东西,但我担心为什么会发生这种情况。

$('.botones_applies#23') ---> doesn't work 
$('#23.botones_applies') ---> works 
$('.status_ic#23') ---> works 

有没有我缺少的一些CSS或jQuery规则?也许一些愚蠢的小东西...也许我忘了一些重要的概念..有人会解释我这个?谢谢!

+8

'id'值**必须在文档中是唯一的,所以这是您应该解决的问题,之后这个问题可能会消失。 –

+2

也'ID'值必须以字母开头,而不是数字... –

+0

@MartinAdámek:不,这是不正确的; HTML只关心它们不包含空格。但是如果用CSS开头的话,使用CSS来选择它们会更困难,因为在CSS ID选择器中''不能(正式)使用数字作为第一个字符。 –

回答

3

有我错过了一些CSS或jQuery的规则?

的HTML规则是:id必须在文件中是唯一的。

另外:虽然id值以数字开头,但CSS ID选择器不能,所以#23是无效的选择器。你需要一个转义符(#\32 3,在字符串文字中需要为"#\\32 3")或属性选择器([id="23"])。

+0

'$('[id =“23”] [class =“botones_applies”]')'和'$('[id =“23”] [class =“botones_applies”]')'正在工作。为什么罕见的行为不会出现?我所有的身份证号码均为数字,并且按预期工作。 – aaron0207

+1

@ aaron0207:再说一次:'#23'是一个无效的CSS选择器,所以奇怪的行为并不是它有时会失败,而是它有时会起作用。 (原因是jQuery试图检测并优化ID选择器并将它们转换为'getElementById'调用。)但是,您不希望为'class'使用属性选择器。相反:'$('。botones_applies [id =“23”]')但是,再次:修复ID,它**会再次咬你。你像使用类一样使用它们。改用类。 –

+1

谢谢,现在我能理解它。我知道我做得很糟糕,但是我一直在努力,因为我一直在努力,直到我遇到这种情况 – aaron0207

1

你不具有唯一的ID,这是你最初的问题。

难道我也建议采用JS特定的类,而不是使用IDS。我喜欢用js作为前缀,以便将它们与用于样式的类分开设置。这样做的好处是你可以重复类但不是ID。