Ранее этим летом я начал учиться в школе Flatiron, чтобы стать инженером-программистом. После мучительных размышлений я понял, что пришло время моей карьере школьного учителя подойти к концу. За принятием этого невероятно сложного решения последовала не менее трудная дилемма: что теперь? Я прочитал статью о матери-одиночке, которая боролась с трудностями в качестве основного работника, затем посетила учебный курс по программированию и теперь могла работать удаленно и гораздо легче совмещать работу и воспитание детей. Изучив и решив, что это мне подходит, я подал заявку, заплатил деньги, сделал предварительную работу, и вот я здесь.

Дела поначалу шли как по маслу. До того, как начать работать во Flatiron, я сделал несколько начальных уроков по The Odin Project, а также прошел курс адаптивного веб-дизайна на FreeCodeCamp.org. Я смог относительно легко ориентироваться в подготовительном курсе и первой половине Фазы 1. Потом, по какой-то причине, я ударился о стену. Я не знаю, то ли я недостаточно хорошо усваивал материал, то ли двигался слишком быстро, но где-то в середине лета я столкнулся с несколькими трудностями, из-за которых мне показалось, что я вообще ничему не научился. !

Ниже приведено первое упражнение, с которым я столкнулась с большими трудностями, взятое из учебных материалов моей школы:

Если вы откроете index.html в браузере, вы найдете небольшое приложение. У него есть несколько особенностей:

Счетчик, который увеличивается на 1 каждую секунду

Кнопки "Плюс" и "Минус", которые увеличивают или уменьшают значение счетчика

Кнопка «Мне нравится» (❤️), которая добавляет «Мне нравится» для числа, которое в данный момент отображается на таймере

Поле комментариев, которое добавляет комментарии при отправке

Задача состоит в том, чтобы перепроектировать эти функции и создать их самостоятельно, используя то, что вы узнали о JavaScript и манипулировании DOM.

Исходя из этих заданных параметров, мои результаты были такими (примечание: эти результаты написаны в форме пользовательских историй. Они описывают функции с точки зрения пользователя, когда он посещает страницу):

Как пользователь я могу:

  • Следите за тем, как таймер увеличивается каждую секунду после загрузки страницы.
  • Вручную увеличивайте и уменьшайте значение счетчика с помощью кнопок "плюс" и "минус".
  • "Нравится" отдельный номер счетчика. Я должен увидеть количество отметок «Нравится», связанных с этим отображаемым числом.
  • Приостановить счетчик, который должен 1. приостановить счетчик, 2. отключить все кнопки, кроме кнопки паузы, и 3. изменить метку на кнопке с «пауза» на «возобновить»
  • Нажмите кнопку «Перезапустить», чтобы перезапустить счетчик и снова активировать кнопки.
  • Оставлять комментарии к моей игре, например: "Вау, какая это забавная игра".

В рамках этого поста я сосредоточусь на первых трех пунктах списка. Это заняло у меня несколько часов!

Мне удалось создать таймер достаточно легко, с помощью некоторых стандартных PGC (молитвы, гугление и проклятия). Создание функции счетчика приращения и уменьшения оказалось намного сложнее.

Прежде чем углубиться в JavaScript, вот html для приложения, который был создан для нас нашей школой:

<html>
<head>
<meta charset="UTF-8">
<title>Dom Challenge</title>
<style>
#counter {
background-color: black;
color: white;
display: table;
padding: 10px;
}
</style>
</head>
<body>
<h1>
Welcome to the DOM Challenge
</h1>
<h1 id='counter'>
0
</h1>
<button id='minus' > ➖ </button>
<button id='plus' > ➕ </button>
<button id='heart' > ❤️ </button>
<button id='pause' > pause </button>
<ul class='likes'></ul>
<div>
<h3>Comments</h3>
<div id='list' class='comments'></div>
<h3>Leave a comment</h3>
<form id="comment-form" action="">
<input type='text' name="comment" id="comment-input" cols="30" rows="10">
</br>
<button id='submit'>submit</button>
</form>
</div>
<!-- <script src="js/index.min.js"></script -->
<script src="js/challenge.js"></script>
</body>
</html>

Я просто включаю его здесь в качестве ссылки на мои методы JavaScript ниже. CSS для этой лаборатории был минимальным, поэтому я не буду включать его в это обсуждение.

