Хабр, и снова здравствуй!
Настал в моей жизни момент выбора, какое направление в программировании выбрать, пошел в сторону веба. C html и css, какой – никакой, но опыт был, а вот с js знаком не был вообще, начал писать тестовый простой сайт, ограничивающийся статическими страницами, спустя пару дней работы над своим проектом мне понадобилась галерея изображений и как оказалось пагинация. Стал гуглить, искать любую информацию как реализовать новую поставленную задачу, очень много информации, примеров чужого кода, даже удалось кое что слепить из чужих примеров, но понимание не приходило… Приостановил я работу над сайтом и начал читать документацию и примеры кода на js, спустя неделю я вернулся к проекту, и начал писать исходя из полученых знаний, тут то, во время манипуляции элементами страницы на реальном проекте и появилось явное понимание происходящего. Сразу предупрежу это самый обычный велосипед, так как прежде чем браться за тот же jQuery я хотел познакомиться с истоками.
Ниже я покажу код своей галереи и пагинатора соответственно, а под кодом расскажу о (логике реализации) происходящем, в надежде на то, что этот простой на данный момент для меня пример, поможет многим, желающим познакомиться с JS. Но настоятельно рекомендую прежде чем заглядывать в код, прочитать про влияние JS на эелементы страниц и базовые вспомогательные конструкции.
Вот, что у меня получилось:

Теперь как и обещал объясню, что это было:
— Завожу два счетчика, первый-idx следит за изображением в массиве с изображениями, чтобы знать на каком из них мы остановились и с какого изображения начинать генерировать следующую страницу галереии и второй-count для генерации требуемого количества пронумерованных кнопок пагинатора, количеством равным всем страницам галереи, зависящим от общего числа имен файлов изображений в массиве pictures.
— В window.onload добавляю все, что произойдет при полной загрузке html страницы. Вешаю на кнопки переключения сраниц, функции, которые запустятся по событию – нажатия кнопки.
— Инициализирую две функции генерации изображений-addImagesToPaginator() на первой странице галереи и кнопок-getNumericButtons() равным общему количеству страниц галереи.
Теперь пробежимся по сопутствующему функционалу логической цепочки:
-handler() — функция, отвечает за перелистывание страниц стрелками вперед, назад.
-addImagesToPaginator() — добавляет изображения на страницу
-removeImagesFromPaginator() — удаляет все изображения со страницы. Это понадобится когда пользователь обратиться к предыдущей странице, чтобы сгенерировать на текущей странице элементы с предыдущей страницы, контролируются элементы переменной idx, как я уже писал.
-getNextPage() и getPreviousPage() — запускаются по событию обращения к следующей и предыдущей страницам.
-getQuantityPagesOfPaginator() — возвращает общее количество страниц галереи, это необходимо для генерации нумерованных кнопок навигации по страницам.
-getNumericButtons() — генерирует те самые навигационные кнопки пагинатора.
-getActionForNumericButtons() — контролирует действия нумерованных кнопок.
Галерея
Исходник
Спасибо за внимание, всем удачногорабочего времени.
Настал в моей жизни момент выбора, какое направление в программировании выбрать, пошел в сторону веба. C html и css, какой – никакой, но опыт был, а вот с js знаком не был вообще, начал писать тестовый простой сайт, ограничивающийся статическими страницами, спустя пару дней работы над своим проектом мне понадобилась галерея изображений и как оказалось пагинация. Стал гуглить, искать любую информацию как реализовать новую поставленную задачу, очень много информации, примеров чужого кода, даже удалось кое что слепить из чужих примеров, но понимание не приходило… Приостановил я работу над сайтом и начал читать документацию и примеры кода на js, спустя неделю я вернулся к проекту, и начал писать исходя из полученых знаний, тут то, во время манипуляции элементами страницы на реальном проекте и появилось явное понимание происходящего. Сразу предупрежу это самый обычный велосипед, так как прежде чем браться за тот же jQuery я хотел познакомиться с истоками.
Ниже я покажу код своей галереи и пагинатора соответственно, а под кодом расскажу о (логике реализации) происходящем, в надежде на то, что этот простой на данный момент для меня пример, поможет многим, желающим познакомиться с JS. Но настоятельно рекомендую прежде чем заглядывать в код, прочитать про влияние JS на эелементы страниц и базовые вспомогательные конструкции.
Код
var idx = 0;
var count = 0;
var pictures = ['001.png', '002.png', '002.png', '001.png', '001.png',
'001.png', '002.png', '001.png', '002.png', '001.png',
'002.png', '001.png', '001.png', '001.png', '002.png',
'001.png', '001.png', '002.png', '002.png', '001.png']
window.onload = function() {
var next = document.getElementById('next');
var previous = document.getElementById('back')
next.onclick = getNextPage;
previous.onclick = getPreviousPage;
getNumericButtons();
addImagesToPaginator();
window.addEventListener('keyup', handler, false);
}
function handler(event) {
var KEY_CODE = { LEFT:37, RIGHT:39 };
var numericButtons = document.getElementById('numericButtons');
var quantityPagesInPgn = getQuantityPagesOfPaginator()-1;
switch (event.keyCode) {
case KEY_CODE.LEFT:
if (count == 0) {
break;
}
getPreviousPage();
break;
default:
if (count == quantityPagesInPgn) {
break;
}
getNextPage();
break;
}
}
function addImagesToPaginator() {
var numericButtons = document.getElementById('numericButtons');
var imgPath = 'static/img/';
var next = document.getElementById('next');
var previous = document.getElementById('back')
var bodyContainer = document.getElementById('bodyContainer');
var quantityImgsOnPage = 8;
var img = document.createElement('IMG');
img.className = 'imgContainer';
for (var i=0; i<quantityImgsOnPage; i++) {
if (pictures[idx]) {
img.src = imgPath+pictures[idx];
bodyContainer.appendChild(img.cloneNode(true));
idx += 1;
}
}
//activate and deactivate buttons next and back
if (idx <= 8) {
previous.disabled = true;
numericButtons.firstChild.disabled = true;
} else if (idx >= pictures.length) {
next.disabled = true;
numericButtons.lastChild.disabled = true;
}
}
function removeImagesFromPaginator() {
var bodyContainer = document.getElementById('bodyContainer');
while (bodyContainer.hasChildNodes()) {
bodyContainer.removeChild(bodyContainer.firstChild);
}
}
function getNextPage() {
count += 1;
console.log('count_next', count)
var numericButtons = document.getElementById('numericButtons');
var previous = document.getElementById('back');
var buttonsArray = numericButtons.getElementsByTagName('INPUT');
previous.disabled = false;
removeImagesFromPaginator();
addImagesToPaginator();
buttonsArray[count].disabled = true;
if (count > 0 ) {
buttonsArray[count-1].disabled = false;
}
}
function getPreviousPage() {
count -= 1;
console.log('count_back', count)
var bodyContainer = document.getElementById('bodyContainer');
var numericButtons = document.getElementById('numericButtons');
var next = document.getElementById('next');
var buttonsArray = numericButtons.getElementsByTagName('INPUT');
var imagesOnPage = bodyContainer.getElementsByTagName('IMG').length;
next.disabled = false;
idx = idx-imagesOnPage-8;
removeImagesFromPaginator();
addImagesToPaginator();
buttonsArray[count].disabled = true;
if (count >= 0 ) {
buttonsArray[count+1].disabled = false;
}
}
function getQuantityPagesOfPaginator() {
// function returning quantity pages of pagination
var count = 8;
var quantity = 1;
while (true) {
count += 8;
quantity += 1;
if (count >= pictures.length) {
return quantity;
}
}
}
function getNumericButtons() {
var quantityPagesInPgn = getQuantityPagesOfPaginator();
var numericButtons = document.getElementById('numericButtons');
var numericButton = document.createElement('INPUT');
numericButton.type = 'button';
for (var val = 1; val <= quantityPagesInPgn; val++) {
numericButton.value = val;
numericButtons.appendChild(numericButton.cloneNode(true));
}
var allNumericButtons = numericButtons.getElementsByTagName('INPUT');
for (var i = 0; i < allNumericButtons.length; i++) {
allNumericButtons[i].onclick = getActionForNumericButtons;
}
}
function getActionForNumericButtons() {
var buttonsArray = numericButtons.getElementsByTagName('INPUT');
buttonsArray[count].disabled = false;
this.disabled = true;
count = parseInt(this.value) -1;
idx = (parseInt(this.value)*8)-8;
removeImagesFromPaginator();
addImagesToPaginator();
var next = document.getElementById('next');
var previous = document.getElementById('back')
if (count > 0) {
previous.disabled = false;
} else {
previous.disabled = true;
}
if (count+1 == buttonsArray.length) {
next.disabled = true;
} else {
next.disabled = false;
}
}
Вот, что у меня получилось:

