Задать вопрос
Ответы пользователя по тегу JavaScript
  • Как работает остаток от деления в js?

    dollar
    @dollar
    Делай добро и бросай его в воду.
    Есть ли какой-то набор задач на %, чтобы уверенно освоиться в использование сего оператора.

    Вот пример(ы) для освоения:
    for(let i=0; i<=65; i++) {
      console.log(i + ' % 26 == ', i % 26);
    }

    Запустите в консоли, и сразу станет легко осваиваться.
    Ответ написан
    1 комментарий
  • Как правильно использовать if else?

    dollar
    @dollar
    Делай добро и бросай его в воду.
    Скобки обязательны:
    if (условие) действие;

    Если больше одного действия, то они оформляются в блок:
    if (условие) { действие; действие; }

    С else всё то же самое, только нет условия.
    if (условие) действие; else действие;

    Хотя в качестве действия снова может быть ветвление. Каждое условие в скобках, иначе интерпретатор не сможет понять, где кончается условие и начинается действие.
    if (условие) действие; else if (условие) действие;
    Ответ написан
    Комментировать
  • Не виден игрок в js почему а?

    dollar
    @dollar
    Делай добро и бросай его в воду.
    Потому что вы новичок в таких темах, как JavaScript и HTML.
    Тег <script> должен быть обязательно закрыт тегом </script>, остальное не так критично.

    Судя по тому, что HTML-код отформатирован, а JS - нет, вы скопировали эту "игру" откуда-то из Интернета и просто пытаетесь ее запустить.

    Лучше попробуйте не запускать готовый скрипт, а писать его самостоятельно маленькими шагами. Сначала скрипт типа Hello World, потом скрипт, который реагирует самым простым образом на единственную клавишу (в будущем это будет система управления) и так далее. Так вы сможете понять, что происходит. Иначе любой баг будет вызывать ступор и непонимание, и желание обратиться за помощью на Тостер.

    Кроме того, когда вы делаете маленькое изменение, и у вас скрипт перестает работать, то вы даже без отладки будете понимать, где у вас ошибка. Очевидно, в тех изменениях, которые вы сделали последними. Если вы добавили одну строку кода, то проблема в ней. А может и не в ней, но если ее убрать, то проблемы не будет. В любом случае, найти ошибку проще.
    Ответ написан
    Комментировать
  • Посчитать сумму всех элементов от A до B? A может быть > B и < B?

    dollar
    @dollar
    Делай добро и бросай его в воду.
    Нужно просто добавить немного уличной магии. И всё заработает!
    function GetSum(a, b) {
      if (b < a) { a = a + b; b = a - b; a = a - b; } //магия
      var total = 0;
      for(var i = a; i <= b; i++){
        total += i;
      }
      return total;
    }
    Ответ написан
    2 комментария
  • Как написать фильтрацию массива чисел?

    dollar
    @dollar
    Делай добро и бросай его в воду.
    Array.filter()
    var arr = [
      { num: 10 },
      { num: 15 },
      { num: 31 },
    ];
    var FILTER_MASK = 0b1111;
    var new_arr = arr.filter(e => e.num & FILTER_MASK == FILTER_MASK);
    console.log(new_arr);
    Ответ написан
    5 комментариев
  • Почему не работает функция прототипа valueOf?

    dollar
    @dollar
    Делай добро и бросай его в воду.
    Согласно спецификации:
    1. Сначала JS честно пытается вызывать valueOf.
    2. И находит его, но не в объекте, а в прототипе. И тот valueOf устроен очень просто - возвращает сам объект.
    3. Далее происходит проверка на примитивность результата. Если да, то этот результат и будет использован. Но user2 - это объект, и он явно не примитивен, так что JS переходит к следующему шагу.
    4. А следующий шаг - проверить метод toString. Если он есть, и это функция, то взывать его.
    5. Потом также смотрим, что он вернул. Здесь ваш метод возвращает 10, то есть число, а это примитивный тип.
    6. Таким образом, этот результат и возвращается и передается для дальнейшей обработки оператором +.
    7. Последний шаг редко срабатывает. До него доходит очередь, если даже toString не смог вернуть примитив. В этом случае произойдет исключение.


    Иногда всё же можно добиться исключения, но это надо постараться. Пример:
    let o={toString:e=>e=>1}; //Переопределить toString, чтобы убрать строку
    console.log(+o);
    Ответ написан
    Комментировать
  • Как проверить, что у массивов есть одинаковые элементы?

    dollar
    @dollar
    Делай добро и бросай его в воду.
    У вас они не ассоциативные в примере.

    Если задача сравнить именно их, то эффективнее будет превратить один из них в ассоциативный (то есть в объект) и далее просто пробежаться по свойствам второго. Сложность алгоритма O(2*N) получается.
    function compare(arr1, arr2) {
      let obj1 = {}; //Превращаем arr1 в ассоциативный obj1.
      arr1.forEach(e=>obj1[e]=true);
      return arr2.some(e=>e in obj1);
    }
    console.log(compare(arr1, arr2)); //Результат
    Ответ написан
  • Как доработать данный код?

    dollar
    @dollar
    Делай добро и бросай его в воду.
    function removePreloader(){
      if (removePreloader.done) return;
      removePreloader.done = true;
      $('.preloader-wrapper').delay(100).fadeOut('slow');
      $('body').addClass('siteloaded');
    }
    
    $(window).on('DOMContentLoaded', function () {
      removePreloader()
    });
    
    setTimeout(removePreloader, 2000);
    Ответ написан
    3 комментария
  • Как закрыть XMLHttpRequest от общего доступа?

    dollar
    @dollar
    Делай добро и бросай его в воду.
    В дополнение к Сергей Соколов могу подсказать следующий этап: защита от кражи сессии. Это делается путем нумерации запросов. То есть каждый запрос передается число, которое на 1 больше предыдущего. Так что даже если кто-то украдет сессию и сможет ее использовать, у пользователя она протухнет и вы сможете показать ему ошибки рассинхронизации. И уже сам пользователь начнет искать злоумышленника.

    Хотя если сам пользователь является злоумышленником, причем умным и упёртым, то понадобится дальше наращивать защиту. Но это уже война снаряда и брони, а она, как известно, вечная, и выигрывает тот, у кого больше ресурсов и терпения.
    Ответ написан
    Комментировать
  • Много обещаний в ожидании?

    dollar
    @dollar
    Делай добро и бросай его в воду.
    Будет плохой дизайн кода.
    spoiler
    Насколько я помню, V8 падает, когда память JS превышает 2 Гб.
    Ответ написан
    Комментировать
  • Как вычесть из сегодняшней даты 3 дня и сравнить с условной датой, и если до условной даты остается 3 дня то выдать сообщение?

    dollar
    @dollar
    Делай добро и бросай его в воду.
    function check(str) {
    	if (new Date(str) - new Date() > 86400000 * 3)
    		console.log('У тебя ещё есть 3 дня.');
    	else
    		console.log('Времени почти не осталось.');
    }
    
    check('2019-11-14T09:07:02.376+00:00');
    Ответ написан
    2 комментария
  • Как ограничить область перемещения элемента при событии mousemove?

    dollar
    @dollar
    Делай добро и бросай его в воду.
    Нужно посчитать границы области, где можно перемещаться. Это будут минимумы и максимумы координат. Ну и размеры элемента тоже понадобятся.

    Далее в коде в том месте, где вы меняете координаты, делать соответствующий сравнения. Типа такого:
    if (x > max_x - obj_width) x = max_x - obj_width;
    if (x < min_x) x = min_x;
    Ответ написан
    3 комментария
  • Как запретить выполнение function()?

    dollar
    @dollar
    Делай добро и бросай его в воду.
    Хак с заменой
    function play_sound_1(){
      var audio1 = new Audio ('audio/1.mp3'); 
      audio1.autoplay = true;    
      play_sound_2 = e => {};
    }
    
    function play_sound_2(){
      var audio2 = new Audio ('audio/2.mp3');
      audio2.autoplay = true;  
      play_sound_1 = e => {};
    }
    Внешняя переменная
    var is_sound_played = 0;
    
    function play_sound_1(){
      if (is_sound_played === 2) return;
      is_sound_played = 1;
      var audio1 = new Audio ('audio/1.mp3'); 
      audio1.autoplay = true;    
    }
    
    function play_sound_2(){
      if (is_sound_played === 1) return;
      is_sound_played = 2;
      var audio2 = new Audio ('audio/2.mp3');
      audio2.autoplay = true;  
    }
    Ответ написан
  • Цикл по объектам внутри объекта. Как сделать?

    dollar
    @dollar
    Делай добро и бросай его в воду.
    this работает только внутри функции.
    Плюс нужно перечитать документацию о том, как работает перебор свойств объекта в js:
    а) for..in б) Object.keys() в) Object.entries()

    Работающий вариант примерно такой:
    for (let key_a in data) {
    	let input_object = data[key_a];
    	for (let key_b in input_object) {
    		let obj_b = input_object[key_b];
    		if (obj_b.value > 0) {
    			console.log(obj_b);
    		}
    	}
    }
    Ответ написан
  • Как отфильтровать по инпутам-чекбоксам массив элементов с помощью метода filter?

    dollar
    @dollar
    Делай добро и бросай его в воду.
    Не понятно, что именно вы хотите. То есть какую проблему вы решаете.
    Ловить события можно примерно так:
    https://jsfiddle.net/ayc2ekj0/
    Ответ написан
    Комментировать
  • Не работает querySelectorAll?

    dollar
    @dollar
    Делай добро и бросай его в воду.
    Результат querySelectorAll - это как бы массив.
    document.querySelectorAll('.div2')[0].style.width
    Ну и селектор не "div2", а ".div2", ибо нужно выделить класс.
    Ответ написан
    6 комментариев
  • Как бороться с десятичными числами(Decimal)?

    dollar
    @dollar
    Делай добро и бросай его в воду.
    Самый надежный способ - использовать только целые числа для внутреннего представления. Особенно актуально для валют.
    А уже при выводе в интерфейс пользователя делить на 100 или иным хитрым способом вставлять точку.
    Ответ написан
  • Google Таблицы. Как избежать ошибки "Максимальное количество символов в одной ячейке: 50000"?

    dollar
    @dollar
    Делай добро и бросай его в воду.
    парсер контента сайта в скриптах Google таблиц

    Вот это и есть главная ошибка.

    Арендуйте себе хостинг за 12 рублей в месяц (php+mysql), и запускайте там скрипты без ограничений. Так вы гораздо больше сэкономите на нервах и времени. А скупой, как известно, платит дважды.
    Ответ написан
    1 комментарий
  • Как отфильтровать объект по массиву значений свойств?

    dollar
    @dollar
    Делай добро и бросай его в воду.
    Нужно инвертировать (преобразовать) массив в ассоциативный массив, дальше всё просто:
    var a = {
    	photo: 'фото',
    	video: 'видео',
    	img: 'рисунок'
    };
    
    var b = ['фото','видео'];
    
    function my_filter(obj, arr) {
    	let assoc = {}; //Ассоциативный массив, чтобы проверка была быстрой.
    	arr.forEach(e=>assoc[e]=1);
    	let result = {};
    	for (let prop in obj) {
    		if (assoc[obj[prop]]) result[prop] = obj[prop];
    	}
    	return result;
    }
    
    var filtered = my_filter(a, b);

    Если есть возможность формировать массив b изначально, как ассоциативный (то есть в виде объекта), то лучше так делать, чтобы скрипт быстрее работал на больших данных.
    Ответ написан
    Комментировать
  • Как обернуть объект в тег span, например?

    dollar
    @dollar
    Делай добро и бросай его в воду.
    countdowntimer.innerHTML = "<span>" + formated + "</span>";
    Ответ написан
    Комментировать