Вот мой код JavaScript для функции счетчика:

Во-первых, мне сказали, что JavaScript вежливо указывать ваши переменные в начале вашего кода:

//Creating variables to use in the counter functions
const counterDisplay = document.getElementById('counter');
const counterMinus = document.getElementById('minus');
const counterPlus = document.getElementById('plus');
const clickLike = document.getElementById('heart');
const makeList = document.querySelector('.likes');

В данном случае мы уделяем особое внимание переменной «счетчик». Затем я хотел создать функцию обратного вызова, которая запускала бы счетчик при загрузке содержимого. Для новичков в программировании, таких как я, помните, что значение «1000» — это 1000 миллисекунд, следовательно, 1 секунда. ParseInt был введен после того, как я понял, что элемент ‹h1› в html читал «0» как строку, а не значение.

Оттуда было так же просто, как объявить функцию обратного вызова (myCallback) и попросить ее увеличиваться на значение 1 каждую секунду:

let count = parseInt(counterDisplay.textContent);
//Creating function that will start at 0, and start counting up by 1 upon loading/refreshing the page
let intervalID = setInterval(myCallback, 1000);
function myCallback() {
//console.log(counterDisplayBegin.textContent);
counterDisplay.innerHTML = count++;
//console.log(count);
}

Я был очень горд собой, что диагностировал первоначальную проблему со своим счетчиком, поняв, что ‹h1› был строкой. Разве я не гордый маленький отладчик! Плавное плавание с этого момента, верно? Ну… не так уж и много.

Теперь пришло время добавить функциональность для увеличения или уменьшения текущего значения счетчика одним нажатием кнопки. Мне нужно было добавить прослушиватели событий, которые выполняли бы эту функцию, но по какой-то причине я не мог заставить кликер работать.

Моя первоначальная попытка была такой:

const incrementCounter = () => {
const likeElement = document.createElement('li');
makeList.appendChild(likeElement);
if (arrayOfNumbers.includes(count)) {
const valueMatch = arrayOfObjects.find((object) => object.number === count);
valueMatch.likes++;
likeElement.textContent = `${count} has been clicked ${valueMatch} times.`
} else {arrayOfObjects.push({number: count, likes: 1});
likeElement.textContent = `${count} has been clicked 1 times.`
}
}
for (value of arrayOfObjects) {
arrayOfNumbers.push(value[number]);
}

Однако по какой-то причине счетчик не инициализировался. После еще нескольких PGC (молиться, гуглить, ругаться) я связался с одним из наших технических тренеров, и мы приступили к устранению неполадок. То, что обычно занимает около 10 минут, перешло ко мне, двум техническим тренерам и почти 2 часам проб и ошибок!

Одной из первых проблем было то, что кнопки увеличения и уменьшения не работали. Один из моих технических тренеров предложил попробовать создать несколько массивов для хранения текущего значения таймера при каждом нажатии кнопки увеличения или уменьшения. Я думал, что мы могли бы использовать это для записи количества лайков, сравнивая значение, хранящееся в нашем массиве объектов, с текущим количеством лайков.

С помощью я в конце концов заставил кнопки увеличения и уменьшения работать, но кнопка «Нравится» не записывала лайки, если одно и то же значение было «лайкано» более одного раза:

const incrementCounter = () => {

for (value of arrayOfObjects) {
arrayOfNumbers.push(value.number);
};
if (arrayOfNumbers.includes(count)) {
const valueMatch = arrayOfObjects.find((object) => object.number === count);
valueMatch.likes++;
const likedElement = document.getElementById(`${count}`);
likedElement.textContent = `${count} has been clicked ${valueMatch.likes} times.`
} else {arrayOfObjects.push({number: count, likes: 1});
const likeElement = document.createElement('li');
likeElement.setAttribute('id', count);
likeElement.textContent = `${count} has been clicked 1 times.`
makeList.appendChild(likeElement);
console.log(likeElement);
}
console.log(arrayOfNumbers);
console.log(arrayOfObjects);
}
clickLike.addEventListener("click",incrementCounter);

Мы пытались создать элемент списка («li») в html и заполнить его литералом шаблона. Мы продолжали сталкиваться с проблемой, когда код не мог обновить счетчик, когда значение понравилось более одного раза. В конечном счете, это был код, который в итоге заработал. Я включил старый неработающий код, который вы можете увидеть закомментированным после инициализации переменной «let currentCount = 0».

