Javascript.RU

Ссылки, но не ссылки: еще раз про активные элементы на странице

Здравствуйте, коммюнити 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, это может открыть большие перспективы к улучшению семантики всей Сети и юзабельности отдельных сайтов.

Прошу высказать Ваше отношение к этому и конкретные предложения. И спасибо, что прочитали этот длинный и нудный текст!

+4

Автор: Олег Торбасов (не зарегистрирован), дата: 27 февраля, 2010 - 17:42
#permalink

Для вызова событий предназначены кнопки. Не вижу глубокого смысла в том, чтобы их обделять и отдавать их семантику ссылкам.


Автор: subzey, дата: 28 февраля, 2010 - 05:22
#permalink

Ну что Вы! Кнопки тоже по-своему чертовски хороши.

Семантика — материя тонкая, и я не рискну что-либо утверждать, но имхо, кнопки больше относятся к формам.


Автор: Melphis, дата: 5 апреля, 2010 - 17:13
#permalink

Благодаря таким ссылкам сильно засирается хистори. Больше предпочитаю для этого на блоки навешивать события.


Автор: subzey, дата: 22 апреля, 2010 - 15:55
#permalink

Melphis,
ну, никто же не заставляет по ним переходить. e.preventDefault(), и никакого перехода по решетке.

Ну, а если уж яваскрипт отключен, можно использовать что-то типа такого (пример грубый, конечно).

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
	<head>
		<title></title>
		<meta http-equiv="Content-Type" content="text/html;charset=UTF-8" />
		<style type="text/css">
			body {
				margin: 0px;
				background: white;
				color: black;
				font: normal normal normal 14px/normal Tahoma;
			}
			#content {
				margin: 30px;
			}
			#header {
				height: 40px;
				position: relative;
				background: orange;
			}
			#logo {
				font-size: 24px;
				margin: 0px 0px 0px 30px;
			}
			#messages {
				position: absolute;
				top: 0px;
				left: 0px;
				width: 100%;
				height: 20px;
				overflow: hidden;
			}
			#nojs {
				margin-top: 30px;
				background: yellow;
				height: 20px;
			}
		</style>
	</head>
	<body>
		<div id="header">
			<div id="messages">
				<div class="message" id="nojs">Этот сайт выглядит и ведет себя плохо без включенного яваскрипта. :(</div>
			</div>
			<div id="logo">Мой сайт</div>
		</div>
		<div id="content">
			<h1>Lorem ipsum</h1>
			<p>ETAOIN SHRDLU ETAOIN SHRDLU ETAOIN SHRDLU ETAOIN SHRDLU ETAOIN SHRDLU ETAOIN SHRDLU ETAOIN SHRDLU</p>
			<p><a href="#nojs">На этой ссылке javascript почему-то не отработал.</a></p>
		</div>
	</body>
</html>

Автор: goldserg, дата: 26 апреля, 2010 - 11:26
#permalink

1) Кнопки - это элементы форм, и если его писать без формы, получается не валидно, если писать с формой - громоздко и не нужно.
2) - чем вам ретурн фолс не нравиться, и не надо будет переходить по ссылке коротко

Но все это не то, ведь если страница мутировала то никак не кинуть ссылку другу.
Потому верное решение это Ajax навигация

а в модуле навигации когда location.hash = '#link' выполняем следующее..
такую ссылку можно передавать и человек увидит ровно тоже что и вы.


Автор: GreatRash, дата: 18 августа, 2010 - 17:46
#permalink

goldserg
Кнопки не элемент форм. Их можно вставлять где угодно на странице. Речь идет о button, а не о input type="button"


Автор: Zenitchik (не зарегистрирован), дата: 27 июля, 2012 - 12:53
#permalink

История не засирается, а ведётся. Этим можно пользоваться, и пользуются, чтобы сделать кнопки "вперёд" и "назад" браузера работающими не только для переходов, но и для мутаций.


Автор: Гость (не зарегистрирован), дата: 16 апреля, 2022 - 02:01
#permalink

Автор: Гость (не зарегистрирован), дата: 14 мая, 2022 - 22:31
#permalink

Спасибо большое за информацию, материал рассказанный вами в публикации оказался очень полезным и актуальным.


Отправить комментарий

Приветствуются комментарии:
  • Полезные.
  • Дополняющие прочитанное.
  • Вопросы по прочитанному. Именно по прочитанному, чтобы ответ на него помог другим разобраться в предмете статьи. Другие вопросы могут быть удалены.
    Для остальных вопросов и обсуждений есть форум.
P.S. Лучшее "спасибо" - не комментарий, как все здорово, а рекомендация или ссылка на статью.
Содержание этого поля является приватным и не предназначено к показу.
  • Адреса страниц и электронной почты автоматически преобразуются в ссылки.
  • Разрешены HTML-таги: <strike> <a> <em> <strong> <cite> <code> <ul> <ol> <li> <dl> <dt> <dd> <u> <i> <b> <pre> <img> <abbr> <blockquote> <h1> <h2> <h3> <h4> <h5> <p> <div> <span> <sub> <sup>
  • Строки и параграфы переносятся автоматически.
  • Текстовые смайлы будут заменены на графические.

Подробнее о форматировании

CAPTCHA
Антиспам
3 + 17 =
Введите результат. Например, для 1+3, введите 4.
 
Поиск по сайту
Другие записи этого автора
subzey
Содержание

Учебник javascript

Основные элементы языка

Сундучок с инструментами

Интерфейсы

Все об AJAX

Оптимизация

Разное

Дерево всех статей

Популярные таги
Последние комментарии
Последние темы на форуме
Forum