Теперь как и обещал объясню, что это было:
— Завожу два счетчика, первый-idx следит за изображением в массиве с изображениями, чтобы знать на каком из них мы остановились и с какого изображения начинать генерировать следующую страницу галереии и второй-count для генерации требуемого количества пронумерованных кнопок пагинатора, количеством равным всем страницам галереи, зависящим от общего числа имен файлов изображений в массиве pictures.
— В window.onload добавляю все, что произойдет при полной загрузке html страницы. Вешаю на кнопки переключения сраниц, функции, которые запустятся по событию – нажатия кнопки.
— Инициализирую две функции генерации изображений-addImagesToPaginator() на первой странице галереи и кнопок-getNumericButtons() равным общему количеству страниц галереи.
Теперь пробежимся по сопутствующему функционалу логической цепочки:
-handler() — функция, отвечает за перелистывание страниц стрелками вперед, назад.
-addImagesToPaginator() — добавляет изображения на страницу
-removeImagesFromPaginator() — удаляет все изображения со страницы. Это понадобится когда пользователь обратиться к предыдущей странице, чтобы сгенерировать на текущей странице элементы с предыдущей страницы, контролируются элементы переменной idx, как я уже писал.
-getNextPage() и getPreviousPage() — запускаются по событию обращения к следующей и предыдущей страницам.
-getQuantityPagesOfPaginator() — возвращает общее количество страниц галереи, это необходимо для генерации нумерованных кнопок навигации по страницам.
-getNumericButtons() — генерирует те самые навигационные кнопки пагинатора.
-getActionForNumericButtons() — контролирует действия нумерованных кнопок.
Галерея
Исходник
Спасибо за внимание, всем удачного