2012-03-30 65 views
2

我很努力地使用包含brakcets的jquery选择器。 基本上我从我的jQuery代码中解析服务器的JSON响应。然后,在解析完成后,我遍历该对象。jquery选择器不支持括号

这个对象有这样的结构:

errors = { 
    input#title_id: "error message", 
    select#authors_id[]: "error message 2" 
    } 

然后我遍历这个地图状如下:

$.each(errors, function(fieldSelector,errMsg){ 
    fieldSelector = fieldSelector.replace('[','\\\\['); 
    fieldSelector = fieldSelector.replace(']','\\\\]'); 
    $(fieldSelector).hide(); //for the example 
} 

一切运作良好,除了具有与括号中的ID选择!

回答

0

jQuery Selector documentation,你需要使用两个支架逃跑元字符:

如果你希望使用任何的元字符(如 !"#$%&'()*+,./:;<=>[email protected][\]^{|}~)作为名称的文本部分, 你必须用两个反斜杠来逃避角色:\\。 例如,如果您有一个带有id="foo.bar"的元素,则可以使用 使用选择器$("#foo\\.bar")

但是,只需要使用双括号,以便在选择器字符串中存在单个括号char \。选择器引擎随后使用该括号来转义元字符。无论如何,这意味着你的代码也只需要使用两个括号 - 没有必要逃避提供一个额外的级别:

$.each(errors, function(fieldSelector,errMsg){ 
    fieldSelector = fieldSelector.replace('[','\\['); 
    fieldSelector = fieldSelector.replace(']','\\]'); 
    $(fieldSelector).hide(); //for the example 
}); 
+0

你的意思是在服务器端定义它吗?因为我在PHP脚本中调用json_encode函数后收到'errors'。 – renard 2012-03-30 19:41:33

+0

是的,但我认为这是我通过在fieldSelector上使用替换而不是? – renard 2012-03-30 19:51:12

+0

@renard - 是的,但你提供了额外的逃跑等级。看到我更新的答案。 – 2012-03-30 20:08:20

0

稍微容易的答案 - 您可以使用戈壁,不具有特殊的语法,而不是Sizzle。

$.each(errors, function(fieldSelector,errMsg){ 
    $(document.getElementById(fieldSelector)).hide(); //for the example 
}