Javascript-форум (https://javascript.ru/forum/)
-   Элементы интерфейса (https://javascript.ru/forum/dom-window/)
-   -   Изучение javascript (https://javascript.ru/forum/dom-window/75126-izuchenie-javascript.html)

madeas 04.09.2018 17:51

Изучение javascript
 
Всем привет!
Я часто сталкиваюсь в работе с js, могу решить задачи различной сложности => найти код и отредактировать под свои нужды. Хотя, на данном этапе, это времязатратный процесс, поскольку нет полноценного понимания языка. Поэтому я решил начать изучать js основательно, так сказать, научиться программировать самому, а не говнокодить), с применением современных стандартов. С теорией у меня туго, поэтому предпочитаю изучать в ходе работы, на практике, по необходимости заглядывая в доки.
Сделал небольшую подборку простеньких скриптов, возможно они кому-нибудь тоже пригодятся. http://jsfiddle.net/madeas/07vqk1ms/12/

В скрипте уже заменил все var на const и подвел скрипты к более современному виду. Возможно, кто-то подскажет, как можно сделать еще лучше...
Придумывать задачи из головы не получается, поскольку не совсем понимаю куда двигаться. Можете накидать несколько интересных, но не слишком сложных задач, отталкиваясь от примера выше, для повышения уровня работы с js, но так, чтобы не перескакивать через этапы и не пропустить важные вещи?
Или посоветуйте канал/видео уроки, с качественным содержанием. Искал в сети видео, но почти везде пишут, что авторы не правильно рассказывают, начинают не с того или говорят совсем не то, перескакивая через "шаги".

Грубо говоря, ищу наставника и друга, который поможет в изучении языка). В дальнейшем планирую работу с node.js, gulp и angular. Буду рад совместной работе, в ходе обучения, над каким-нибудь проектом.

рони 04.09.2018 18:23

Цитата:

Сообщение от madeas
Можете накидать несколько интересных, но не слишком сложных задач, отталкиваясь от примера выше,

// 1 задаем стили рабочей области через js
document.querySelector('.container').style = 'display:flex; flex-direction: column;align-items: center;border: 1px dotted lightgray;padding:25px';


сделайте тоже самое, но используя метод обьекта.

Nexus 05.09.2018 10:12

У вас в коде для выборки DOM-элементов используется как jq, так и нативный js. Если используете jq, то используйте его по максимуму.
Также в коде часто из dom дергаются одни и те же элементы, не лучше ли сохранить на них ссылку?

Ниже что-то нелепое.
В первой строке вы уже изменили контент блока, во второй вы снова достаете из dom этот же блок и снова изменяете его контент на тот, что у него уже установлен.
const cont = document.getElementById('cont').innerHTML = 'Please wait...';
document.getElementById('cont').innerHTML = cont;

madeas 05.09.2018 11:33

рони,
Что-то сложновато) Сделал иначе, но это явно не оно...
Пока не совсем понял принцип работы с объектами.

Пример из учебника:
var user = {
  name: 'Василий'
};

user.sayHi = function() {
  alert('Привет!');
};

user.sayHi();


Мы создаем переменную, в ней задаем объект, затем обращаемся к этой переменной, чтобы создать функцию и затем присваиваем метод, который выводим в конце. Вроде бы, ничего не упустил.
Вопросы:
1. Какой смысл этого обращения, если в алерте все равно только "привет"?
2. Наверное глупый вопрос. Если я пишу console.log - я знаю, что она выводится в консоль, с alert тоже все ясно. Куда выводится этот метод? Или как он работает...

madeas 05.09.2018 11:44

Цитата:

Сообщение от Nexus (Сообщение 493980)
У вас в коде для выборки DOM-элементов используется как jq, так и нативный js. Если используете jq, то используйте его по максимуму.

Я не сторонник лишнего кода и источников. Тем более, что владею jq не в полном объеме. JQ использовал в примере только для кружочка-курсора)) Просто пока не знаю как реализовать на чистом js. Сделал бы иначе.

Цитата:

Сообщение от Nexus (Сообщение 493980)
Также в коде часто из dom дергаются одни и те же элементы, не лучше ли сохранить на них ссылку?

Это как? Обращение идет постепенно, при создании новых действий с элементами. Если я пропишу все сразу, могу запутаться)

Цитата:

Сообщение от Nexus (Сообщение 493980)
Ниже что-то нелепое.
В первой строке вы уже изменили контент блока, во второй вы снова достаете из dom этот же блок и снова изменяете его контент на тот, что у него уже установлен.
const cont = document.getElementById('cont').innerHTML = 'Please wait...';
document.getElementById('cont').innerHTML = cont;

Согласен, проглядел) Просто, в ходе работы над 4 и 6 этапом, изначально функция была записана в html в самой кнопке. Когда решил переписать все в js, при переносе пропустил.

