#javascript #jquery #jquery-selectors #css-selectors
#javascript #jquery — jquery — запрос #jquery-селекторы #css-селекторы
Вопрос:
У меня есть скрипт, который должен динамически размещать divs, содержащие имена членов группы, внутри одного контейнера div. Эти div’ы идентифицируются путем объединения «groupMemberEntryDiv» и адреса электронной почты участника группы (который уникален в моей системе).
Проблема в том, что использование идентификаторов в селекторах jQuery не работает. Я полагаю, что я рассмотрел все возможные зависания, которые могли быть причиной этой проблемы:
- Наличие ‘@’ в адресах электронной почты (идентификаторы элементов не могут содержать этот символ). Я исправил это, заменив их на ‘:’, который является разрешенным символом. Кроме того, поскольку ‘:’ не отображается в допустимых адресах электронной почты, я могу использовать indexOf для синтаксического анализа строки и замены ее на ‘@’, когда мне нужно будет снова использовать адрес электронной почты.
- Наличие ‘:’ и ‘.’ в (теперь измененных) адресах электронной почты (jQuery может рассматривать их как псевдоклассы и classes соответственно). Следуя инструкциям на этой странице, я попытался экранировать символы. Фактически, я поднял функцию .replace () из этой самой ссылки, чтобы сделать это.
К сожалению, селекторы по-прежнему не будут работать. Я создал простой jFiddle, чтобы проиллюстрировать проблему.
Может кто-нибудь, пожалуйста, объяснить, что происходит?
Комментарии:
1. Не кажется хорошей идеей, чтобы электронные письма участников были видны в вашей разметке для всех. Вы должны использовать какой-нибудь числовой идентификатор.
2. @BoltClock. вы, конечно, можете использовать их в идентификаторе, это просто запутывает селекторы, поэтому вам приходится их избегать
3. @morgar: Моя система настроена так, что для «добавления» кого-либо в качестве контакта требуется знать его адрес электронной почты для отправки запроса.
4. @Neal: так что произойдет, если у меня есть
id='blah:hover'
? Это допустимо? Как CSS справится с этим?5. @Kevin Все еще плохая идея, но вместо этого вы могли бы использовать атрибуты data-* для хранения адресов электронной почты. ie,
<div id="user-323" data-email="will_get_spammed@gmail.com"><div>
затем доступ осуществляется с помощью$('#user-323').data('email');
Ответ №1:
Это потому, что вы экранируете специальные символы (что правильно для селектора), но идентификатор не нужно экранировать. Рассмотрим:
$("#protectedGroupDiv100").append("<div id='groupMemberEntryDiv" emailString "' class='groupMemberEntryDivs'>hey</div>");
Генерирует:
<div id="groupMemberEntryDivblahblah:gmail.com" class="groupMemberEntryDivs"></div>
Посмотрите, как это создает элемент с идентификатором: #groupMemberEntryDivblahblah:gmail.com
но позже вы используете селектор #groupMemberEntryDivblahblah:gmail.com
, который кажется тем же самым, но на самом деле это то, что ищет jQuery #groupMemberEntryDivblahblah:gmail.com
. Поскольку идентификатор вашего элемента содержит обратную косую черту, jQuery не находит соответствия для селектора.
Чтобы исправить это, установите идентификатор перед выходом из него:
$.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.
Хотя это работает, я не рекомендую указывать электронные письма пользователей в разметке. Как намекали другие, это может привести к проблемам с безопасностью.
Комментарии:
1. Спасибо за ответ! Но к каким проблемам безопасности это может привести, если пользователям требуется знать электронные письма своих контактов, чтобы в первую очередь отправить им «запрос на добавление в друзья»?
2. Спам-боты могут сканировать страницу и собирать электронные письма, я могу видеть электронные письма людей, которых я даже не знаю, и использовать это, чтобы получить доступ к их учетной записи и т.д. и т.п…
3. @Chad: Думаю, мне следует подробнее объяснить мою систему. Эти группы являются категориями, в которые пользователь может поместить свои контакты. Для того, чтобы у двух пользователей были контактные отношения («дружба»), один должен использовать электронную почту другого вместе с цифровым кодом, выбранным получающим пользователем. Если электронное письмо находится в системе и код правильный, то запрос отправлен. Максимум две попытки запроса на один и тот же адрес электронной почты в течение 24 часов для предотвращения спамеров. Итак, само собой разумеется, что любые контакты, которые пользователь может отнести к группам, являются друзьями пользователя, адрес электронной почты которого пользователь уже знает
4. …продолжение @Chad: Зная это, как это может быть использовано спамерами? Я хочу сделать это как можно более безопасным.
5. Если для перехода на страницу, на которой находится это содержимое, требуется войти в систему, и после этого вы сможете просматривать только электронные письма, которые уже были связаны с вашей учетной записью (друзья), тогда все должно быть в порядке.