Avoid to use colons and periods in the id attribute

According to the HTML specifications, a valid id can consist of almost characters except ASCII whitespace. Assume that we have an element representing an user's email address:
<div id="user.email" />
In order to access the element, the getElementById() method accepts all of three ways passing the id:
// They return the same element
document.getElementById('user.email');
document.getElementById('user\\.email');
document.getElementById('user\\\\.email');
But these methods return different results if you are using jQuery library:
// Function // Returned element
$('#user.email'); // <div id="user" class="email" />
$('#user\\.email'); // <div id="user" class="email" />
$('#user\\\\.email'); // <div id="user.email" />
As you see, the first two methods will find an element with id of user and has email class. In order to get the correct element, we have to escape the id using double backslashes (\\). It also happens if we use the same value in CSS:
#user.email {
...;
}
All the styles declared within #user.email { ... } has effect on the element with id of user and has the email class.
The styles aren't applied to element with id of user.email. To define the styles for our element, we have to escape the selector. But this time, it requires a single backslash only:
#user\\.email {
...;
}
Avoid using the special characters in the id and class attributes will help us get rid of the confusion and errors above. If it's not possible to get rid of colons and periods (for example, the id attribute is generated by the server side), then you can use the single backslash as above, or use the attribute selector. Note that it has a lower specificity than the id selector:
[id='user.email'] {
...;
}

See also