
Использование HTML-комментариев для хранения данных
Как-то меня посетила мысль проверить, как определяются HTML-комментарии в DOM-структуре документа, и как можно получить доступ к их содержимому. Ведь по сути они являются полноправными составляющими документа. Напрямую, через ID, имя и другими подобными способами, естественно, сделать это не получится, т.к. тег комментария не имеет ничего подобного. Но сделать это все-таки удалось, привязавшись к соседнему тегу одного уровня с нужным комментарием. После этого элемент комментария со всеми потрохами можно получить через функцию JavaScript nextSibling или previousSibling, в зависимости от вашей ситуации. Это можно посмотреть, например, вот на таком фрагменте кода:Code (HTML) : Убрать нумерацию
- <div>
- <!--first comment--><div id="main_div">Main DIV</div><!--second comment-->
- </div>
- <script type="text/javascript">
- // Получить опорный элемент
- var el=document.getElementById('main_div');
- // Сообщение "first comment"
- alert(el.previousSibling.nodeValue);
- // Сообщение "second comment"
- alert(el.nextSibling.nodeValue);
- </script>
Code (HTML) : Убрать нумерацию
- <div id="overall">
- <a href="#">link</a>
- <!--first comment-->
- <div id="inner_div">
- inner div
- <!--second comment-->
- </div>
- plain text
- </div>
- <script type="text/javascript">
- var el=document.getElementById('overall');
- for (var i = 0; i < el.childNodes.length; i++) {
- if (el.childNodes[i]=='[object Comment]' ||
- el.childNodes[i]=='[object HTMLCommentElement]') {
- alert(el.childNodes[i].nodeValue);
- }
- }
- </script>
Где это можно использовать? Например, в скрипте проверки правильности заполнения формы на стороне пользователя. Я видел подобные скрипты, но они были выполнены путем добавления невалидных атрибутов к элементам, или добавлением атрибутов типа rel="регулярка для проверки" к элементам, которые их не поддерживают. Этот же способ полностью валидный и соответствует всем стандартам HTML.
Code (HTML) : Убрать нумерацию
- <script type="text/javascript">
- function chk_input() {
- // По умолчанию форма правильная
- var valid=true;
- // Получить форму для проверки
- var form=document.getElementById('myform');
- for (var i=0; i<form.elements.length; i++) {
- var elem = form.elements[i];
- // Если после элемента формы есть комментарий
- if (elem.nextSibling=='[object Comment]' ||
- elem.nextSibling=='[object HTMLCommentElement]') {
- // Получить шаблон регулярного выражения проверки
- // и проверить соответствие введенного текста шаблону
- valid=valid && RegExp(elem.nextSibling.nodeValue).test(elem.value);
- }
- }
- alert(valid ? 'Форма заполнена правильно' : 'Форма заполнена с ошибками');
- }
- </script>
- <form id="myform" onsubmit="chk_input(); return false;">
- <input type="text"><!--^[0-9]{3,}$--> Введите не менее 3-х цифр
- <br>
- <input type="checkbox"> - галочку можно и не ставить
- <br>
- <input type="text"> Любые символы или пусто
- <br>
- <input type="text"><!--^[a-zA-Z]+$--> Введите латинские буквы
- <br>
- <input type="button" value="Проверить" onclick="chk_input();">
- </form>
Другое применение - сокрытие реальных адресов email от спамерских программ, автоматически собирающих адреса электронной почты со страниц сайтов.
Code (HTML) : Убрать нумерацию
- <div>Email:
- <!--username--><a href="#" onclick="this.href=
- this.nextSibling.nextSibling.nodeValue+':'+
- this.previousSibling.nodeValue+'@'+
- this.nextSibling.nodeValue;">hidden</a><!--domain.com--><!--mailto-->
- </div>
И напоследок, как обычно, извращение. Готового кода нет, пока только теоретическая выкладка. Можно, например, зашифровать скрипт JavaScript, а в комментариях на странице хранить ключ расшифровки, тем самым привязывая его к определенной странице. Дальше мысль развивать не хочу, ибо лениво.
Просмотров: 5346 | Комментариев: 17
Метки: JavaScript, HTML

