Ссылки, но не ссылки: еще раз про активные элементы на странице
Здравствуйте, коммюнити javascript.ru!
Сегодня я в очередной раз подниму вопрос таких привычных нам вещей, как ссылки, не ведущие к перезагрузке страницы.
Кто-то называет их «аяксовыми» (хотя аякс и не всегда при чем), кто-то — «яваскриптовыми», кто-то — «псевдоссылками» и «полуссылками». Но, в принципе, я думаю, Вы поняли о чем я.
Далее я буду ссылаться на них как «DHTML-ссылки», и поясню свой выбор такого названия.
Если точнее, то гипертекстовые якори (они же «анкеры»). Гипертекстовые якори, очевидно, нужны для гипертекстовой связи между документами и внутри документа. «Анкеры-ссылки» нужны для того, чтобы пользователь мог перейти к другому «анкеру-якорю» (как бы без тавтологии назвать <a name="…"> ? ), учитывая, что документ как таковой тоже является анкером. Они спроектированы для этого, и подходят для этого как нельзя лучше.
Всё это здорово, но было придумано до DHTML («Dynamic HTML», если вдруг кто забыл ). Следует ли делать активные области с onclick ? Моё мнение — да. DHTML-ссылки всё ещё подпадают под концепцию ссылок.
Поясню: DHTML-ссылки ссылаются не на сам документ или якорь, а на мутацию документа. Мутация для документа стала таким же неотъемлимым аттрибутом, как и якоря, так что не будет ли логичным следовать духу, а не букве определения ссылки? Что если это тоже ссылки, но не обычные, «мутационные ссылки», или «DHTML-ссылки»? По-моему, нет никаких препятствий к этому.
Href («Hypertext reference», опять-таки, если вдруг кто-то забыл) у ссылки обозначает адрес привязанного документа или якоря.
Крайне плохая практика указывать в качестве него код с псевдопротоколом javascript: , иначе, чем в качестве graceful degradation. Более полное объяснение этого можно прочитать в статье Ильи Кантора на этом сайте.
Href для DHTML-ссылки по-идее, должен быть "#" , потому как мы ссылаемся на процесс в данном документе.
В любом случае, яваскрипт позволяет сделать так, что браузер даже не дойдет до обработки href, но что делать, если яваскрипт отключён? Можно указать в качестве href адрес страницы, рассчитанной на отключенный яваскрипт, т.е., у уже проведенной мутацией, но на серверной стороне, или "javascript://" , если этот процесс в общем-то неважен.
Словом, как бы ни хотелось закрыть глаза на href, сделать этого не получится.
И тут мы подходим к тому, ради чего я в общем-то пишу этот пост. Есть у ссылок такие параметры, как rel и rev . Чаще всего с ними можно встретиться в записи <link href="…" rel="stylesheet"> .
rel («relation») объявляет, как то, что по ссылке, относится к текущему документу.
rev («reverse relation») объявляет, текущий документ относится к тому, что по ссылке.
Это мощные инструменты в борьбе за семантику гипертекста, и их не следует напрочь игнорировать.
Теперь продолжим цепочку размышлений и применим rel к DHTML-ссылке. Что получим? Получим то, является ли «целью» ссылки мутация, и как мутация, ожидаемая при нажатии на ссылку, относится к текущему документу. Красота?
<a href="contact_form.htm" rel="dhtml lightbox">Напишите нам!</a>
Почему «dhtml»? Можно было бы написать «javascript», но, ведь, он же не единственный, верно?
Опять же, возвращаясь к необходимости подчеркивать DHTML-ссылки пунктирно. Скоро отомрёт IE6, и станет возможной такая конструкция:
<style type="text/css">
a[rel~="dhtml"] {
text-decoration: none;
border-bottom: dashed 1px;
}
</style>
<a href="#">Я ссылка на верх страницы</a>
<a href="#" rel="dhtml myCustomAction">А я что-нибудь вызову!</a>
Прошло уже немало времени с тех пор, как «DHTML-ссылки» появились, но касаемо их не было определено почти никаких не то, чтобы стандартов… оговоренностей.
Если удастся принять соглашения о том, что именно писать в rel , это может открыть большие перспективы к улучшению семантики всей Сети и юзабельности отдельных сайтов.
Прошу высказать Ваше отношение к этому и конкретные предложения. И спасибо, что прочитали этот длинный и нудный текст!
|
Для вызова событий предназначены кнопки. Не вижу глубокого смысла в том, чтобы их обделять и отдавать их семантику ссылкам.
Ну что Вы! Кнопки тоже по-своему чертовски хороши.
Семантика — материя тонкая, и я не рискну что-либо утверждать, но имхо, кнопки больше относятся к формам.
Благодаря таким ссылкам сильно засирается хистори. Больше предпочитаю для этого на блоки навешивать события.
Melphis,
ну, никто же не заставляет по ним переходить.
e.preventDefault()
, и никакого перехода по решетке.Ну, а если уж яваскрипт отключен, можно использовать что-то типа такого (пример грубый, конечно).
1) Кнопки - это элементы форм, и если его писать без формы, получается не валидно, если писать с формой - громоздко и не нужно.
2) - чем вам ретурн фолс не нравиться, и не надо будет переходить по ссылке коротко
Но все это не то, ведь если страница мутировала то никак не кинуть ссылку другу.
Потому верное решение это Ajax навигация
а в модуле навигации когда location.hash = '#link' выполняем следующее..
такую ссылку можно передавать и человек увидит ровно тоже что и вы.
goldserg
Кнопки не элемент форм. Их можно вставлять где угодно на странице. Речь идет о button, а не о input type="button"
История не засирается, а ведётся. Этим можно пользоваться, и пользуются, чтобы сделать кнопки "вперёд" и "назад" браузера работающими не только для переходов, но и для мутаций.
Roksa dla gejow
Спасибо большое за информацию, материал рассказанный вами в публикации оказался очень полезным и актуальным.
Отправить комментарий
Приветствуются комментарии:Для остальных вопросов и обсуждений есть форум.