Ответы пользователя по тегу JavaScript
  • Стоит ли переходить с var на let и const?

    dollar
    @dollar
    Делай добро и бросай его в воду.
    Нужно использовать и то, и другое одновременно, в зависимости от обстоятельств.

    Например, если вы используете Google Script, то var, потому что там что-то типа ES5.
    Если шлёте код другу, чтобы он проверил его через консоль браузера, то опять var, потому что если что-то поменяется и надо будет ещё раз проверить, то он запустится без ошибок (о том, что переменная уже объявлена).

    С другой стороны, в одном пространстве (например, внутри функции) вы можете использовать несколько одинаковых переменных с помощью let на разных уровнях, и не бояться конфликтов, в то время как через var будет одна и та же переменная. Пример:
    for(let i=0;i<2;i++)for(let i=0;i<2;i++)console.log(i); //покажет 4 раза
    for(var i=0;i<2;i++)for(var i=0;i<2;i++)console.log(i); //покажет 2 раза

    Каждое имеет свои особенности и удобно по-своему.
    Ответ написан
    9 комментариев
  • Как обойти CORB в расширении для Chrome 74?

    dollar
    @dollar
    Делай добро и бросай его в воду.
    "permissions": [ "<all_urls>" ]
    Также попробуйте webRequest
    Ответ написан
  • Как взять переменную js?

    dollar
    @dollar
    Делай добро и бросай его в воду.
    var iconN, iconU; //опа!
    $( ".djeym__balloon__content-body .djeym_add_placemark" )
            .on( "click", function( event ) {
              event.stopPropagation();
              var $this = $( this );
              iconU = $this.data('icon_url'); //хоп
              iconN = $this.data('icon_name'); //хоп
              djeymContextMenuPlacemark( mapEvent, true, coords );
            } );
    
    let iconName = ( mode ) ? iconN :
          objEvent.properties.get( "iconName" );
    
    let imgSrc = ( mode ) ? iconU :
          objEvent.options.get( "iconImageHref" );
    Ответ написан
    6 комментариев
  • Какой самый универсальный инструмент для работы с анимацией и графикой на js?

    dollar
    @dollar
    Делай добро и бросай его в воду.
    Вы хотите, чтоб у вас всё было, и вам за это ничё не было.
    Но так не может быть.

    Любой, даже супер навороченный фреймворк, это, как минимум, увеличение размера страницы и потребления памяти. Если у вас простая задача, типа нарисовать 7 красных линий, то это можно сделать на нативном JS, без фреймворков.

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

    А вот когда есть повторные задания, очень похожие на предыдущие, вот тогда уже имеет смысл что-то, что упростит решение типовых задач, автоматизирует его. Но что мешает скопировать свой предыдущий код и чуть модифицировать его?
    Ответ написан
    1 комментарий
  • Как работают области видимости JS?

    dollar
    @dollar
    Делай добро и бросай его в воду.
    Область видимости переменной зависит только от того, где она объявлена, и не зависит от цепочки вызовов. Так что если хотите зависимость по цепочке, то объявляйте одну функцию в другой. И почитайте про замыкания в JavaScript.
    Ответ написан
    2 комментария
  • Как сделать, чтобы количество врагов увеличивалось?

    dollar
    @dollar
    Делай добро и бросай его в воду.
    В spawnEnemies() вы создаёте одно врага и дальше в цикле вызываете для него createEnemy(), но это один и тот же объект врага, а вы просто меняете ему координаты каждый раз, обращаясь к this.

    В цикле у вас всего одна итерация.

    enemySpawn у вас глобальная функция. Нужно либо this.enemySpawn, либо вынести её за пределы Enemy, чтобы не пересоздавать каждый раз.
    Ответ написан
    Комментировать
  • Как передать значения в input из кнопок на нативном JS?

    dollar
    @dollar
    Делай добро и бросай его в воду.
    На каждую кнопку нужно повесить свою функцию при событии onclick.
    Или даже одну функцию на все кнопки, которая будет смотреть, что за кнопка, и соответственно реагировать.
    В качестве реакции - добавление в конец input новой цифры или что там у вас:
    input.value = input.value + symbol;
    Ответ написан
    Комментировать
  • Как правильно заменить функционал с document.getElementById на class?

    dollar
    @dollar
    Делай добро и бросай его в воду.
    Есть функция getElementsByClassName().
    Поэтому так
    <script>
    var all = document.getElementsByClassName('main-menu__link');
    for (let i=0; i<all.length; i++) {
    	all[i].onclick = function() {
    		setTimeout(function() {
    			window.location = 'http://site.com/checkout';
    		}, 500);
    	}
    };
    </script>
    Или так
    <script>
    [...document.getElementsByClassName('main-menu__link')].forEach(e=>e.onclick = function() {
    	setTimeout(function() {
    		window.location = 'http://site.com/checkout';
    	}, 500);
    });
    </script>
    Ответ написан
  • Как научиться понимать работу js в браузере?

    dollar
    @dollar
    Делай добро и бросай его в воду.
    Сначала вы учите алфавит, затем учитесь читать и писать по слогам, потом уже можете читать слова целиком. Точнее, как бы воспринимать слова целиком, а не по буквам или по слогам, то есть это переход на новый уровень смысловых единиц. Дальше вы можете быстро читать, целыми предложениями. Хотя если встречается сложносочиненное/сложноподчиненное предложение, то не всегда удаётся ухватить его с первого раза. Ну а спустя годы, освоив скорочтение, вы спокойно читаете по диагонали.

    Профессиональный шахматист смотрит на доску и просто видит ходы. Причем из сотен вариантов он видит 2-3 нормальных и только над ними думает, остальные даже не замечает. И он не то чтобы просчитывал вперед, опять же он просто видит, как будет развиваться ситуация дальше. Использует ли он шахматные инструменты для анализа доски? Нет. Использует ли он какие-то учебники, которые помогают познать тайны шахматных правил? Нет. Правила просты до безобразия и можно выучить за 5 минут. А дальше только практика.

    Мы используем инструменты разработчика, в основном, для отладки. То есть, чтобы проверить ту или иную переменную или посмотреть отладочные сообщения в консоли. Там есть всякие приятные возможности, но основное - это консоль. Она помогает пощупать интерпретатор, познакомиться вплотную. Чему равно 0/0? Или typeof []? Консоль даст ответ на множество подобных вопросов. JS довольно запутанный язык, который тянет за собой кучу исторических особенностей, которые нет смысла помнить все. Но время от времени играть с интерпретатором можно для общего развития.

    А теперь главный вопрос. Для чего вам понимать работу js в чужих сайтах? Если у вас есть задача, так и делайте её. Какой смысл ковыряться в других сайтах?
    Ответ написан
    4 комментария
  • Каким образом парсят json с огромным содержимым?

    dollar
    @dollar
    Делай добро и бросай его в воду.
    С сервера приходит JSON той структуры, которую вы ожидаете. Если это ваш сервер, то вы сами и формируете этот JSON, иначе структура описана в документации.

    Из строки получается так:
    var str = '{"x":123, "y":234, "z": [ 1, 2, 3 ] }';
    var obj = JSON.parse(str);
    obj.z[2]; // 3
    Ответ написан
    2 комментария
  • Как правильно изолировать код блока?

    dollar
    @dollar
    Делай добро и бросай его в воду.
    Зависит от кода. И ваш пример не остановит. Просто в случае отсутствия blockEl будет null, и обращение к нему вызовет ошибку. Вариантов решения море.
    //Классика
    var blockEl = document.querySelector('.block');
    if (blockEl) {
      // .....
    }
    
    //Внутри функции
    var blockEl = document.querySelector('.block');
    if (!blockEl) return;
    
    //Обёртка
    try {
      var blockEl = document.querySelector('.block');
      // .....
    } catch(e) {}
    
    //Обманка
    var blockEl = document.querySelector('.block') || {};
    //Хитрые обманки
    var blockEl = document.querySelector('.block') || { querySelector: e=>{} };
    
    // и т.д.
    Ответ написан
    2 комментария
  • Как выполнить одну функцию после завершения другой?

    dollar
    @dollar
    Делай добро и бросай его в воду.
    Вот вам вариант с промисами:
    function first(){
    	return new Promise(next=>{
    		setTimeout( function(){
    			console.log(1);
    			next('привет');
    		}, 1000 );
    	});
    }
    function second(txt){
    	console.log('После first получили:', txt);
    	console.log(2);
    }
    
    first().then(second); //Сначала first, затем second

    Теорию по промисам можно почитать здесь: https://learn.javascript.ru/promise

    Соответственно, ваш вариант с промисами будет примерно такой:
    spoiler
    function first(e){
    	console.log('start',e);
    	return new Promise(next=>{
    		console.log('promise');
    		setTimeout( function(){
    			console.log('main code... ' + Math.random());
    			next(e);
    		}, 2000 );
    	});
    }
    function second(e){
    	console.log('end '+e);
    }
    
    var arr = ['element_0', 'element_1', 'element_2', 'element_3', 'element_4'];
    
    arr.forEach(e=>first(e).then(second));
    Обратите внимание, что вся суть и работа в итоге записывается в одну строчку в конце. И получается очень красиво и логично. А весь код до этого - чисто подготовка и объявления.
    Ответ написан
    Комментировать
  • Как решить проблему с JS: Uncaught ReferenceError?

    dollar
    @dollar
    Делай добро и бросай его в воду.
    Нужно подключить библиотеку jQuery до этих двух скриптов.
    Ответ написан
  • Как производить расчёты в процентах?

    dollar
    @dollar
    Делай добро и бросай его в воду.
    https://ru.wikipedia.org/wiki/Процент

    x = x * 0.9 //оставить 90%, то есть по сути отнять 10%
    x = x - 0.1 * x //от х отнять 10%

    По-всякому можно. Главное, понимать, что такое проценты по сути.
    Ответ написан
    4 комментария
  • Можно ли написать функцию, которая проверяет существует ли переменная или нет (js)?

    dollar
    @dollar
    Делай добро и бросай его в воду.
    function isExist(varName) {
    	let exist = true;
    	try { eval(varName); }
    	catch(e) { exist = false; }
    	if (exist) console.log('она существует!');
    	return exist;
    }
    
    isExist('someVar'); //false
    let someVar = 123;
    isExist('someVar'); //true
    Ответ написан
  • Использование операторов rest/spread и деструктуризации при передачи параметров в функцию?

    dollar
    @dollar
    Делай добро и бросай его в воду.
    //В лоб проще и короче. Ещё и умную валидацию можно прикрутить при желании
    function anyFunc(options){
      // тут что то делаем обращаясь к параметрам через options.keyName.
      // например:
      const text = anyFormat(options.data, options.format || {});
      anySave((options.path||"./temp") + "/" + (options.file||"plt_temp_data.txt"), text);
    }
    
    //Аналогично
    function anyFormat(data, format) {
      // ...... (format.fixed || 2) ........ (format.space || "  ") ...... и т.п.
    }
    Ответ написан
    3 комментария
  • Как удалить пустые сроки?

    dollar
    @dollar
    Делай добро и бросай его в воду.
    str.replace(/\r?\n[ \t]*(?=\r?\n)/g, '')
    Удаляет пустые строки с пробелами.

    UPD:
    str.replace(/(\r?\n)\s*(?=\r?\n)(?=[^\s]+?|$)/g, '$1');
    Ответ написан
  • Как установить кодировку в JS файле?

    dollar
    @dollar
    Делай добро и бросай его в воду.
    Кодировка зависит от редактора, в котором вы создали app.js.

    Обычно в редакторе при сохранении файла можно указать и кодировку. Либо при создании (или во время редактирования) указывается кодировка и становится как бы свойством файла.
    Ответ написан
  • Как сделать регулярку - 1 или больше символов потом пробел, а потом опять 1 или больше символов?

    dollar
    @dollar
    Делай добро и бросай его в воду.
    Если возможные случайные пробелы чистятся на сервере, то:
    var validateName = /^\s*[a-zA-Zа-яА-ЯёЁ]+\s+[a-zA-Zа-яА-ЯёЁ]+\s*$/;

    \s означает любой пробельный символ (пробел, знак табуляции и т.д.)
    \s+ означает 1 и более пробельных символов.
    \s* означает 0 и более пробельных символов.

    Если есть желание почистить форму от случайных пробелов до отправки, или даже во время редактирования, то ещё это:
    value = value.trim().replace(/\s+/g, ' '); //перед отправкой

    P.S. Рекомендую почитать про некоторые заблуждение, а также продолжение этого опуса, прежде чем рубить с плеча. Валидация формы - дело тонкое ;)
    Ответ написан
  • Ошибка Cannot set property 'onclick' of null?

    dollar
    @dollar
    Делай добро и бросай его в воду.
    let selectAllButton = document.querySelector('.btn_done');
    
    if (!selectAllButton) {
    	alert('Реально fuck');
    	alert('Подождём чуть');
    	setTimeout(e=>{
    		let selectAllButton = document.querySelector('.btn_done');
    		if (!selectAllButton) alert('Не, ну я так не играю. Что за нах?');
    		else alert('А щас норм. Странно.');
    	}, 1000);
    } else {
      selectAllButton.onclick = function(){
        alert('Норм');
      };
    }
    Ответ написан