diff --git a/src/index.js b/src/index.js index e69de29..1b9e4bd 100644 --- a/src/index.js +++ b/src/index.js @@ -0,0 +1,239 @@ +/* ДЗ 4 - работа с DOM */ + +/* + Задание 1: + + 1.1: Функция должна создать элемент с тегом DIV + + 1.2: В созданный элемент необходимо поместить текст, переданный в параметр text + + Пример: + createDivWithText('loftschool') // создаст элемент div, поместит в него 'loftschool' и вернет созданный элемент + */ +function createDivWithText(text) { + let div = document.createElement('div'); + + div.innerText = text; + + return div; +} + +/* + Задание 2: + + Функция должна вставлять элемент, переданный в переметре what в начало элемента, переданного в параметре where + + Пример: + prepend(document.querySelector('#one'), document.querySelector('#two')) // добавит элемент переданный первым аргументом в начало элемента переданного вторым аргументом + */ +function prepend(what, where) { + where.insertBefore(what, where.firstChild) +} + +/* + Задание 3: + + 3.1: Функция должна перебрать все дочерние элементы узла, переданного в параметре where + + 3.2: Функция должна вернуть массив, состоящий из тех дочерних элементов следующим соседом которых является элемент с тегом P + + Пример: + Представим, что есть разметка: +
+ + + + + + + + findAllPSiblings(document.body) // функция должна вернуть массив с элементами div и span т.к. следующим соседом этих элементов является элемент с тегом P + */ +function findAllPSiblings(where) { + let arr = []; + let pp = where.querySelectorAll('P'); + + for (let i = 0; i < pp.length; i++) { + arr.push(pp[i].previousElementSibling); + } + + return arr; +} + +/* + Задание 4: + + Функция представленная ниже, перебирает все дочерние узлы типа "элемент" внутри узла переданного в параметре where и возвращает массив из текстового содержимого найденных элементов + Но похоже, что в код функции закралась ошибка и она работает не так, как описано. + + Необходимо найти и исправить ошибку в коде так, чтобы функция работала так, как описано выше. + + Пример: + Представим, что есть разметка: + +loftchool
!!! + должно быть преобразовано в${whatText}
, ${whereText}!`); + }); + }); + + describe('findAllPSiblings', () => { + it('должна возвращать массив с элементами, соседями которых являются P', () => { + let where = document.createElement('div'); + let result; + + where.innerHTML = ''; + result = findAllPSiblings(where); + + assert.isTrue(Array.isArray(result)); + assert.deepEqual(result, [where.children[0], where.children[3]]); + }); + }); + + describe('findError', () => { + it('должна возвращать массив из текстового содержимого элементов', () => { + let where = document.createElement('div'); + let text1 = random('string'); + let text2 = random('string'); + let result; + + where.innerHTML = `${text2}
${text3}`; + deleteTextNodesRecursive(where); + + assert.equal(where.innerHTML, '${text1} ${text2}
`; + result = collectDOMStat(where); + assert.deepEqual(result, stat); + }); + }); + + describe('observeChildNodes', () => { + it('должна вызывать fn при добавлении элементов в указанный элемент', done => { + let where = document.createElement('div'); + let fn = info => { + assert.isObject(info, 'info должен быть объектом'); + assert.equal(info.type, targetInfo.type, `info.type должен быть равен ${targetInfo.type}`); + assert.isTrue(Array.isArray(info.nodes), 'info.nodes должен быть массивом'); + assert.equal(info.nodes.length, targetInfo.nodes.length, 'некорректный размер info.nodes'); + assert.deepEqual(targetInfo.nodes, info.nodes); + done(); + }; + let elementToInsert = document.createElement('div'); + let targetInfo = { + type: 'insert', + nodes: [elementToInsert] + }; + + document.body.appendChild(where); + + observeChildNodes(where, fn); + where.appendChild(elementToInsert); + + document.body.removeChild(where); + }); + + it('должна вызывать fn при добавлении множества элементов в указанный элемент', done => { + let where = document.createElement('div'); + let fn = info => { + assert.isObject(info, 'info должен быть объектом'); + assert.equal(info.type, targetInfo.type, `info.type должен быть равен ${targetInfo.type}`); + assert.isTrue(Array.isArray(info.nodes), 'info.nodes должен быть массивом'); + assert.equal(info.nodes.length, targetInfo.nodes.length, 'некорректный размер info.nodes'); + assert.deepEqual(targetInfo.nodes, info.nodes); + done(); + }; + let elementToInsert1 = document.createElement('div'); + let elementToInsert2 = document.createElement('div'); + let elementToInsert3 = document.createElement('div'); + let targetInfo = { + type: 'insert', + nodes: [elementToInsert1, elementToInsert2, elementToInsert3] + }; + let fragment = new DocumentFragment(); + + document.body.appendChild(where); + + fragment.appendChild(elementToInsert1); + fragment.appendChild(elementToInsert2); + fragment.appendChild(elementToInsert3); + + observeChildNodes(where, fn); + where.appendChild(fragment); + + document.body.removeChild(where); + }); + + it('должна вызывать fn при удалении элементов из указанного элемента', done => { + let where = document.createElement('div'); + let fn = info => { + assert.isObject(info, 'info должен быть объектом'); + assert.equal(info.type, targetInfo.type, `info.type должен быть равен ${targetInfo.type}`); + assert.isTrue(Array.isArray(info.nodes), 'info.nodes должен быть массивом'); + assert.equal(info.nodes.length, targetInfo.nodes.length, 'некорректный размер info.nodes'); + assert.deepEqual(targetInfo.nodes, info.nodes); + done(); + }; + let elementToRemove = document.createElement('div'); + let targetInfo = { + type: 'remove', + nodes: [elementToRemove] + }; + + document.body.appendChild(where); + + where.appendChild(elementToRemove); + observeChildNodes(where, fn); + where.removeChild(elementToRemove); + + document.body.removeChild(where); + }); + + it('должна вызывать fn при удалении множества элементов из указанного элемента', done => { + let where = document.createElement('div'); + let fn = info => { + assert.isObject(info, 'info должен быть объектом'); + assert.equal(info.type, targetInfo.type, `info.type должен быть равен ${targetInfo.type}`); + assert.isTrue(Array.isArray(info.nodes), 'info.nodes должен быть массивом'); + assert.equal(info.nodes.length, targetInfo.nodes.length, 'некорректный размер info.nodes'); + assert.deepEqual(targetInfo.nodes, info.nodes); + done(); + }; + let elementToRemove1 = document.createElement('div'); + let elementToRemove2 = document.createElement('div'); + let elementToRemove3 = document.createElement('div'); + let targetInfo = { + type: 'remove', + nodes: [elementToRemove1, elementToRemove2, elementToRemove3] + }; + + document.body.appendChild(where); + + where.appendChild(elementToRemove1); + where.appendChild(elementToRemove2); + where.appendChild(elementToRemove3); + + observeChildNodes(where, fn); + where.innerHTML = ''; + + document.body.removeChild(where); + }); }); });