Ответы пользователя по тегу JavaScript
  • Как в WordPress реализовать выдвижное меню?

    @Smirator
    Привет! Разбей задачу по этапно, чтобы понять, что тебе нужно.
    Тут нет привязки к WordPress или другой CMS-системе. Тебе нужно думать в JavaScript.
    Если это JavaScript, то нужно понять, что это за функционал, разбив его на составляющие:
    1) Меню выходит только в случае, если на него навели. Ага, значит, нужен функционал в JS, который отслеживает наведение. Об этом можно почитать тут: https://learn.javascript.ru/mousemove-mouseover-mo...
    2) Отлично, у JS есть из коробки функционал, отслеживающий наведение. Значит, переходим к этапу хранения меню. Тебе нужен какой-то контейнер, в котором будет лежать меню, которое будет находиться за пределами видимости. Навскидку это может быть отрицательный марджин.
    3) Убрав контейнер со своим меню нужно все это дело подружить друг с другом. Пишешь скрипт, который будет отслеживать наведение на область (нужную тебе) и отслеживаешь это. Когда действие происходит ты выдвигаешь меню. Это можно сделать анимированными свойствами в CSS и игрой с уменьшением марджина в JS.

    Собрав такой функционал уже можно задуматься о том, чтобы подружить его с WP.
    Если в код не можешь, то уже это описание можешь попробовать закинуть в нейронку и посмотреть, что она выдает.
    Ответ написан
  • Как разбить строку по знаку?

    @Smirator
    Привет.
    Воспользоваться регулярными выражениями.
    Если правильно понял твою задачу, то в твоем случае должно быть: /,(?!\s*")/

    const string = "a,b",a b,,,,,,,,,,,,,,,,,,,
    const cells = string.split(/,(?!\s*")/);
    console.log(cells);
    ////
    [
      "a,b",
      "a b",
      "",
      "",
      "",
      "",
      "",
      "",
      "",
      "",
      "",
      "",
      "",
      "",
      "",
      "",
      "",
      "",
      "",
      "",
      "",
      ""
    ]
    Ответ написан
  • Как правильно написать алгоритм чтобы менять данные в массиве?

    @Smirator
    Привет, не смотря на то, что твой вопрос это не вопрос, а ТЗ, попробуй так:

    function updateBookCounterAndStatus(selectedBookId, booksArray) {
      for (let i = 0; i < booksArray.length; i++) {
        if (booksArray[i].book_id === selectedBookId) {
          if (booksArray[i].counter > 0) {
            booksArray[i].counter--;
            if (booksArray[i].counter === 0) {
              booksArray[i].isBookAccepted = true;
            }
            break; // прекратили перебор
          }
        }
      }
    }
    
    // Вызываем:
    updateBookCounterAndStatus(selectedBook, books);
    console.log(books);
    Ответ написан
    Комментировать
  • Как поменять текст элемента внутри блока?

    @Smirator
    Привет. Примерно так:
    // Получаем <span>
    const firstSpan = document.querySelector('.box span:first-of-type');
    
    // Изменяем текст внутри <span>
    firstSpan.textContent = 'Новый текст для Текст 1';
    Ответ написан
    Комментировать
  • Как проверить, что строка может быть приведена к числу?

    @Smirator
    Привет. Неправильно используешь isNan().
    Попробуй такой вариант:
    let num = Number(prompt('Пожалуйста, введите любое число'));
    
    if (isNaN(num)) {
      alert('Введите число');
    } else {
      if (num % 2 === 0) {
        alert('Число четное');
      } else {
        alert('Число нечетное');
      }
    }


    Cначала проверим, является ли значение числом с помощью isNaN(num). Если значение не число, то выводим "Введите число". Если число, то проверим четность.
    Ответ написан
    Комментировать
  • Можно ли проверить, был ли вызов функции из devtools?

    @Smirator
    Привет. В целом надо понимать, что абсолютно обезопасить свой код от вызова из инструментов разработчика не получится, можно скрыть, но назвать это эффективным подходом тоже нельзя.
    Можно попробовать: IIFE (с пониманием того, что IIFE - это изживший себя способ вызова функций, рекомендую почитать о нем ), он должен скрыть код из глобального контекста и скорее всего достучаться к нему через инструменты будет невозможно.

    (function() {
      // код
      function secretFunction() {
        console.log("Секрет!");
      }
      // код продолжается
    })();
    Ответ написан
    7 комментариев
  • Как решить проблему с кодировкой при чтении Excel файла?

    @Smirator
    Привет. Есть сомнения, но кажется, что кириллица не поддерживается из-за того, что не задана нужная кодировка.
    Как понимаю, в вашем коде за это отвечают: xlsx.write и xlsx.read.

    Я бы попробовал поменять

    const htmlStr = xlsx.write(wb, { type: "binary", bookType: "html", cellStyles: true, });


    на:
    const htmlStr = xlsx.write(wb, { type: "binary", bookType: "html", bookSST: true, cellStyles: { dateNF: 'YYYY-MM-DD HH:mm:ss', }, type: "base64", });


    и
    const wb = xlsx.read(data, { type: "array", });

    на:
    const wb = xlsx.read(data, { type: "array", cellStyles: true, });


    Теперь для кириллических символов должна применятся utf-8. После проверки отпишитесь, пожалуйста. Самому интересно)
    Ответ написан
  • Как при вставке из буфера текста удалить блок div?

    @Smirator
    Нужно отследить вставку.

    $('body').on('paste',function(e) {
        //тут удаляем див
    });
    Ответ написан
    Комментировать
  • Как правильно/красивее написать код js?

    @Smirator
    В JavaScript придерживаются идеи модульности. Вы создали десять условных функций в начале кода, а затем используете их по мере необходимости. Под вашу задачу на скорую руку набросал два варианта:

    // Для одиночного элемента:
    let div = document.getElementById('div');
    
    function addClass(el, event, className){
        el.addEventListener(event, function(){
            el.classList.add(className);
        });
    };
    
    addClass(div, 'click', 'test'); //функцию вызываем в любом нужном месте. Передаем название переменной, событие и класс
    
    // Для массива элементов:
    let elClass = Array.from(document.querySelectorAll('.elClass'));
    console.log(elClass);
    
     function adClassArr(targetArr, event, className) {
        targetArr.forEach(target => target.addEventListener(event, function(){
            target.classList.add(className);
        }));
    }
    
    
    adClassArr(elClass, 'click', 'test'); //функцию вызываем в любом нужном месте. Передаем название переменной, событие и класс
    Ответ написан
  • Как сравнить между собой несколько массивов и найти сходства и различия?

    @Smirator
    Нельзя просто так сравнивать массивы.
    Нужно преобразование в строку. Например, так:

    const compareArrays = (a, b) => {
      return JSON.stringify(a) === JSON.stringify(b);
    };
    
    let array1 = [11, 22, 33];
    let array2 = [21, 22, 23];
    let array3 = [11, 22, 33];
    
    console.log(compareArrays(array1, array2)); //false
    console.log(compareArrays(array1, array3)); //true


    Или так:
    let array1 = [11, 22, 33];
    let array2 = [11, 22, 33];
    
    console.log(array1.toString() === array2.toString()); //true


    Если массивов много и их нужно постоянно сравнивать, то можно создать отдельную функцию для этого. Это будет самый правильный вариант из предложенных.
    Вот:
    const compareArrays = (a, b) => {
      return a.toString() === b.toString();
    };
    
    let array1 = [11, 22, 33];
    let array2 = [21, 22, 23];
    let array3 = [11, 22, 33];
    
    console.log(compareArrays(array1, array2)); //false
    console.log(compareArrays(array1, array3)); //true


    Сделаю оговорку, что это не единственный способ сравнения. Можно использовать еще метод every() или цикл for(). Под ваш вопрос, мне показалось, наиболее правильным преобразование в строковый формат.
    Ответ написан
  • Почему метод push не вызывается внутри в функции?

    @Smirator
    Вероятно, потому что, его там нет?
    const add = document.querySelector('.add');
    
    let arr = ['hello', 32, 'tank'];
    
    add.onclick = function() {
       for(let i = 0; i < arr.length; i++) {
        arr[i] = 4
        arr.push('Тестовый элемент');
       }
    }
    console.log(arr)
    Ответ написан
  • Почему indexOf возвращает первый элемент массива?

    @Smirator
    Вчера разбирался с похожим функционалом.
    Мой вопрос тут: https://qna.habr.com/q/1244998
    Ответ написан
    Комментировать
  • Как создать эффект печатающегося текста (js)?

    @Smirator
    Приветствую, так?

    <pre></pre>

    body {
      background: #fff;
      color: #000;
      font-family: monospace;
      font-size: 24px;
    }


    const text = [
      'Ты у меня одна,\n',
      'Словно в ночи луна,\n',
      'Словно в году весна,\n',
      'Словно в степи сосна.\n'
    ];
    
    
     let line = 0;
      let count = 0;
      let result = '';
      function typeLine() {
        let interval = setTimeout(
          () => {
            result += text[line][count]
            document.querySelector('pre').innerHTML =result +'|';
    
    
          count++;
          if (count >= text[line].length) {
            count = 0;
            line++;
            if (line == text.length) {
              clearTimeout(interval);
               document.querySelector('pre').innerHTML =result;
              return true;
            }
          }
          typeLine();
        }, getRandomInt(getRandomInt(250*2.5)))
      }
      typeLine();
    
    function getRandomInt(max) {
      return Math.floor(Math.random() * Math.floor(max));
    }
    Ответ написан
    Комментировать