如何逃避“:”?

例如,我喜欢

someform:somepanel:somebutton

当我执行jQuery(“#someform:somepanel:somebutton”)时,它返回someform,如何自动转义该id?

编辑:

我想做这样的事情

jQuery(somefunction("#someform:somepanel:somebutton")) 

如果它只是这个非常专业的版本,你可以只是.replace()这个角色。

 function somefunction(selector) { return selector.replace(/:/, '\\\\:'); } jQuery(somefunction("#someform:somepanel:somebutton")) 

然后转换成

 jQuery("#someform\\:somepanel\\:somebutton"); 

要拥有更通用的版本,可以使用正则表达式:

 function somefunction(selector) { return selector.replace(/(!|"|#|\$|%|\'|\(|\)|\*|\+|\,|\.|\/|\:|\;|\?|@)/g, function($1, $2) { return "\\\\" + $2; }); } 

使用双反斜杠:

  jQuery("#someform\\:somepanel\\:somebutton") 

有关:

  • jQuery选择器值转义
  • 我什么时候需要逃脱metacharectars? (jQuery选择器)
  • http://api.jquery.com/category/selectors/

    • 如果您希望使用任何元字符(例如!"#$%&'()*+,./:;?@[\]^{|}~ )作为名称的文字部分,必须使用两个反斜杠转义字符: \\.例如,如果你有一个id="foo.bar"的元素,你可以使用选择器$("#foo\\.bar") 。W3C CSS规范包含有关有效CSS选择器的完整规则集。

更新#1

关于自动转义的评论后,我看到的最好的方法是在字符串对象中创建一个函数,就像这样

 String.prototype.escape = function() { return this.replace(/([ #;&,.+*~\':"!^$[\]()=>|\/])/g,'\\$1') } 

你也可以专门为冒号定义一个函数,如下所示:

 String.prototype.escape_colon = function() { return this.replace(/:/,'\\$1') } 

并使用如下:

 jQuery("someform:somepanel:somebutton".escape()) 

但这会导致伪选择器出现问题,例如:

 jQuery("someform:somepanel:somebutton:first".escape()) 

:first选择器将被转义,因此您将找不到您的元素。

但我们最好的选择是在原型中构建一个字符串解析器,以替换它找到一组特定字符的位置,例如:

 jQuery("someform(_e(:))somepanel(_e(:))somebutton:first".escape()) 

通过这种方式,您可以定义要逃避的内容,但如果是这种情况,您可以自己逃避它们。

尝试:

 jQuery("#someform\\:somepanel\\:somebutton") 

我在jQuery中创建了一个为JSF转义冒号的函数:

 //USAGE: $(espaceIdForJSF('#someId:anotherId')); function escapeIdForJSF(id) { return id.replace(/:/g,"\\:").replace(/\./g,"\\."); } 

使用这个技巧: jQuery($('myid'))

原因:我正在使用“prototype”按ID查找元素,然后将结果传递给jQuery。

优点:更容易阅读。 缺点:需要Prototype和jQuery,但RichFaces仍然使用Prototype。

如果您使用PrimeFaces ,他们有一个方便的帮助函数来做到这一点:

escapeClientId(id) – 使用半冒号转义JSF ID以使用jQuery。

打电话给它:

 PrimeFaces.escapeClientId("someform:somepanel:somebutton") 

返回:

 #someform\\:somepanel\\:somebutton 

在内部,它只调用replace(/:/g,"\\:")并添加# ,所以你也可以使用它。