如何逃避“:”?
例如,我喜欢
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,"\\:")
并添加#
,所以你也可以使用它。