Все мы (ну или большинство из нас) привыкли работать с javascript применяя библиотеку Jquery. Однако не всегда это возможно. И когда это так — многие начинают испытывать проблемы. Сегодня я решил рассказать о том как работать с DOM на чистом javascript.
На самом деле «чистый» javascript не сложнее jquery. Конечно приходится писать больше кода, но с другой стороны этот код будет более понятен людям, разбирающимся в языках программирования PHP, C#, JAVA и других. Рассмотрим работу описанных выше функций. В качестве рабочего полотна возьмем чистый HTML файл:
<html> <head></head> <body> <script></script> </body> </html>
Все действия будем выполнять на чистом Javascript. В качестве цели поставим задачу — генерацию таблицы с возможностью удаления и добавления строк. Чтобы понять код необходимо понять, что функция document.createElement создает переменную тега (например как селектор в jquery). Вся остальная работа с данной переменной ни чем не отличается от работы с обычным DOM объектом.
<html> <head></head> <body> <script> //Создадим title страницы var title = document.createElement('title'); title.innerHTML = 'Page title'; document.getElementsByTagName('head')[0].appendChild(title); //getElementsByTagName возвращает массив //Создадим таблицу var table = document.createElement('table'); table.setAttribute('id', 'tableId'); table.setAttribute('border', '1'); //Создадим строку var headRow = document.createElement('tr'); for(var i = 1; i <= 5; ++i) { //Создадим пять колонок var headColumn = document.createElement('th'); if(i < 5) { headColumn.innerHTML = i; } else { var buttonAddRow = document.createElement('button'); buttonAddRow.innerHTML = 'Add row'; buttonAddRow.onclick = function() { //Функция добавления строки (по сути тоже самое) var table = document.getElementById('tableId'); var row = document.createElement('tr'); for(var i = 1; i <= 5; ++i) { var column = document.createElement('th'); if(i < 5) { column.innerHTML = i; } else { var buttonDeleteRow = document.createElement('button'); buttonDeleteRow.innerHTML = 'Delete row'; buttonDeleteRow.onclick = function() { var buttonTr = this.parentNode.parentNode; //Получаем тег Tr в которой находится нажатая кнопка buttonTr.parentNode.removeChild(buttonTr); //Удаляем строку } column.appendChild(buttonDeleteRow); } row.appendChild(column); } table.appendChild(row); } headColumn.appendChild(buttonAddRow); } headRow.appendChild(headColumn); } table.appendChild(headRow); document.getElementsByTagName('body')[0].appendChild(table); </script> </body> </html>
Код получился немного страшным. И имеет повторы. Приведем код в более приличный вид.
<html> <head></head> <body> <script> function deleteRow() { var buttonTr = this.parentNode.parentNode; //Получаем тег Tr в которой находится нажатая кнопка buttonTr.parentNode.removeChild(buttonTr); //Удаляем строку } function addRow(tableId, columnTag, columnsCount, lastRowFunction) { lastRowFunction = lastRowFunction || null; var isLastRowFunction = typeof(lastRowFunction) == 'function'; var table = document.getElementById(tableId); var row = document.createElement('tr'); for(var i = 1; i <= columnsCount; ++i) { var column = document.createElement(columnTag); if(i < 5 || !isLastRowFunction) { column.innerHTML = i; } else { lastRowFunction(column); } row.appendChild(column); } table.appendChild(row); } //Создадим title страницы var title = document.createElement('title'); title.innerHTML = 'Page title'; document.getElementsByTagName('head')[0].appendChild(title); //getElementsByTagName возвращает массив //Создадим таблицу var tableId = 'tableId', tableColumnCount = 5, table = document.createElement('table'); table.setAttribute('id', tableId); table.setAttribute('border', '1'); document.getElementsByTagName('body')[0].appendChild(table); //Создадим строку заголовка addRow(tableId, 'th', tableColumnCount, function(columnElement) { var buttonAddRow = document.createElement('button'); buttonAddRow.innerHTML = 'Add row'; buttonAddRow.onclick = function() { addRow(tableId, 'td', tableColumnCount, function(columnElement) { var buttonDeleteRow = document.createElement('button'); buttonDeleteRow.innerHTML = 'Delete row'; buttonDeleteRow.onclick = deleteRow; columnElement.appendChild(buttonDeleteRow); }); } columnElement.appendChild(buttonAddRow); }); </script> </body> </html>
Согласитесь красиво и ни чем не хуже jquery? 🙂