teratail questions-16480 への回答

HTML

<ul class="paging" data-pagesize="1">
  <li>item1</li>
  <li>item2</li>
  <li>item3</li>
  <li>item4</li>
</ul>

<ul class="paging" data-pagesize="2">
  <li>item1</li>
  <li>item2</li>
  <li>item3</li>
  <li>item4</li>
  <li>item5</li>
  <li>item6</li>
</ul>

<ul class="paging" data-pagesize="3">
  <li>item1</li>
  <li>item2</li>
  <li>item3</li>
  <li>item4</li>
  <li>item5</li>
  <li>item6</li>
  <li>item7</li>
  <li>item8</li>
  <li>item9</li>
</ul>

<ul>
 <li><a href="https://teratail.com/questions/16480">リストを分割してページ送りで表示を切り替える(16480)|teratail</a></li>
</ul>

CSS

[aria-hidden=true] {
  display: none;
}

JavaScript

'use strict';
(function () {
  function handleDOMContentLoaded (event) {
    var doc = event.target,
        elements = doc.querySelectorAll('.paging'),
        headerTemplate = doc.createElement('div'),
        spanTemplate = doc.createElement('span'),
        span;

    spanTemplate.className = 'paging-prev';
    spanTemplate.appendChild(doc.createTextNode('prev'));
    headerTemplate.appendChild(spanTemplate.cloneNode(true));
    headerTemplate.appendChild(doc.createTextNode(' '));

    span = spanTemplate.cloneNode(true);
    span.className = 'paging-next';
    span.firstChild.data = 'next';
    headerTemplate.appendChild(span);
    headerTemplate.appendChild(doc.createTextNode(' '));

    span = doc.createElement('span');
    span.className = 'paging-counter';
    spanTemplate.className = 'paging-current';
    spanTemplate.firstChild.data = '1';
    span.appendChild(spanTemplate.cloneNode(true));
    span.appendChild(doc.createTextNode('/'));
    spanTemplate.className = 'paging-last';
    spanTemplate.firstChild.data = '1';
    span.appendChild(spanTemplate.cloneNode(true));
    headerTemplate.appendChild(span);

    for (var i = 0, l = elements.length, element, header, children, pageSize, j, m; i < l; ++i) {
      element = elements[i];
      pageSize = Number(element.getAttribute('data-pagesize'));
      children = element.children;

      if (pageSize < children.length) {
        for (j = 0, m = pageSize; j < m; ++j) {
          children[j].setAttribute('aria-hidden', 'false');
        }

        for (m = children.length; j < m; ++j) {
          children[j].setAttribute('aria-hidden', 'true');
        }

        header = headerTemplate.cloneNode(true);
        header.className = 'paging-header';
        header.querySelector('.paging-last').firstChild.data = Math.ceil(m / pageSize);
        element.parentNode.insertBefore(header, element);
        header.addEventListener('click', handleClick, false);
      }
    }
  }

  function setAriaHiddenChildren...