Ответы пользователя по тегу JavaScript
  • Можно ли избавиться от setInterval?

    @alexalexes
    Геттеры и сеттеры.
    Только если ваша переменная является свойством объекта, тогда вы можете задать свою set-функцию, которая не требует от остальной части скрипта какой-то модификации.
    На глобальной переменной my_var делается это так:
    Object.defineProperty(window /*- объект, где располагается свойство */, "my_var" /* - свойство, которое нужно опекать */,
    {
      get: function() // сторожим чтение значения
      {
        alert('Кто-то прочилал my_var!');
      },
      set: function(newValue) // сторожим запись значения
      {
        alert('Кто-то записал my_var! Новое значение: ' + newValue);
      }
    });
    my_var = 123456;  // пробуем записать что-то
    you_var = my_var; // пробуем извлечь значение
    Ответ написан
    Комментировать
  • Нужно создать кнопку, и когда кто-то нажимает, я хочу отобразить метку со ссылкой. Как это можно сделать?

    @alexalexes
    Управляйте видимостью вашей ссылки по событию кнопки onclick.
    Какие тут проблемы могут возникнуть-то у вас?
    <a id="my_link" href="https://vk.com/durov" target="_blank" style="display: none;">
      <img src="img/57d3d0a9e386c157136717cc.png" width="30px"/>
    </a> 
    <input type = "button" onclick = "document.getElementById('my_link').style.display = 'inline';" value = "связаться со мной" />
    Ответ написан
    Комментировать
  • Вопрос про полифиллы, для чего тут this(на что ссылается?) и null, а while (node) -значит бесконечный цикл?

    @alexalexes
    var node = this; // в ноду кладем текущий элемент Element;
    // начинаем примерять селектор, двигаясь от текущего элемента к его родителям     
     while (node) // пока есть элемент (не null) (или на предыдущей итерации провалили матч и есть родитель)
     {
            if (node.matches(css)) // подходит селектор элементу ?
             return node; // возвращаем этот элемент, цикл останавливается
            else
             node = node.parentElement; // не подошло, устанавливаем на node родительский элемент, идем на следующую итерацию.
          }
    return null; // цикл прошелся по всем родителям - ничего не нашли

    ----------
    Подставляем свой "велосипед" closest в прототип элемента:
    Element.prototype.closest = function (css)
    -------------
    Подставляем в прототип элемента метод matches любую доступную из перечисленных через || реализацию, если этот метод в разных браузерах называется по-разному, чтобы сгладить этот досадное недоразумение.
    Element.prototype.matches = Element.prototype.matchesSelector || <подставьте любой метод, чтобы делал матч, но назывался не как у всех>
    Ответ написан
    Комментировать
  • Как работать c позицией элементов в canvas?

    @alexalexes
    Не лучше ли background эксплуатировать для этих целей, меняя местами источники изображений?
    <style>
          #elem1
          {
            display: block;
            width: 400px;
            height: 400px;
            background-image: url("back1.png"),
                              url("back2.png");
            transition: background-image 0.5s ease; /* для наглядности эффекта */
          }
        </style>
        <div id="elem1"></div>
        <script>
        var trigger = 0;
        setInterval(function()
        {
          var elem1 = document.getElementById('elem1');
          elem1.style.backgroundImage = trigger % 2 == 1 ? 'url("back1.png"), url("back2.png")' : 'url("back2.png"), url("back1.png")';
          trigger++;
        }, 1000);
    
        </script>
    Ответ написан
    Комментировать
  • Как передать данные из COM порта в JS?

    @alexalexes
    Среда выполнения JS в браузере изолирована от железа, поэтому тут нужна полноценная реализация клиент-серверного приложения.
    Компьютер с COM-портом будет выступать в качестве веб-сервера.
    На этом сервере необходимо реализовать серверный скрипт, который подключится к COM и будет осуществлять транзит по HTTP с клиентом - браузером.
    А уже на стороне клиента API будет реализовано посредством JS, а получение данных - AJAX-ом.
    Вот пример как сделать серверную часть на NodeJS.
    Ответ написан
    Комментировать
  • Почему onclick срабатывает не на том div?

    @alexalexes
    Потому что к элементу, на котором произошло событие, нужно выходить через e.target, то есть использовать дескриптор события e.
    pole.onclick = function(e)
      {
          if(e.target.getAttribute('class') != 'pole-blue')
          {
              e.target.setAttribute('class', 'pole-blue');
          }
      }

    Еще момент, переменная через var должна быть объявлена один раз, переопределять через var нельзя.
    var pole = null;
    for(var i = 0;i<10;i++)
    {
      pole = document.createElement('div');
    Ответ написан
    1 комментарий
  • Сортировка в JavaScript многомерных массивов по одному из параметров?

    @alexalexes
    Как говорится, смотри в учебнике.
    Объекты могут быть отсортированы по значению одного из своих свойств.

    var items = [
      { name: 'Edward', value: 21 },
      { name: 'Sharpe', value: 37 },
      { name: 'And', value: 45 },
      { name: 'The', value: -12 },
      { name: 'Magnetic' },
      { name: 'Zeros', value: 37 }
    ];
    items.sort(function (a, b) {
      if (a.name > b.name) {
        return 1;
      }
      if (a.name < b.name) {
        return -1;
      }
      // a должно быть равным b
      return 0;
    });
    Ответ написан
    Комментировать
  • Как вывести и одновременно передать значение value в форме HTML?

    @alexalexes
    Кнопку оставляете в покое, значение передаете скрытым полем.
    <form action="?action=select_pay" method="POST">
    <input type="hidden"  name="pay_mode" value="20"  />
    <input type="submit" class="superbutton"  value="Яндекс Деньги"  />
    </form>
    <form action="?action=select_pay" method="POST">
    <input type="hidden"  name="pay_mode" value="10"  />
    <input type="submit" class="superbutton"  value="Еще одна платежка"  />
    </form>
    Ответ написан
  • Как сделать автофокусировку на поле ввода только на одной странице?

    @alexalexes
    На мобильнике, как правило, есть тачскрин.
    Я, обычно, проверяю наличие тач-обработчиков.
    И не важно, что за устройство: яблоко, андроид и тд.
    if ('ontouchstart' in document.documentElement) 
    {
    // есть сенсорный экран, значит, имеем дело с переносным гаджетом.
    }
    else
    {
      // desktop версия кода
     (элемент ввода).focus(); //устанавливаем фокус
    }
    Ответ написан
    Комментировать
  • Динамическое добавление ссылок на js скрипты в заголовок?

    @alexalexes
    Хватит и нативной составляющей, чтобы в документ добавить любой head.
    А вообще, смотрите скрипты счетчиков Яндекс или Гугл -метрики, там есть более компактные трюки с модификацией head.
    (function()
    {
      var src = 'https://cdn.jsdelivr.net/npm/suggestions-jquery@17.12.0/dist/css/suggestions.min.css';
      var link = document.createElement('link');
      link.setAttribute('src', src);
      link.setAttribute('type', 'text/css');
      link.setAttribute('rel', 'stylesheet');
     document.head.appendChild(link);
    
      src = 'https://cdn.jsdelivr.net/npm/suggestions-jquery@17.12.0/dist/js/jquery.suggestions.min.js';
      var scrt = document.createElement('script');
       scrt.setAttribute('src', src);
      document.head.appendChild(scrt);
    }
    )();
    Ответ написан
    Комментировать
  • Javascript. Как вернуть несколько значений через запятую?

    @alexalexes
    scheduler.attachEvent("onEventSave",function(id,ev,is_new)
    {    
      var checked_users = ev.username.split(','); // переводим строку в список отмеченных id пользователей
      var new_text = ''; // сюда будем писать строку с именами пользователей
      var checked_users_count = checked_users.length; // кол-во отмеченных пользователей
      for (var i = 0; i < checked_users_count; i++)
      {
        var check_user_id = checked_users[i]; // текущий отмеченный id
        var ch_users = users.filter(usr => usr.key == check_user_id); // получаем человека из списка users по отмеченному id (на выходе тоже список, но не более 1 элемента)
        if (ch_users.length > 0)
          new_text += (new_text != '' ? ', ' : '') + ch_users[0].label; // вписываем в строку найденного пользователя
      }
      ev.text = new_text == '' ? 'Nobody' : new_text; // если никого не нашли, то как-то обозначаем эту ситуацию (Nobody)
      return true;
    })
    Ответ написан
    Комментировать
  • Как безопасно загрузить изображение на сервер?

    @alexalexes
    На стороне PHP пропустить полученный файл через GD библиотеку.
    При необходимости, уменьшить качество выходного файла, и попутно сгенерировать preview, отправив его обратно клиентку (+ подтвердив получение сервером).
    Учтите, придется увеличить доступный объем оперативной памяти для одного процесса PHP.
    На моем опыте, чтобы GD проглотила 16 Мпикс картинку, нужно 128 Мб ОЗУ.
    Перед скармливаем GD взвешиваем картинку с помощью getimagesize().
    Если это не сделать, и с превышением лимита отдать на обработку библиотеке, то скрипт тихо-мирно заглохнет, не сообщив клиенту ничего, а так можно сгенерировать сообщение, что файл большой.
    Ответ написан
  • Как сделать, чтобы все нечекнутые и чекнутые чекбоксы отправлялись на бэк?

    @alexalexes
    Сталкивался с такой особенностью, решал как раз через дополнительное поле hidden:
    <label>
    <input type="hidden" id="field_0_1" name ="param_list[0][field_1]" value="off"/>
    <input type="checkbox" onchange="set_hidden_checkbox(this, 'field_0_1')"/>
    </label>

    function set_hidden_checkbox(target, id)
    {
      var hidden = document.getElementById(id);
      if(hidden !== undefined)
         hidden.value = target.checked ? 'on' : 'off';
    }

    Атрибут value в hidden нужно инициализировать значением по умолчанию.
    Ответ написан
    Комментировать
  • Как сделать вывод на JS?

    @alexalexes
    Вот вам в div.
    В input-е используется свойство value для отображения значения.
    А div надо набивать содержимым.
    Вот и вся разница.
    Пример элемента вывода:
    <div id="i4"></div>
    Код вывода:
    document.getElementById('i4').innerHTML = Number(n1)*0.5;
    Ответ написан
    Комментировать
  • Почему возникает "неровная прокрутка"?

    @alexalexes
    Анимация прокрутки происходит всегда за фиксированное время (сейчас 500 мс).
    Если top получается 100 пикселей, то промотка будет казаться медленней, а если 1000 пикселей - то быстро.
    А нужно сделать так, чтобы время анимации было пропорционально длине "прыжка".
    var anim_speed = 300; // пикселей в секунду
    var anim_time = (top * 1000) / anim_speed; // 1000 - поправка на милисекунды
    //анимируем переход на расстояние 
    $('body,html').animate({scrollTop: top}, anim_time);

    PS: Обычная школьная формула по физике: время равно расстоянию деленное на скорость.
    Ответ написан
    Комментировать
  • Как отображать различные блоки в зависимости от выбора пользователя?

    @alexalexes
    Измените структуру документа:
    <div class="info_block one">
    <div class="one_1"></div>
     <div class="one_2"></div>
    </div>
    <div class="info_block two">
    <div class="two_1"> </div>
    <div class="two_2"> </div>
     </div>
    <div class="info_block three"> 
    <div class="three_1"> </div>
    <div class="three_2"> </div>
    </div>
    <div class="info_block four">
    <div class="four_1"> </div>
    <div class="four_2"> </div>
     </div>

    Определите стили для инф. блоков.
    По умолчанию, все инф. блоки скрыты, нескрытым может быть блок, имеющий в себе класс active:
    <style>
    div.info_block
    {
      display: none;
    }
    div.info_block.active
    {
      display: block;
    }
    </style>

    Подключаете JQuery:
    <script src="https://code.jquery.com/jquery-3.3.1.js"></script>

    Определяете функцию, которая будет устанавливать убирать и устанавливать класс active на инф. блоках.
    <script>
    function display_div(class_name)
    {
      $('div.info_block').removeClass('active');
      $('div.info_block.' + class_name).addClass('active');
    }
    </script>

    Делаете видимым первый блок:
    <script>
    display_div('one');
    </script>

    Вставляете в пункты меню обработчик onclick для вызова функции отображения текущего инф. блока:
    <ul>
      <li onclick="display_div('one')">Первый блок</li>
      <li onclick="display_div('two')">Второй блок</li>
      <li onclick="display_div('three')">Третий блок</li>
      <li onclick="display_div('four')">Четвертый блок</li>
    </ul>
    Ответ написан
    1 комментарий
  • Как заставить срабатывать скрипт js, в самом подгружаемом файле?

    @alexalexes
    Ajax.php - серверный скрипт, он ни в коем образе не подгружается в браузер.
    Он просто отвечает на запросы. Ответ может содержать текст, html, json или любой формат потока данных, определяемый http-заголовком ответа.
    Если ответ приходит в виде текста скрипта, то его можно подключить так:
    var script_elem = document.createElement('script'); // создаем DOM-элемент
    script_elem.innerHTML = 'alert(123456)';                 // помещаем в него код скрипта
    document.body.appendChild(script_elem);               // добавляем в документ
    Ответ написан
  • Как получить индекс массива внутри массива во Vue.js?

    @alexalexes
    Когда перебирать начнешь массив, тогда и получишь индексы.
    https://learn.javascript.ru/array-iteration

    У вас задача на знание голого JavaScript.
    var my_array =
    [
      {
        data: 123
      },
      {
        data: 845
      },
      {
        data: 'dsdsd'
      }
    ];
    
    my_array.forEach(function(item, i, arr)
    {
      switch(i)
      {
        case 0:
          item.operation = item.data * 5;
          break;
        case 1:
          item.operation = item.data * 2;
          break;    
        default:
          item.operation = item.data + 'qwqwqw';
      } 
    });


    PS: Про то, как нужно положить внутрь foreach this, читайте тут.
    Ответ написан
  • Что можно создать на чистом JS без знаний верстки( HTML5/CSS3)?

    @alexalexes
    JS создан как обслуживающий язык программирования для DOM-модели документа HTML.
    Его прямая обязанность манипулировать объектами документа и поддерживать обмен запросами с сервером. Для локальной машины, где он выполняется, среда ограничена, никаких вам доступа к файловой системе, процессам ОС. JS ограничен своей средой выполнения внутри браузера.
    Хотите писать на JS с полноценным окружением, то вам нужно обратиться к node.js. Но это уже backend-разработка.
    Ответ написан
    Комментировать
  • Запись звука JS с микрофона компьютера И телефона в браузере?

    @alexalexes
    Библиотеки используют для этих целей Web Audio API.
    Если только нужно два действия: записать и проиграть, то достаточно изучить вот это руководство, чтобы написать свой велосипед.
    Полной совместимости со смартфонами добиться не получится, где-то браузер - это полноценное медийное приложение, а где-то просто просмотрщик HTML, а медийный функционал доступен только через сторонние приложения, установленные непосредственно на смартфоне.
    Ответ написан
    Комментировать