问题描述
|
我有一个脚本,该脚本应该将包含组成员名称的div动态放置在一个容器div中。这些div由\“ groupMemberEntryDiv \”和组成员的电子邮件地址(在我的系统中是唯一的)的串联来标识。
问题是在jQuery选择器中使用ID无效。我相信我已经解决了可能导致此问题的所有可能的麻烦:
电子邮件地址中有\'@ \'(元素ID不能包含此字符)。我已通过用\':\'替换它们来解决此问题,该字符是允许使用的字符。另外,由于\':\'不会出现在有效的电子邮件地址中,因此当我需要再次使用电子邮件地址时,可以使用indexOf解析字符串并将其替换为\'@ \'。
(现在已修改的)电子邮件地址中存在\':\'和\'。\'(jQuery可能分别将它们视为伪类和类)。按照该页面中的说明,我尝试对字符进行转义。实际上,我从该链接中取消了.replace()函数。
不幸的是,选择器仍然无法使用。我创建了一个简单的jfiddle来说明问题。
有人可以解释发生了什么吗?
解决方法
这是因为您要转义特殊字符(对于选择器而言是正确的),但是不需要转义ID。考虑:
$(\"#protectedGroupDiv100\").append(\"<div id=\'groupMemberEntryDiv\" + emailString + \"\' class=\'groupMemberEntryDivs\'>hey</div>\");
产生:
<div id=\"groupMemberEntryDivblahblah\\:gmail\\.com\" class=\"groupMemberEntryDivs\"></div>
了解如何创建ID为#groupMemberEntryDivblahblah\\:gmail\\.com
的元素
但是后来您使用了#groupMemberEntryDivblahblah\\:gmail\\.com
的选择器,看起来似乎相同,但是jQuery实际查找的是#groupMemberEntryDivblahblah:gmail.com
。由于元素的ID中包含反斜杠,因此jQuery找不到与选择器匹配的内容。
要解决此问题,请先设置ID,然后再转义:
$.each(emailArray,function(index,emailString){
emailString = emailString.replace(\"@\",\":\"); //Element attributes cannot contain \"@\"
$(\"#protectedGroupDiv100\").append(\"<div id=\'groupMemberEntryDiv\" + emailString + \"\' class=\'groupMemberEntryDivs\'>hey</div>\");
emailString = emailString.replace(/(:|\\.)/g,\'\\\\$1\'); //Escape \':\' and \'.\'
alert($(\"#groupMemberEntryDiv\" + emailString).length);
});
这是修改后的jsFiddle。
尽管这可行,但我不建议在标记中包含用户电子邮件。正如其他人暗示的那样,它可能导致安全问题。