Ответы пользователя по тегу JavaScript
  • Как рассчитать размеры блока с сохранением пропорций не превышая заданной ширины и высоты?

    dollar
    @dollar
    Делай добро и бросай его в воду.
    Чистая математика.

    Предлагаю такой алгоритм. Сначала считаем, превышен ли размер (по каждой оси отдельно). Если превышен, то считаем коэффициент превышения:
    2800/1000 = 2.8
    700/400 = 1.75
    Если не превышен, то коэффициент будет равен 1.
    Далее смотрим, какой из коэффициентов больше (функция Math.max). Выбираем его.
    И если он больше 1, то делим ширину и высоту прямоугольника на этот коэффициент.
    Пропорции будут примерно сохранены (после округления). И в поле тоже влезет.

    Сорри, что без кода, но ведь и в вопросе кода нет. ;)
    Ответ написан
    1 комментарий
  • Как найти все HTML элементы, попадающие в область другого элемента?

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

    Навскидку могу предложить такое решение:

    Режем экран в виде невидимой сетки. Размеры ячеек вы выбираете сами. Пусть это будет сетка 10х10 ячеек. Для каждого элемента заранее считаем, в какие ячейки он попадает. То есть каждая ячейка - это массив ссылок на элементы, которые в неё попадают.

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

    Если же юзер выбирает область побольше, которая касается уже ячеек 4х4, то элементы из внутренних ячеек автоматически попадают в результат без проверок границ.

    И, наконец, когда юзер выделяет слишком большую область, которая ложится на 9х10 ячеек, то уже выгоднее искать те прямоугольники, которые могут не попасть в результат, то есть которые в ячейках 2х10. А все оставшиеся непроверенные автоматически попадают в результат.

    Это был пример простой оптимизации, далёкой от совершенства.
    Ответ написан
    5 комментариев
  • Как правильно написать регулярное выражение?

    dollar
    @dollar
    Делай добро и бросай его в воду.
    • слова, которые не завернуты в тег
    • нет вложенных тегов

    Следовательно, нужны слова, которые:
    • либо сразу после </ ... >
    • либо сразу после < ... />
    • либо в начале строки

    Так и запишем:
    (?<=<\/[^<>]+>|<[^<>]+\/>|^)([^<>]+)
    https://regex101.com/r/6OliJi/1

    P.S. Отдельные слова

    (?<=(?:<\/[^<>]+>|<[^<>]+\/>|^)[^<>]*)([a-zа-яё-]+)

    https://regex101.com/r/HT9qs6/1
    Ответ написан
    4 комментария
  • Каким образом можно сделать ровную табуляцию в строке?

    dollar
    @dollar
    Делай добро и бросай его в воду.
    Каким образом можно сделать ровную табуляцию в строке?

    Это можно сделать способом, который обычно называют "в лоб". То есть по сути просто взять и сделать, потому что здесь нет каких-либо сложностей даже для начинающего программиста. Проблема отсутствует, как таковая.

    Не справиться может только ленивый, который желает переложить всю работу на плечи другого человека, либо несведущий в программировании человек. Судя по тому, что вы приводите код, вы всё же имеете какое-то отношение к программированию, пытаетесь сами что-то делать. Следовательно, это не второй, а первый вариант - лень.

    Очень жаль.

    При самостоятельном решении, когда задача кажется слишком сложной, её нужно разбивать на подзадачи (как бы этапы), каждая из которых уже по силам, а если нет, то дальше дробить на ещё более мелкие подзадачи. Этот процесс называется декомпозицией - это один из ключевых навыков программистов и не только их.

    Вот, например, у вас есть подзадача:
    мне нужно как-то посчитать количество символов во всех строках

    Отлично, ведь это отдельная подзадача, которую можно изолировать и просто решить, абстрагируясь от связей с другими подзадачами (ведь это ещё успеется):
    text.split('\n').forEach(
      (s,i)=>console.log('Символов в строка №'+(i+1)+': '+s.length)
    );

    Вероятно, вам кажется, что это не совсем то, что вам нужно. Всё верно, потому что это просто пример того, как легко можно решить отдельную простую подзадачу. А учитывая все связи, это решение придётся немного модифицировать под ваши хотелки, но это уже вы сами как-нибудь.

    Предлагаю вам следующий алгоритм ваших дальнейших действий:
    • Если вы поняли код выше и легко можете написать подобный, то, как я и ответил выше, просто решайте вашу задачу в лоб. Сложную задачу разбивайте на подзадачи. Обучение вас этому навыку выходит за рамки ответа на ваш вопрос, но вы можете начать с Википедии.
    • Если вы с трудом поняли код выше или вообще ничего не поняли, но хотели бы понять, то подтяните знание самого языка. Без таких базовых понятий, как "массив" или "цикл", программировать практически не получится вообще. Объяснение основ выходит за рамки ответа на ваш вопрос, но вы можете начать с чтения учебника.
    • Если вы не хотите ни в чём разбираться, а просто хотите, чтобы вам предложили готовое решение и чтобы оно просто работало, то подтяните ваше умение формулировать, чего именно вы хотите. Текущий ваш вопрос сформулирован сумбурно, в стиле "чтобы у меня всё было, и мне за это ничего не было". При таком подходе придётся слишком долго ждать телепата 80 лвл. Лучше будет красиво, коротко и ясно объяснить детали, чтобы помочь смог любой специалист без уточняющих вопросов. Увы, объяснение принципов того, как задавать вопросы, снова выходит за рамки ответа на ваш изначальный вопрос, но вы можете начать с чтения правил этого ресурса. Хотя лаконично формулировать мысли они вас не научат. Но ведь надо же с чего-то начинать, верно?
    Ответ написан
    Комментировать
  • Как заменить %s на число?

    dollar
    @dollar
    Делай добро и бросай его в воду.
    Есть такое:
    console.log(`${s} штук`);
    console.log(`Hello ${name}`);
    Ответ написан
  • Как в appendChild засунуть html код?

    dollar
    @dollar
    Делай добро и бросай его в воду.
    var p = document.createElement("P");
    document.body.appendChild(p);
    p.innerHTML = "hello world";
    Ответ написан
    Комментировать
  • Как заменить ключи или значения в массиве?

    dollar
    @dollar
    Делай добро и бросай его в воду.
    Быстрее всего будет не создавать новых массивов и объектов, а пройтись циклом. В идеале даже функций не вызывать.
    let obj = {"key":
      [
        {"id":"key","data_1":"data1","data_2":"data2"},
        {"id":"key","data_1":"data1","data_2":"data2"},
        {"id":"key","data_1":"data1","data_2":"data2"},
      ]
    };
    
    let arr = obj.key;
    for (let i=arr.length-1; i>=0; i--) {
      let item = arr[i];
      let t = item.data_1
      item.data_1 = item.data_2
      item.data_2 = t
    }


    По сути вопрос в том, как поменять переменные x и y местами:
    let temp = x
    x = y
    y = temp
    Ответ написан
    Комментировать
  • Как в массиве чисел найти ближайшее к заданному?

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

    var nums = [110, 200, 390, 488, 509];
    var base = 220;
    
    var found_index = 0, dist = Math.abs(nums[0] - base);
    nums.forEach((e,i)=>{
      let new_dist = Math.abs(e - base);
      if (new_dist < dist) {
        dist = new_dist;
        found_index = i;
      }
    });
    
    console.log('Ответ:', nums[found_index]);
    Ответ написан
    Комментировать
  • Как сделать поля объекта как в самом объекте?

    dollar
    @dollar
    Делай добро и бросай его в воду.
    const user = {
        id: 1,
        name: 'Вася',
        age: 26
    }
    
    const users = Object.assign({},user);
    Ответ написан
    Комментировать
  • Как сделать чередование ассоциативного массива?

    dollar
    @dollar
    Делай добро и бросай его в воду.
    Как сделать чередование ассоциативного массива?

    Разбить на два ассоциативных массива.
    И в конкретном месте, где требуется чередование, брать то из одного "массива", то из другого.
    Ответ написан
    Комментировать
  • Как сохранить значение кнопки после обновления страницы?

    dollar
    @dollar
    Делай добро и бросай его в воду.
    localStorage

    Можно локально (т.е. в браузере) хранить информацию, что купон уже активирован. И не нужно будет лишний раз беспокоить БД.
    Ответ написан
    7 комментариев
  • Как составить регулярное выражение на поиск формы внутри тега "p"?

    dollar
    @dollar
    Делай добро и бросай его в воду.
    Если это js, то я бы сделал так. Сначала выбирал бы просто параграфы (слепо веря, что они не вложены) по вашей формуле:
    /<p>.*?<\/p>/g
    А дальше уже проверял бы результат на наличие формы.

    Но действительно странно, почему нельзя просто взять из DOM:
    element.querySelectorAll('p')
    Ответ написан
    Комментировать
  • Как сделать, что бы Iframe грузился после того, как загрузится весь контент сайта?

    dollar
    @dollar
    Делай добро и бросай его в воду.
    Можно попробовать не указывать src у iframe в html-коде.
    document.getElementById("iframe_id").src = "some_url";
    Ответ написан
    1 комментарий
  • Почему JS самостоятельно изменяет числа?

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

    На пальцах это выглядит примерно так. В памяти есть место для хранения целого числа, а также есть место для его порядка (степени). Размер первого места задаёт, сколько цифр может быть в числе, например 17 (но это примерно, потому что там биты, то есть число хранится в двоичной системе). Порядок же позволяет дописать очень много нулей к числу справа или слева. Количество нулей тоже не бесконечно, но очень большое, всем хватит.

    Поэтому для очень широких чисел типа такого:
    1230000000000000099999999999999999999999999999999
    невозможно сохранить все цифры в точности. Оно просто не влезает в целую часть. Приходится брать за основу какой-то отрезок из 17 цифр. Очевидно, что логичнее начинать со старших разрядов:
    12300000000000000 (17 цифр)
    Ну а дальше встаёт вопрос, что делать с младшими? Порядок (степень) можно примерно сохранить, дописав нули. И в случае, если отбрасываем .....999999, то логичнее перевести единичку в следующий разряд. Получится:
    1230000000000000100000000000000000000000000000000
    (т.е. 1.2300000000000001e+48)

    Повторюсь, это примерно, без подробностей, для общего понимания. На самом деле там куча нюансов.
    0.1 + 0.2 == 0.3 //false

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

    dollar
    @dollar
    Делай добро и бросай его в воду.
    Я так понял надо взаимодейстовать с сервером и там сохранять информацию

    Да. В момент нажатия отправить запрос на сервер и отложить реакцию до прихода ответа от сервера. На сервере же будет обычная очередность: Петя, Вася, Петя, Вася и т.д. Таким образом, какие бы ни были пинги, очерёдность будет довольно строгая. А если до сервера не удалось достучаться, то можно в качестве реакции что-то типа Radnom(Петя,Вася).
    Ответ написан
  • Как можно вставить текст в несколько input?

    dollar
    @dollar
    Делай добро и бросай его в воду.
    Можно.

    Нужно, чтобы на странице был отдельный многострочный инпут типа textarea. В него копируете таблицу, она получается в виде обычного текста с разделителями. Дальше скриптом парсите этот текст и скриптом же вставляете в отдельные input в соответствии с логикой страницы.

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

    dollar
    @dollar
    Делай добро и бросай его в воду.
    Так сделайте отладку.
    Вставьте в нужные места console.log() или хотя бы alert(), и смотрите, где какие промежуточные значения.
    Ответ написан
  • Как происходит всплытие переменной?

    dollar
    @dollar
    Делай добро и бросай его в воду.
    Всплытие происходит в начало функции (т.е. bar), где бы внутри функции вы ни объявили переменную через var.
    Ответ написан
    Комментировать
  • Как преобразовать строки в бинарный код в JS?

    dollar
    @dollar
    Делай добро и бросай его в воду.
    code = "й".charCodeAt(0)
    //1081 или 0x0439

    Далее смотрим, как кодируется UTF-8.
    Для русских букв (например, й) упрощённо:
    byteCode1 = code >> 6 | 0b11000000;
    byteCode2 = code & 0b00111111 | 0b10000000;

    Остаётся всё это склеить в одну функцию. В императивном стиле, конечно же, чтобы было понятно, что происходит:
    function StringToBin(s) {
      let arr = s.split(''); //разбиваем строку на символы
      arr.forEach((symbol, index) => { //кодируем каждый символ
        let code = symbol.charCodeAt(0);
        let byteCode1 = code >> 6 | 0b11000000;
        let byteCode2 = code & 0b00111111 | 0b10000000;
        arr[index] = (code < 128 ? code.toString(16) : byteCode1.toString(16) + byteCode2.toString(16)).toUpperCase();
      });
      return arr.join(' '); //возвращаем кодированную строку
    }
    
    console.log(StringToBin("Хай"));
    //D0A5 D0B0 D0B9

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

    dollar
    @dollar
    Делай добро и бросай его в воду.
    Почитайте конкретно про изменение документа.
    Ответ написан
    Комментировать