CSS: print version and links

5th November 2004 - 01:54

В Mozilla относительные ссылки таковыми и остаются, в Opera — становятся абсолютными. Кому надо, тот придумает hack.

Пока не тестировалось, но особых граблей не вижу.

» source

Грабли-то есть. Вспомнил я об этом посте после ознакомления с «Частыми вопросами» версии для печати на seminar@npj.

Год назад я собирался написать HTC, написал её сейчас. Однако, обо всём по порядку.

Грабли № 1: Mozilla

Всё-таки я недооценил проблему относительных ссылок. В статье «CSS Design: Going to Print» Eric Meyer рекомендует следующую технику:

a[href^="/"]:after {
  content: " (http://example.com" attr(href) ") ";
}

Но, как и написано на ALA, это лишь частичное решение проблемы, т.к. не обязательно относительная ссылка начнётся слэшем, а если ещё вспомнить base href

Грабли № 2: IE

Приходится использовать IE-only методы onbeforeprint и onafterprint. Чтобы не тревожить остальные браузеры, не нагружать их пользователей дополнительными скриптами и не пугать валидатор, пишем HTC и прикручиваем следующим образом:

HTML:

<!--[if IE]>
<style>
  body { behavior: url("print.htc"); }
</style>
<![endif]-->

HTC:

<public:component/>
<public:attach event="onbeforeprint"
        onevent="beforePrint()" for="window"/>
<public:attach event="onafterprint"
        onevent="afterPrint()" for="window"/>
<script>
  var docLinks = element.document.links;
  var docLinksCount = docLinks.length;
  var i;

  function beforePrint() {
    for (i = docLinksCount; --i >= 0;)
    {
      docLinks[i].innerBeforePrint = docLinks[i].innerHTML;
      docLinks[i].innerHTML += ' <span class="iePrintLink">'
                            + '(' + docLinks[i].href + ')'
                            + '</span>';
    }
  }
  
  function afterPrint() {
    for (i = docLinksCount; --i >= 0;)
      docLinks[i].innerHTML = docLinks[i].innerBeforePrint;
  }
</script>

Правда, эта компонента отказалась работать в IE младше шестой версии, если на машине их установлено несколько штук. Думаю, что в «чистых» должно работать. К сожалению, проверить не смог, т.к. в последние дни IE5 не встречал.

Конечный CSS (вне условного комментария):

<style type="text/css" media="print">
  .iePrintLink,
  a[href]:after {
    content: " (" attr(href) ") ";
  }
  /* + если ссылки начинаются со слэша, то: */
  a[href^="/"]:after {
    content: " (http://example.com" attr(href) ") ";
  }
</style>

Конструкция a[href] отсеивает якоря (<a name="name">).

Прочие грабли

Ко всему вышеперечисленному нужно добавить, что при помощи одного лишь CSS не получится управлять переносом длинных ссылок. Таким образом, использование данного метода оправдывает себя лишь в частных случаях и/или тогда, когда разработчик старается облегчить жизнь пользователям, которые не утруждают себя поиском специальных «печатных» ссылок.

Небольшой пример.

Categories: CSS | comments: (3)

Комментарии

1. jahson 5th November 2004 - 08:47

>>в последние дни IE5 не встречал.
А как же это?

Mash:

Лучше это, т.е. у меня на машине стоят четыре версии IE. Суть в том, что между установленными таким образом браузерами и браузерами «чистыми» всё-таки есть некоторые различия.

2. jahson 5th November 2004 - 16:17

Я хотел сказать про это ;)
У меня тоже standalone-версии, только три, начиная с пятой.
Прямо запретную тему обсуждаем.

Mash:

Я IE4 ради прикола ставил. :)

3. Mix 5th November 2004 - 19:54

>Лучше это, т.е. у меня на машине стоят четыре версии IE.
У меня пять :) только вот в IE 3 скрипты не пашут :(
> Суть в том, что между установленными таким образом браузерами
>и браузерами «чистыми» всё-таки есть некоторые различия.
Да. У меня например не верно работают conditional comments
в IE 5.0 и IE 5.5

Mash:

>> не верно работают conditional comments

Да, есть такой недостаток. В CC уходит самая старшая из установленных на машине версий браузера. Обычно это IE6.

Комментарии временно отключены.