//Creating variables to use in the counter functions
const counterDisplay = document.getElementById('counter');
const counterMinus = document.getElementById('minus');
const counterPlus = document.getElementById('plus');
const clickLike = document.getElementById('heart');
const makeList = document.querySelector('.likes');
const likeButton = document.getElementById('heart');
let count = parseInt(counterDisplay.textContent);
//Creating function that will start at 0, and start counting up by 1 upon loading/refreshing the page
let intervalID = setInterval(myCallback, 1000);
function myCallback() {
//console.log(counterDisplayBegin.textContent);
counterDisplay.innerHTML = count++;
//console.log(count);
}
//This is the code for the function for the increment up button
counterPlus.addEventListener("click",() => {
counterDisplay.innerHTML = count++;
console.log(count);
})
//This is the code for the function for the increment down button
counterMinus.addEventListener("click",() => {
counterDisplay.innerHTML = count--;
console.log(count);
})
let currentCount = 0
//This is the code to click likes and record the number of likes.
// const incrementCounter = () => {
//     const likeElement = document.createElement("li");
//     //const oldCountValue = count;
//     //console.log(oldCountValue);
//     makeList.appendChild(likeElement);
//     //currentCount++;
//     likeElement.textContent = `${count} has been clicked ${currentCount} times.`
//     //if (numberOfLikes.includes(count))
// };
// const numberOfClicks = [];
// const numberOfLikes = [];
const arrayOfObjects = [];
const arrayOfNumbers = [];
const incrementCounter = () => {
for (value of arrayOfObjects) {
arrayOfNumbers.push(value.number);
};
if (arrayOfNumbers.includes(count)) {
const valueMatch = arrayOfObjects.find((object) => object.number === count);
valueMatch.likes++;
const likedElement = document.getElementById(`${count}`);
likedElement.textContent = `${count} has been clicked ${valueMatch.likes} times.`
} else {arrayOfObjects.push({number: count, likes: 1});
const likeElement = document.createElement('li');
likeElement.setAttribute('id', count);
likeElement.textContent = `${count} has been clicked 1 times.`
makeList.appendChild(likeElement);
console.log(likeElement);
}
console.log(arrayOfNumbers);
console.log(arrayOfObjects);
}
clickLike.addEventListener("click",incrementCounter);

После всего этого я узнал несколько вещей:

  1. Кодить сложно, но можно.

Когда я был тренером по спорту в старшей школе, я обычно говорил своим ученикам: «Самое лучшее в том, чтобы быть в форме, это то, что каждый день становится немного меньше». Мой опыт здесь ничем не отличается. Несмотря на некоторые «тренировки», которые действительно сложны, я чувствую, что нахожусь в лучшей форме.

2. Держитесь и просите о помощи

В подкасте Code Newbie я услышал, как одна из участниц сказала, что слово «ага» звучит для нее музыкой. Иногда она застревает и сообщает о проблеме старшим инженерам, и, посмотрев некоторое время на код, они тоже иногда могут застрять! У старших инженеров тоже нет всех решений. Когда она слышит, как они говорят «ага», это подтверждает. Она поняла, что ни у кого из нас не бывает всех идей постоянно, поэтому лучше принять менталитет «мы все вместе».

3. Привыкайте к дискомфорту от постоянного отсутствия «правильного ответа».

Я много лет преподаю математику в старшей школе, и это упражнение было действительно хорошим напоминанием о том, каково это — чувствовать себя полностью сбитым с толку и потерянным. Когда я позвонил техническим тренерам, и у них тоже не было немедленного ответа, это меня очень обнадежило. Я понял, что чувствовать себя немного сбитым с толку, потерянным или обескураженным – это нормально. На самом деле, я учусь относиться к путанице и принимать ее за то, что она есть: возможность расти.

Спасибо за чтение, и, пожалуйста, помните, глядя на мой код, что я новичок в программировании! Я буду поправляться, если ты будешь терпеливой.

Я закончу небольшим советом: никогда не называйте свой пост в блоге ссылкой на доктора Стрейнджлава. Миллениалы не получат рекомендацию, а бумеры не сочтут вас умным…

Всем удачного кодирования!