И еще, подскажите. При создании всплывающего окна, хотел сделать несколько вариантов ответа, например: hello == 'нет' || 'Нет' || 'ytn' и для других тоже, но когда прописываю несколько, работа окна сбивается.

Nexus 05.09.2018 11:58

Цитата:

Сообщение от madeas
Просто пока не знаю как реализовать на чистом js. Сделал бы иначе.

http://jsfiddle.net/07vqk1ms/46/

Цитата:

Сообщение от madeas
хотел сделать несколько вариантов ответа, например: hello == 'нет' || 'Нет' || 'ytn'

hello=hello.toString().toLowerCase().trim();
if(['нет','ytn','no','etc.'].indexOf(hello)>=0)
  alert('Выбран один из вариантов ответа');

Dilettante_Pro 05.09.2018 12:04

рони,
Цитата:

Сообщение от рони
сделайте тоже самое, но используя метод обьекта

JS или jQuery?

madeas 05.09.2018 13:12

Nexus,
переделал под js все что было на jq, а вот на счет сохранения ссылок и нескольких вариантов для ответа нет. Подскажите, где об этом можно почитать.
Dilettante_Pro,
лучше на js конечно, не хочется лишний раз прибегать к jq

Nexus 05.09.2018 13:22

Цитата:

Сообщение от madeas
а вот на счет сохранения ссылок и нескольких вариантов для ответа нет.

Вы уже используете ссылки на элементы dom, см. свои строки 6,19,24.
Чтобы каждый раз не искать элементы в дереве их можно сохранить в переменную и работать с ней.

По поводу нескольких вариантов ответа см. комментарий №6.

Dilettante_Pro 05.09.2018 13:36

Цитата:

Сообщение от madeas
лучше на js конечно, не хочется лишний раз прибегать к jq

Если на jQuery - то в вашем примере есть пример (извините за тавтологию) использования метода объекта для назначения стилей

madeas 05.09.2018 13:41

Цитата:

Сообщение от Nexus (Сообщение 494016)
Вы уже используете ссылки на элементы dom, см. свои строки 6,19,24.
Чтобы каждый раз не искать элементы в дереве их можно сохранить в переменную и работать с ней.

понял. переписал. спасибо.

Цитата:

Сообщение от Nexus (Сообщение 494016)
По поводу нескольких вариантов ответа см. комментарий №6.

комментарий я видел, только не понял как он применяется к данному окну. Либо я не туда ставлю, либо ставлю не так. При вставке кода выдает ошибку.

UPD:
Подправил. ошибка была в переменных. Заменил вторую Hello на ho.

Nexus 05.09.2018 14:06

madeas, метод "toLowerCase" приводит строки к нижнему регистру, поэтому нет смысла задавать варианты ответа с заглавной первой буквой, она никогда не будет выбрана.
Задавайте варианты ответа в нижнем регистре.

madeas 05.09.2018 15:03

Nexus,
кстати да, спасибо. работу метода посмотрел, а сообразить не сообразил))
Может еще подкинете какую-нибудь задачку?

Nexus 05.09.2018 15:07

Цитата:

Сообщение от madeas
Может еще подкинете какую-нибудь задачку?

Вы задачу рони еще не решили.
https://developer.mozilla.org/en-US/...yleDeclaration

madeas 05.09.2018 15:19

Nexus,
точно. ушел читать

рони 05.09.2018 15:41

madeas,
Dilettante_Pro,
Nexus,
уточню, изменить стиль элемента, надо, используя метод Object

madeas 05.09.2018 15:58

рони,
так?
<div class="container">Hello JavaScript</div>

<script>
// способ записи (представление объектов) #1
var contGlobStl = {} // создаем пустой объект
contGlobStl.style = 'display: flex;\nflex-direction: row;\njustify-content:center;\nwidth: auto;\nheight:55vh;\nalign-items: center;\npadding: 25px;\nbackground: black;\ncolor: white' // добавили свойство объекту

// способ записи #2
var contGlobStl = { // создаем объект
  style: 'display: flex;\nflex-direction: row;\njustify-content:center;\nwidth: auto;\nheight:55vh;\nalign-items: center;\npadding: 25px;\nbackground: black;\ncolor: white' // добавили свойство объекту
};

// выводим свойство(а) объекта в консоль
console.log(contGlobStl.style);

// выполняем проверку наличия свойств(а) в alert (не обязательно)
if ('style' in contGlobStl) {
  alert('Свойство' + ' ' + 'найдено'); // если найдено
} else {
  alert('Свойство не существует'); // если не найдено
}

var contGlob = document.querySelector('.container');
contGlob.style = contGlobStl.style;
</script>

Тогда в моем примере это будет выглядеть вот так. Строка 8+
Конечно, мог что-то упустить, но вроде все на месте. Если я правильно понял, можно было еще разбить стили на отдельные свойства, но мне кажется, так будет хуже.

рони 05.09.2018 16:25

madeas,
три строки максимум, и никаких style =

