JavaScript. Подробное руководство, 6-е издание, стр. 215

<b>    },</b>

<b>    atStart: function(elt, html) {</b>

<b>      elt.insertBefore(fragment(html), elt.firstChild);</b>

<b>    },</b>

<b>    atEnd: function(elt, html) { elt.appendChild(fragment(html)); }</b>

<b>  };</b>

<b>  // Реализация метода insertAdjacentHTML на основе функций выше </b>

<b>  Element.prototype.insertAdjacentHTML = function(pos, html) {</b>

<b>    switch(pos.toLowerCase()) {</b>

<b>    case &quot;beforebegin&quot;: return Insert.before(this, html);</b>

<b>    case &quot;afterend&quot;: return Insert.after(this, html);</b>

<b>    case &quot;afterbegin&quot;: return Insert.atStart(this, html);</b>

<b>    case &quot;beforeend&quot;: return Insert.atEnd(this, html);</b>

<b>    }</b>

<b>  };</b>

<b>  return Insert; // Вернуть четыре функции вставки</b>

<b>}());</b>

15.7. Пример: создание оглавления

Пример 15.7 показывает, как динамически создавать оглавление документа. Он демонстрирует многие концепции работы с документом, описанные в разделах выше: выбор элементов, навигация по документу, установка атрибутов элементов, установка свойства

<b>innerHTML</b>
и создание новых узлов и вставку их в документ. Пример снабжен большим количеством комментариев, которые призваны облегчить понимание программного кода.

Пример 15.7. Автоматическое создание оглавления документа

<b>/**</b>

<b>* TOC.js: создает оглавление документа.</b>

<b>*</b>

<b>* Этот модуль регистрирует анонимную функцию, которая вызывается</b>

<b>* автоматически по окончании загрузки документа. Эта функция сначала</b>

<b>* отыскивает элемент документа с атрибутом id=&quot;TOC&quot;. Если такой элемент</b>

<b>* отсутствует, функция создает его, помещая в начало документа.</b>

<b>*</b>

<b>* Затем функция отыскивает все элементы с &lt;h1&gt; по &lt;h6&gt;, интерпретируя их как</b>

<b>* заголовки разделов и создает оглавление внутри элемента ТОС. Функция добавляет</b>

<b>* номера разделов в каждый заголовок и обертывает заголовки именованными</b>

<b>* якорными элементами, благодаря чему оглавление может ссылаться на них.</b>

<b>* Якорным элементам даются имена, начинающиеся с приставки &quot;ТОС&quot;, поэтому вам следует</b>

<b>* избегать использовать эту приставку в своей разметке HTML.</b>

<b>*</b>

<b>* Оформление элементов оглавления можно реализовать с помощью CSS. Все элементы имеют</b>

<b>* класс &quot;TOCEntry&quot;. Кроме того, каждый элемент оглавления имеет класс, соответствующий</b>

<b>* уровню заголовка раздела. Для заголовков, оформленных тегом &lt;h1&gt;, создаются элементы</b>

<b>* оглавления с классом &quot;TOCLevell&quot;,для заголовков &lt;h2&gt; - с классом &quot;T0CLevel2&quot; и т. д.</b>

<b>* Номера разделов, вставляемые в заголовки, получают класс &quot;TOCSectNum&quot;.</b>

<b>*</b>

<b>* Этот модуль можно использовать с каскадными таблицами стилей, такими как:</b>

<b>*</b>

<b>* #Т0С { border: solid black 1рх; margin: Юрх; padding: Юрх; }</b>

<b>* .TOCEntry { font-family: sans-serif; }</b>

<b>* .TOCEntry a { text-decoration: none; }</b>

<b>* .TOCLevell { font-size: 16pt; font-weight: bold; }</b>

<b>* .T0CLevel2 { font-size: 12pt; margin-left: .5in; }</b>

<b>* .TOCSectNum:after { content: &quot;; }</b>

<b>*</b>

<b>* Последнее определение генерирует двоеточие и пробел после номера раздела.</b>

<b>* Чтобы скрыть номера разделов, можно использовать следующий стиль:</b>

<b>*</b>

<b>* .TOCSectNum { display: none }</b>

<b>*</b>

<b>* Этот модуль использует вспомогательную функцию onLoad().</b>

<b>**/</b>

<b>onLoad(function() { // Анонимная функция, определяющая локальн. обл. видимости </b>

<b>// Отыскать контейнерный элемент для оглавления.</b>

<b>// Если такой элемент отсутствует, создать его в начале документа,</b>

<b>  var toc = document.getElementById(&quot;TOC&quot;);</b>

<b>  if (!toc) {</b>

<b>    toc = document.createElementC'div&quot;);</b>

<b>    toc.id = &quot;TOC&quot;;</b>

<b>    document.body.insertBefore(toc, document.body.firstChild);</b>

<b>  }</b>