Внимание! Статья опубликована больше года назад, информация могла устареть!
Комментарии
Отзывы посетителей сайта о статье
Александр
(16.03.2011 в 19:24):
Очень полезный код! спасибо!

ManHunter
(03.11.2010 в 23:49):
Все правильно. Я на сайте даже предусмотрел специальное сообщение для пользователей IE6.

Infocatcher
(03.11.2010 в 23:44):
А ведь если в IE6 перестанут нормально работать сайты, то его пользователей сразу же должно поубавиться, по идее. :)

ManHunter
(28.10.2010 в 16:33):
Пора уже отказываться от поддержки IE6

Infocatcher
(18.10.2010 в 02:53):
По идее, надежнее проверять через
node.nodeName == "#comment"
или
node.nodeType == 8 // Node.COMMENT_NODE, только вот в IE нету полезных "констант"
А то IE6 вообще "[object]" выдает.
node.nodeName == "#comment"
или
node.nodeType == 8 // Node.COMMENT_NODE, только вот в IE нету полезных "констант"
А то IE6 вообще "[object]" выдает.

64-ядерный процессор
(17.10.2010 в 22:51):
ManHunter, всегда пожалуйста =))

ManHunter
(17.10.2010 в 12:39):
64-ядерный процессор, это потому что в IE комментарии имеют название [object HTMLCommentElement]. Добавил условие в проверку, сейчас работает и в IE. Спасибо.

64-ядерный процессор
(16.10.2010 в 22:40):
ManHunter, проверь на IE 8: ввожу в первое поле пару букв и ни одной цыфры, в третье поле ввожу русские буквы. Пишет, что "Форма заполнена правильно".

ManHunter
(16.10.2010 в 19:54):
После этого получил сообщение "Форма заполнена ПРАВИЛЬНО" и пишешь в камменты что не работает.

Роман
(16.10.2010 в 19:13):
А что не так-то?
Все обязательные поля я заполнил:
1. Ввел цифры
2. Ввел латинские буквы
Все обязательные поля я заполнил:
1. Ввел цифры
2. Ввел латинские буквы

ManHunter
(15.10.2010 в 19:36):
Роман, лучше не пиши такие комментарии, не смеши людей.

Роман
(15.10.2010 в 19:31):
Плоховато работает ваш метод...
http://clip2net.com/s/zvL9
http://clip2net.com/s/zvL9

64-ядерный процессор
(15.10.2010 в 17:07):
ManHunter, особенно 2 хорош))))

ManHunter
(15.10.2010 в 16:18):
чо там придумывать? appendChild(), removeChild(), replaceChild(), innerHTML

64-ядерный процессор
(15.10.2010 в 16:15):
ManHunter, ты лучше придумай, как на JS добавить на страницу див, а потом удалить его, не оставив при этом на странице никаких следов от него. А способов решения твоей задачи есть масса. И каждый способ можно выбрать в зависимости от конкретной задачи =))

ManHunter
(15.10.2010 в 11:24):
Угу, предположим у тебя есть одна, а лучше несколько форм из 50 полей, которые меняются пару раз в месяц, движок, работающий на многоязычных html/tpl-шаблонах и внешний скрипт проверки корректности заполнения полей. Я посмотрю, как ты это все в переменные будешь заталкивать.

64-ядерный процессор
(15.10.2010 в 11:14):
Забавно посмотреть, как на это отреагируют старые версии браузеров))) Мне кажется, ято для хранения информации можно создать просто переменную в JS. Например:
var temp;
temp = "ляляля";
ну или что-то в этом роде...
var temp;
temp = "ляляля";
ну или что-то в этом роде...

Добавить комментарий
Заполните форму для добавления комментария
