/* ДЗ 4 - работа с DOM */
/**
* Функция должна создать элемент с тегом DIV, поместить в него текстовый узел и вернуть получившийся элемент
*
* @param {string} text - текст, который необходимо поместить в div
* @return {Element}
*/
function createDivWithText(text) {
var div = document.createElement('div');
div.innerText = text;
return div;
}
/**
* Функция должна создать элемент с тегом A, установить значение для атрибута href и вернуть получившийся элемент
*
* @param {string} hrefValue - значение для атрибута href
* @return {Element}
*/
function createAWithHref(hrefValue) {
var a = document.createElement('a');
a.href = hrefValue;
return a;
}
/**
* Функция должна вставлять элемент what в начало элемента where
*
* @param {Element} what - что вставлять
* @param {Element} where - куда вставлять
*/
function prepend(what, where) {
where.prepend(what);
}
/**
* Функция должна перебрать все дочерние элементы элемента where
* и вернуть массив, состоящий из тех дочерних элементов
* следующим соседом которых является элемент с тегом P
* Рекурсия - по желанию
*
* @param {Element} where - где искать
* @return {Array}
*
* @example
* для html ''
* функция должна вернуть: [div, span]
* т.к. следующим соседом этих элементов является элемент с тегом P
*/
function findAllPSiblings(where) {
var w = where.children;
var arr = [];
for (var i = 0; i < w.length - 1; i++) {
if (w[i].nextElementSibling.nodeName === 'P') {
arr.push(w[i]);
}
}
return arr;
}
/**
* Функция должна перебрать все дочерние узлы типа "элемент" внутри where
* и вернуть массив, состоящий из текстового содержимого перебираемых элементов
* Но похоже, что в код закралась ошибка, которую нужно найти и исправить
*
* @param {Element} where - где искать
* @return {Array}
*/
function findError(where) {
var result = [];
for (var i = 0; i < where.childNodes.length; i++) {
if (where.childNodes[i].nodeType === 1) {
result.push(where.childNodes[i].innerText);
}
}
return result;
}
/**
* Функция должна перебрать все дочерние узлы элемента where
* и удалить из него все текстовые узлы
* Без рекурсии!
* Будьте внимательны при удалении узлов,
* можно получить неожиданное поведение при переборе узлов
*
* @param {Element} where - где искать
*
* @example
* после выполнения функции, дерево приветloftchool!!!
* должно быть преобразовано в
*/
function deleteTextNodes(where) {
var w = where.childNodes;
for (var i = 0; i < w.length; i++) {
if (w[i].nodeType === 3) {
w[i].parentNode.removeChild(w[i]);
}
}
}
/**
* Выполнить предудыщее задание с использование рекурсии
* то есть необходимо заходить внутрь каждого дочернего элемента
*
* @param {Element} where - где искать
*
* @example
* после выполнения функции, дерево привет loftchool
!!!
* должно быть преобразовано в
*/
function deleteTextNodesRecursive(where) {
for (let i = 0; i < where.childNodes.length; i++) {
let child = where.childNodes[i];
if (child.nodeType === 3) {
where.removeChild(child); //удаляем ребенка
i--; // уменьшаем счетчик т.к. все сместилось
} else if (child.nodeType === 1) {
deleteTextNodesRecursive(child); // вызываем рекурсию
}
}
}
export {
createDivWithText,
createAWithHref,
prepend,
findAllPSiblings,
findError,
deleteTextNodes,
deleteTextNodesRecursive
};