Почему мой селектор jQuery не будет работать для идентификаторов с двоеточиями и точками в них?

#javascript #jquery #jquery-selectors #css-selectors

#javascript #jquery — jquery — запрос #jquery-селекторы #css-селекторы

Вопрос:

У меня есть скрипт, который должен динамически размещать divs, содержащие имена членов группы, внутри одного контейнера div. Эти div’ы идентифицируются путем объединения «groupMemberEntryDiv» и адреса электронной почты участника группы (который уникален в моей системе).

Проблема в том, что использование идентификаторов в селекторах jQuery не работает. Я полагаю, что я рассмотрел все возможные зависания, которые могли быть причиной этой проблемы:

  1. Наличие ‘@’ в адресах электронной почты (идентификаторы элементов не могут содержать этот символ). Я исправил это, заменив их на ‘:’, который является разрешенным символом. Кроме того, поскольку ‘:’ не отображается в допустимых адресах электронной почты, я могу использовать indexOf для синтаксического анализа строки и замены ее на ‘@’, когда мне нужно будет снова использовать адрес электронной почты.
  2. Наличие ‘:’ и ‘.’ в (теперь измененных) адресах электронной почты (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. Если для перехода на страницу, на которой находится это содержимое, требуется войти в систему, и после этого вы сможете просматривать только электронные письма, которые уже были связаны с вашей учетной записью (друзья), тогда все должно быть в порядке.