Nexus 05.09.2018 16:26

madeas, вряд ли. У вас не используются методы объекта Object.

Nexus 05.09.2018 16:28

Цитата:

Сообщение от рони
три строки максимум, и никаких style =

А свойства, которые нужно применить каким типом данных выражены должны быть?

рони 05.09.2018 16:31

Цитата:

Сообщение от Nexus
А свойства, которые нужно применить каким типом данных выражены должны быть?

немного не понял ...
результат должен быть такой
<div class="container" style="display: flex; flex-direction: column; align-items: center; border: 1px dotted lightgray; padding: 25px;">123</div>

тоже самое что
document.querySelector('.container').style = 'display:flex; flex-direction: column;align-items: center;border: 1px dotted lightgray;padding:25px';

Dilettante_Pro 05.09.2018 16:38

???????????????

<div class="container">Hello JavaScript</div>
<script>
 var obj = document.querySelector('.container').style;
Object.defineProperties(obj, {
       background: {
          value: 'black',
       },
       color: {
         value: 'white',
       }
});

</script>

Nexus 05.09.2018 16:51

Цитата:

Сообщение от рони
немного не понял

Не представляю, как уложиться в 3 строки, если стили будут в виде объекта.
<div id="div"></div>
<script>
Object.assign(div.style,{
	minHeight:'300px',
	background:'#DDD'
});
</script>

рони 05.09.2018 17:10

Nexus,
да:victory:

рони 05.09.2018 17:11

Цитата:

Сообщение от Nexus
как уложиться в 3 строки, если

<!DOCTYPE html>

<html>
<head>
  <title>Untitled</title>
  <meta charset="utf-8">
<script src="https://cdn.polyfill.io/v1/polyfill.js?Object.assign"></script>
</head>

<body>
<div  class="container" >123</div>
<script>
 var oldStyle = document.querySelector('.container').style,
 newStyle = {display:'flex', 'flex-direction': 'column','align-items': 'center', border: '1px dotted lightgray',padding:'25px'};
 Object.assign(oldStyle,newStyle)
</script>
</body>
</html>

рони 05.09.2018 17:13

Dilettante_Pro,
ок! :)

madeas 05.09.2018 17:16

я был близок, вроде бы))

Dilettante_Pro 05.09.2018 17:23

рони,
Труднее всего было догадаться о сути вопроса, т.к., например $('#circle').css({ - тоже метод объекта...

рони 05.09.2018 17:38

madeas,
менять стиль лучше либо по одному style.display = 'flex' или $.css или Object.assign иначе легко можно стереть какие-то значения в style, используя style =

madeas 05.09.2018 17:53

рони,
понял. Еще почитаю, потренируюсь. Спасибо за не простую, но интересную задачу)

madeas 06.09.2018 10:55

Ребята, посмотрите код. Может есть замечания какие или новые задачи.

Nexus 06.09.2018 11:02

madeas, в строке 68 используется необъявленная переменная.
prompt помимо string может возвращать и null, проверка полученных данных отсутствует.
У null нет метода toString, поэтому скрипт падает в 68 строке.

Dilettante_Pro 06.09.2018 11:19

Цитата:

Сообщение от madeas
или новые задачи

Сделайте все то же самое, только диалог ведите не через prompt/alert, а через html

madeas 06.09.2018 16:00

Nexus,
спасибо, поправил

Dilettante_Pro,
что-то не могу понять как и куда прописать в условные операторы функцию нажатия новых кнопок... Пример строка 77. И вообще возможна ли такая запись?) Результат пока вывел в алерт для наглядности

Dilettante_Pro 06.09.2018 17:51

madeas,
Назначение и удаление обработчиков событий

И еще: не надо так писать:
let
  btn1 = document.getElementById('btn1'),
  btn1Stl = document.getElementById('btn1').style,

Зачем вы дважды ищете одно и то же?
Нужно
let
  btn1 = document.getElementById('btn1'),
  btn1Stl = btn1.style,

madeas 07.09.2018 09:37

Dilettante_Pro,
действительно, не додумался. Подправил и структурировал код
А подскажите, можно ли записать эти четыре строки в одну? В доках не нашел информацию про это.

Object.assign(globStl, globStyle);
Object.assign(resStl, resStyle);
Object.assign(btn1Stl, btn1Style);
Object.assign(textStl, textStyle);

Dilettante_Pro 07.09.2018 10:00

madeas,
Вообще-то удобнее не задавать элементам непосредственно стили, а написать в css нужные классы, и подключать/переключать их по необходимости.

madeas 07.09.2018 10:02

Dilettante_Pro,
знаю, просто в целях "набивания рук" решил попробовать обойтись без написания в css, поскольку с ним у меня проблем нет.
Вдруг решу когда-нибудь написать сайт на чистом js + html и закину во внешний скрипт)) Хотя, это, наверное, извращение)


Часовой пояс GMT +3, время: 20:03.