Ответы пользователя по тегу JavaScript
  • Почему не получается изменить значение переменной?

    lastuniverse
    @lastuniverse
    Всегда вокруг да около IT тем
    потому что в строчке
    рopatos_num = popatos_num + 1;
    вы в имени переменной перед знаком равно допустили ошибку. Одна из букв имени набита в русской раскладке (скорее всего p или o или a)
    Ответ написан
    3 комментария
  • Script.js:17 Uncaught TypeError: Cannot read property 'replaceChild' of null?

    lastuniverse
    @lastuniverse
    Всегда вокруг да около IT тем
    "Уважаемый" автор вопроса, вам на почти)))) человеческом, английском языке, пишет:
    Cannot read property 'replaceChild' of null
    что переводится:
    гугл переводчик - Не удается прочитать свойство 'replaceChild' из null
    яндекс переводчик - Не удается прочитать свойство 'replaceChild' из null

    смотрим внимательно: Ни как не могу прочитать свойство 'replaceChild' из якобы объекта если оно ни хрена не объект а null.

    Может быть JS ошибся? Проверим:
    console.log(document.parentNode) // выведет null

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

    И видим что:
    Каждая веб-страница, которая загружается в браузер, имеет свой собственный объект document. Интерфейс документа служит точкой входа для получения содержимого веб-страницы (всего DOM - дерева...)

    То есть document содержит всю веб страницу (все что включает тэг body).
    ЭТОГО НЕ МОЖЕТ БЫТЬ, А КАК ЖЕ СВОЙСТВО ПАРЕНТ????? (скажете вы)
    Чтобы Вас убедить предложу прокрутить по ссылке document чуть вниз и посмотреть какие есть свойства и методы у document. Теперь Вам должна быть понятна причина появления ошибки:
    Uncaught TypeError: Cannot read property 'replaceChild' of null
    Ответ написан
  • Как сделать скрипт массовой замены текста?

    lastuniverse
    @lastuniverse
    Всегда вокруг да около IT тем
    Вот вариант, он рабочий но далеко не оптимален.
    Ответ написан
  • Какая нужна регулярка чтобы проверка проходила на номера одного оператора?

    lastuniverse
    @lastuniverse
    Всегда вокруг да около IT тем
    Одной регуляркой тут делать не правильно на мой взгляд, поэтому демонстрирую подход максимально развернуто.

    Для начала ознакамливаемся с международным форматом телефонных номеров

    А после немного кодим
    // функция разбирает телефонный номер на части и возвращает их для проверки
    function parsePhoneNumber(phoneNumberAsText){
      // через парамерт phoneNumberAsText функция получает текст содержащий номер телефона
      // предположим что обрабатываемое текстовое представление номера телефона
      // может принимать следующий вид (и имеет принадлежность к РФ):
      // "+7 (999) 888-77-55"
      // "8 (999) 888-77-55"
      // "+7 999 888-77-55"
      // "+7999888-77-55"
      // "+799988-777-55"
      // "+799988-77-555"
      // "+79998887755"
      // "89998887755"
      // и т.д.
    
    
      // убираем из него все лишнее
      var phone = "+"+phoneNumberAsText.replace(/^8/,"+7").replace(/[^0-9]/,""); 
    
      // составляем регулярку на основе международного формата телефонных номеров
      var re = /^(\+\d)(\d{3})(\d{7})$/;
    
      // получаем составные части нашего телефонного номера
      var [phone, country, code, number] = phoneNumber.match(re);
      // где:
      // phone - номер телефона в формате "+79998887766"
      // country - код страны (фикция, данный код будет работать для РФ и еще пары стран, поэтому считаем что тут всегда "+7")
      // code - трехзначный код региона/оператора
      // number - семизначный номер телефона в регионе/у оператора
    
      // возвращаем полученный результат разбора номера
      return {
        phone: phone, 
        country: country,
        code: code,
        number: number
      };
    }
    
    // парсим номер "8 (999) 888-77-66"
    var result = parsePhoneNumber("8 (999) 888-77-66");
    
    // на выходе в result получим объект вида
    // { phone: "+79998887766", country: "+7", code: "999", number: "8887766" }
    
    // предположим что у вас есть массив с нужными вам кодами регионов/операторов
    // allowCodes = ["999", "998" и т.д];
    
    // смотрим совпадает ли код региона/оператора с одним из кодов в allowCodes
    if( allowCodes.indexOf(result.code) ){
       console.log("Номер "+result.phone+" принадлежит искомой группе/региону/оператору")
    }else{
      console.log("Номер "+result.phone+" НЕ принадлежит искомой группе/региону/оператору")
    }
    Ответ написан
  • Can't set headers after they are sent?

    lastuniverse
    @lastuniverse
    Всегда вокруг да около IT тем
    думаю проблема тут:
    fs.writeFile(fullPath, base64Image, { encoding: 'base64' }, err => {
                if (err) return res.status(500).send(`Ошибка сохранения файла: ${err}`)
                else return
            });


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

    попробуйте заменить этот код на:
    const promise = new Promise(resolve, reject)=>{
       fs.writeFile(fullPath, base64Image, { encoding: 'base64' }, err => {
          if (!err) return resolve(true);
          
          res.status(500).send(`Ошибка сохранения файла: ${err}`)
          return reject(false);
       });
    });
    const isWrite = await promise;
    if(!isWrite) return;
    Ответ написан
    2 комментария
  • Почему валидация сработала не так как задумывалась?

    lastuniverse
    @lastuniverse
    Всегда вокруг да около IT тем
    Это не совсем ответ на ваш вопрос, просто упрощенная демонстрация подхода
    https://jsfiddle.net/t973546n/2/

    Если надо глубже и больше гуглите "jsonschema validate"
    Ответ написан
    2 комментария
  • Как регуляркой проверять на пустоту?

    lastuniverse
    @lastuniverse
    Всегда вокруг да около IT тем
    Регулярка: /^$/

    Пример:
    var str1 = "";
    var str2 = "qwerty";
    var re=/^$/;
    
    console.log( re.test(str1) ); // true
    console.log( re.test(str2) ); // false
    Ответ написан
    4 комментария
  • Как исправить данную ошибку?

    lastuniverse
    @lastuniverse
    Всегда вокруг да около IT тем
    Ошибка говорит о том, что el.changelog не определен

    Покажите что выводит в консоль команда console.log(el);
    Ответ написан
  • Что делают эти строки в коде?

    lastuniverse
    @lastuniverse
    Всегда вокруг да около IT тем
    Эту строчку можно упростить
    Заменив
    slideIndex = (slideIndex + slides.length + n) % slides.length;

    На
    slideIndex = (slideIndex + n) % slides.length;

    Про упрощение обманул, как заметил 0xD34F в своем ответе добавление slides.length нужно для приведения номера слайда к легитимному диапазону в случае если он отрицательный.

    Сама строка просто перелистывает на n слайдов вперед. Делается это так:
    К номеру текущего слайда добавляется число слайдов на которые надо перескочить вперед а затем, на случай если полученный новый номер текущего слайда больше числа слайдов находим остаток от деления полученного номера на общее число слайдов

    В этой строчке

    slideIndex = n % slides.length;
    Просто выставляется новый номер текущего слайда а на случай если он больше числа слайдов находим остаток от его деления на общее число слайдов
    Ответ написан
    8 комментариев
  • Как сделать автовоспроизведение аудио?

    lastuniverse
    @lastuniverse
    Всегда вокруг да около IT тем
    Мой вам совет. Не стоит делать на странице автозапуск музыки, это отталкивает людей. На крайний случай поставьте програмно громкость на "очень тихо" чтобы при заходе на страницу людям не било в уши из всех колонок и саббуфера.

    ЗЫ: вы даже не представляете сколько за сегодняшнюю ночь людей матюкнется в мой адрес за то что кинутая мной в ответе демка запускает музон))))


    Ответ написан
  • Как массив привести к объекту?

    lastuniverse
    @lastuniverse
    Всегда вокруг да около IT тем
    const arr = ["title", "Как объединить js файлы в pug?"], ["my_meta_key", "111"], ["my_meta_key_2", ""],["my_meta_key_3", ""];
    
    const obj = arr.reduce((a,e)=>{ a[e[0]]=e[1]; return a;},{});
    Ответ написан
    Комментировать
  • Почему не получаю ожидаемый результат в данном примере?

    lastuniverse
    @lastuniverse
    Всегда вокруг да около IT тем
    для таких задач принято использовать getter-ы и setter-ы

    https://learn.javascript.ru/getters-setters
    https://learn.javascript.ru/descriptors-getters-setters

    вот немного кривоватый но рабочий вариант:
    // Create global object class
    let Obj = function (	name,  power )  {   	      
      this.name = name;
      this.power = this._power = power;
    };
    
    
    
    // Create character class
    let Char = function (	name, power, weapon ) {  
      Obj.apply(this, arguments);
    
      this.weapon = weapon;
    
      this.x_power  = power + weapon._power;
      
      Object.defineProperty(this, "power", {
        set: function(value) {
        /* console.log("!!!!!") */
            this._power = value;
            this.x_power  = this._power + this.weapon._power;
        },
        get: function(){
        	  return this._power;
        }
    
      });  
    }
    
    
    
    // Create weapon
                      
    let Club = new Obj("Дубина",  2 ); // 
    
    // Create character 
    // 
    let Player = new Char("Char", 1,  Club);
    
    console.log(Player.power); // Ожидаю получить 1 - Получаю!
    
    console.log(Player.x_power); // Ожидаю получить 3 - Получаю!
    
    Player.power = 5; // Изменяю power 
    console.log(Player.power); // Ожидаю получить 5 - Получаю!
    console.log(Player.x_power); // Ожидаю получить 7 (как power + weapon.power), но мои ожидания не оправдываются: Получаю 3.
    Ответ написан
  • Как получить скобки внутри которой запятая (regex)?

    lastuniverse
    @lastuniverse
    Всегда вокруг да около IT тем
    var text = "(text) Lorem Ipsum is simply dummy, (text, simply) and (text, simply, qwerty) typesetting industry. Lorem Ipsum has been the[/m]";
    
    let result = text.match(/\([^)]+?(,[^)]+)+\)/g);
    
    console.log(result); // [ "(text, simply)", "(text, simply, qwerty)" ]


    Извините, лишнюю скобочку поставил, уже исправил.
    Ответ написан
    Комментировать
  • Почему теряется контекст экземпляра класса?

    lastuniverse
    @lastuniverse
    Всегда вокруг да около IT тем
    Потому что он используется как мидлваре.
    Вызывайте его привязывая контент, както так

    const Authorized = require('../moduls/authorized')
    const auth = new Authorized();
    
    
    // так
    router.get("path/",auth.isAuthorized.bind(auth));
    // или так
    router.get("path/",(...a)=>auth.isAuthorized(...a));

    и еще кучей способов

    вот, можете почитать про Привязка контекста к функции

    а еще лучше измените метод isAuthorized примерно так:
    isAuthorized(){
       return (req, res, next)=>{
          console.log('isAuth',this)
          // тут код мидлвара
      }
    }


    и используйте его так
    router.get("path/",auth.isAuthorized());
    // или
    router.post("path/",auth.isAuthorized());
    // или
    router.use(auth.isAuthorized());
    Ответ написан
    1 комментарий
  • Как взять весь объект, но менять у него только одно свойство?

    lastuniverse
    @lastuniverse
    Всегда вокруг да около IT тем
    Нет уверенности что я правильно понял вопрос, но могу предложить такой вариант:
    const obj = {
      sv1 : 'a',
      sv2: 'b',
      sv3: 'c'
    }
    
    if( obj.hasOwnProperty("sv") ) obj.sv = 'z';
    
    const arr = [obj];


    если все же понял не верно, то опишите суть подробнее.
    Ответ написан
    Комментировать
  • Как сбросить запрос на сервер?

    lastuniverse
    @lastuniverse
    Всегда вокруг да около IT тем
    ...
    document.querySelector('#translate_btn').addEventListener('click', function(){
      var word = document.getElementById("translate_form"); //поле ввода слова
    
      // добавьте эти две  строчки!!!!!
      if( !word.value ) return;
      url = 'https://translate.yandex.net/api/v1.5/tr.json/translate';
    
    
      var langTranslate = document.querySelector('.lang_list');//выбор языка перевода
      var translate = document.querySelector('.translate');//блок, куда вставляется перевод
      var translate = document.querySelector('.translate');//блок, куда вставляется перевод
      var req = new XMLHttpRequest();
    
    ...
    Ответ написан
    Комментировать
  • Как передать переменную в анонимную функцию?

    lastuniverse
    @lastuniverse
    Всегда вокруг да около IT тем
    var button = document.getElementsByName('but');
    for(let i = 0; i < button.length; i++) {
       button[i].addEventListener('change', function() {        
          document.getElementById('aaa').innerHTML = 
          button[i].value;
       });
    }
    Ответ написан
    Комментировать
  • Запутался в замыкании + обертка, разбермся?

    lastuniverse
    @lastuniverse
    Всегда вокруг да около IT тем
    Тут все просто:
    ...
    
    function delay(func, timeOut) {
        // при вызове delay(func, timeOut) мы создаем анонимную функцию и возвращаем ее
        // но при этом внутри нее мы обращаемся к переданному параметру func 
        // создавая тем самым замыкание на него
        return function() {
            // внутри возвращаемой анонимной функции мы запускаем таймер
            // которому передаем параметр func являющейся функцией, определенной 
            // где то вовне этот таймер выполнит func но при этом внутри самой func 
            // уже будет не видны параметры переданные для анонимной функции. 
            // Внутри анонимной функции эти параметры можно получить через arguments.
            // Тля того, чтобы func могла получить к ним доступ, мы используем apply, 
            // привязывая к func контент вызова анонимной функции и ее arguments
            // тем самым создавая замыкания к this и arguments анонимной функции
            setTimeout(func.apply(this, arguments), timeOut);
            // как правильно подсказал @bingo347, эту строчку надо немного переписать
            setTimeout(func.bind(this, ...arguments), timeOut);
        }
    }
    
    // примерно того же эффекта можно было добиться следующим кодом
    function delay(func, timeOut) {
        return function(text) {
            setTimeout(()=>func(text), timeOut);
        }
    }
    
    // можно даже добиться не примерно такого, а точно такого же эффекта
    // (за исключением привязки контекста анонимной функции через this
    // который влияет лишь на возможность обратится непосредственно
    // к методам и свойствам самой анонимной функции, которых в вашем
    // примере не объявлено ))) 
    function delay(func, timeOut) {
        return function(...args) {
            setTimeout(()=>func(...args), timeOut);
        }
    }
    ...


    по теме:
    arguments
    apply

    PS: но ваш способ с учетом поправок от Дмитрий Беляев (как и мой второй способ) правильнее, потому что позволяет не переписывая функцию delay делать так:
    function f(argument1, argument2) {
        alert(argument1 + " " + argument2);
    }
    let f1000 = delay(f, 1000);
    f1000("1111", "2222"); // показывает "1111 2222" после 1000 мс


    и так:
    function f(argument1, argument2, argument3) {
        alert(argument1 + " " + argument2 + " " + argument3);
    }
    let f1000 = delay(f, 1000);
    f1000("1111", "2222", "3333"); // показывает "1111 2222 3333" после 1000 мс


    и так далее ))))
    Ответ написан
    1 комментарий
  • Почему touchmove несколько раз выполняет функцию?

    lastuniverse
    @lastuniverse
    Всегда вокруг да около IT тем
    Так происходит потому, что вы при каждом выполнении события явно или неявно снова вешаете обработчик события touchmove. Покажите ваш код (место где вы вешаете обработчик и сам обработчик)
    Ответ написан
    5 комментариев