Ответы пользователя по тегу JavaScript
  • Как делать пошаговые действия?

    sergiks
    @sergiks Куратор тега JavaScript
    ♬♬
    Поскольку всё в рамках одного домена/сайта, ограничения Same Origin Policy не помешают.

    Каждая открываемая страница – это новое свежее выполнение скрипта. Поэтому между переходами надо как-то сохранять «состояние» — например, в куках или LocalStorage. В некоторых настройках ни одно из этих хранилищ может оказаться недоступным – например, в зашоренном Tor-браузере.

    С использованием LocalStorage можно примерно так:
    const KEY_STATUS = 'status'; // ключ сохраняемого параметра
    const step = +localStorage.getItem(KEY_STATUS);
    
    /* 
      Шаги:
      0 - переход на /1
      1 - заполнение и клик (видимо, в переходом на новую страницу?)
      2 - переход на /2
    */
    if (0 === step) {
    
      document.location.href = "http://site.ru/1";
    
    } else if (1 === step) {
    
      document.getElementsByName("pw")[0].value = "test";
      document.getElementsByClassName("ur")[0].click();
    
    } else if (2 === step) {
      
      document.location.href = "http://site.ru/2";
    
    }
    
    localStorage.setItem(KEY_STATUS, 1 + step);
    Ответ написан
    7 комментариев
  • Математические вычисления с дробными числами?

    sergiks
    @sergiks Куратор тега JavaScript
    ♬♬
    К счастью, у вас не банк с расчетом стаки по кредиту.

    Почему бы не считать все в копейках? Тогда все расчеты в целых.

    ..Пока маркетологи не захотят давать скидку в 1/3
    Ответ написан
    2 комментария
  • Как определить к какой форме принадлежит input?

    sergiks
    @sergiks Куратор тега JavaScript
    ♬♬
    Прикрутить бы VueJS, и сделать корзину реактивной: в любой из форм изменили число товара, везде так же изменилось.

    Костылинг мог бы быть с глобальным объектом, хранящим актуальную корзину. Любая из форм меняет значениеив нем. Сеттер значения эмитит событие, которе слушают все формы, чтобы обновить свои данные.
    Ответ написан
  • Возможно ли средствами css3 нарисовать такое?

    sergiks
    @sergiks Куратор тега JavaScript
    ♬♬
    Не пробовал, но стоит попробовать CSS свойство clip-path
    clip-path: rectangle(...)
    или mask-image и генерируемый SVG.

    Каждое из изображений обрезать своей маской, позиционировать над белым фоном. Белые рамки - может, поверх положить SVG опять же и дать толщину линиям.
    Ответ написан
    Комментировать
  • Как объединить два объекта без затирания вложенных свойств?

    sergiks
    @sergiks Куратор тега JavaScript
    ♬♬
    Не полениться обходить каждое свойство, и если его значение это объект, то рекурсивно не полениться обходить...

    Простых-встроенных методов пока нет.

    Например, см. реализцию _.merge() в библиотеке lodash.
    Ответ написан
    Комментировать
  • Как укоротить данный код?

    sergiks
    @sergiks Куратор тега JavaScript
    ♬♬
    Я бы предложил удлиннить на два дополнительных знака равенства:
    const bool = residential.is_brick === 0 || residential.is_brick === null;
    Ответ написан
    Комментировать
  • Безопасно ли передавать пароль через ajax?

    sergiks
    @sergiks Куратор тега JavaScript
    ♬♬
    По протоколу HTTPS безопасно. По HTTP — опасно.
    Ответ написан
  • Как защитить приложение?

    sergiks
    @sergiks Куратор тега JavaScript
    ♬♬
    Обсуждение похожего вопроса на github Electron'а.

    Один из вариантов – написать на C++ собственный модуль для NodeJS, реализующий скрываемый функционал.

    В вопросе не описано, как работает приложение: полностью автономно или клиент-сервер. Необходимость общения с сервером значительно упростила бы контроль оплаты.

    Для автономного моё предложение: регулярно обновлять приложение, улучшая его с каждым релизом. При автообновлениях проверять статус подписки. Так «хакеры» лишились бы свежих версий.
    Ответ написан
    1 комментарий
  • Почему random не работает?

    sergiks
    @sergiks Куратор тега JavaScript
    ♬♬
    1.
    var x = [Math.floor(Math.random()*10)];
    // заменить на
    var x = Math.floor(Math.random()*10);


    2.
    if(x=input){
    // заменить на
    if(x==input){
    Ответ написан
  • Что почитать по авторизации на js?

    sergiks
    @sergiks Куратор тега JavaScript
    ♬♬
    • cookies – JS умеет их читать и устанавливать, а back по ним узнаёт сессию
    • HTTP headers – с каждым AJAX-запросом можно передавать в заголовках параметры авторизации
    • window.postMessage() может пригодиться, чтобы из нового окна, в котором отправили пользователя авторизовываться через третью соц-сеть, сообщить в «основное» окно, как всё прошло.
    Ответ написан
    Комментировать
  • Почему цикл обрабатывается не верно?

    sergiks
    @sergiks Куратор тега JavaScript
    ♬♬
    var i; // var в отличие от let и const «всплывает» наверх
           // поэтому можно записать и так.
           // Это важно, т.к. изменить i могут где-то ниже в коде.
    
    for(i=0; i<10; i++) { 
      setTimeout(function() { // на каждой итерации создаётся новая функция,
                              // которая сохраняет ссылку на переменную  i 
        alert(i);             // чтобы когда, наконец, сработает, 
                              // вывести что там в i окажется в тот момент
      }, 100); // выполнение откладывается на потом через 1/10 сек
    }

    Цикл доиграл, создал-отложил 10 функций-анонимусов, каждая пристально смотрит на переменную i.
    К этому времени i, спасибо циклу, уже выросла до значения 10.

    Через 0.1 секунды посыпятся выполняться те 10 функций,
    и каждая выведет текущее значение i на этот момент.

    Занимательный факт.
    Если после цикла дописать i = 2*2*5*0x65 ; то алёрты выведут наступающий год!
    Ответ написан
    Комментировать
  • Переменные создавать внутри или вне циклов?

    sergiks
    @sergiks Куратор тега JavaScript
    ♬♬
    for(let i = 0, a = document.querySelector(".elem"); i <10; i++) {
      alert(a);
      console.log(a);
    }
    Ответ написан
    3 комментария
  • Как автоматизировать процесс записи видео (ScreenCapture) для SVG-анимации?

    sergiks
    @sergiks Куратор тега JavaScript
    ♬♬
    Вот вариант SVG animation to video:

    использовать Media Recorder API и скрытый элемент canvas

    Поскольку отрисовка кадров из элементов img может подтормаживать, этот код заранее генерит все кадры и после рендерит в цикле их через requestAnimationFrame()

    index.html
    <!DOCTYPE html>
    <meta charset="utf-8">
    <body>
    <svg width="960" height="500"></svg>
    <script src="https://cdnjs.cloudflare.com/ajax/libs/d3/4.2.3/d3.min.js"></script>
    <script src="https://d3js.org/topojson.v2.min.js"></script>
    <script>
    var svg = d3.select("svg"),
        canvas = document.createElement("canvas"),
        width = canvas.width = +svg.attr("width"),
        height = canvas.height = +svg.attr("height"),
        context = canvas.getContext("2d");
    
    var projection = d3.geoOrthographic()
      .scale(195)
      .translate([width / 2, height / 2])
      .precision(0.1);
    
    var path = d3.geoPath().projection(projection);
    
    d3.json("/mbostock/raw/4090846/world-110m.json", function(err, world) {
      var data = [],
        stream = canvas.captureStream(),
        recorder = new MediaRecorder(stream, { mimeType: "video/webm" });
    
      recorder.ondataavailable = function(event) {
        if (event.data && event.data.size) {
          data.push(event.data);
        }
      };
    
      recorder.onstop = () => {
        var url = URL.createObjectURL(new Blob(data, { type: "video/webm" }));
        d3.selectAll("canvas, svg").remove();
        d3.select("body")
          .append("video")
          .attr("src", url)
          .attr("controls", true)
          .attr("autoplay", true);
      };
    
      var background = svg.append("rect")
        .attr("width", width)
        .attr("height", height)
        .attr("fill", "#fff");
    
      svg.append("path")
        .datum({ type: "Sphere" })
        .attr("stroke", "#222")
        .attr("fill", "none");
    
      svg.append("path")
        .datum(topojson.feature(world, world.objects.land))
        .attr("fill", "#222")
        .attr("stroke", "none");
    
      svg.append("path")
        .datum(topojson.mesh(world, world.objects.countries, function(a, b) {
          return a !== b;
        }))
        .attr("fill", "none")
        .attr("stroke", "#fff");
    
      var queue = d3.queue(1);
    
      d3.range(120).forEach(function(frame){
        queue.defer(drawFrame, frame / 120);
      });
    
      queue.awaitAll(function(err, frames){
        recorder.start();
        drawFrame();
    
        function drawFrame() {
          if (frames.length) {
            context.drawImage(frames.shift(), 0, 0, width, height);
            requestAnimationFrame(drawFrame);
          } else {
            recorder.stop();
          }
        }
      });
    
      function drawFrame(t, cb) {
        projection.rotate([360 * t]);
        svg.selectAll("path").attr("d", path);
    
        var img = new Image(),
            serialized = new XMLSerializer().serializeToString(svg.node()),
            url = URL.createObjectURL(new Blob([serialized], {type: "image/svg+xml"}));
    
        img.onload = function(){
          cb(null, img);
        };
    
        img.src = url;
    
      }
    });
    </script>
    Ответ написан
    Комментировать
  • Можно ли с помощью js удалить атрибут в элементе img?

    sergiks
    @sergiks Куратор тега JavaScript
    ♬♬
    Неправильный вопрос задаёте и получаете не тот ответ.

    Плагин rocket-lazy-load можно деактивировать для определённых картинок,
    если добавить им атрибут data-no-lazy="1"

    <img src="logo.png" data-no-lazy="1" title="Лого от Артемия за килобакс" alt="">
    Ответ написан
    6 комментариев
  • Не работает код Js - как сделать, чтобы при нажатии на кнопку всегда выполнялось добавление элементов на html - страницу?

    sergiks
    @sergiks Куратор тега JavaScript
    ♬♬
    в переменной var divContent у вас строка текста (пусть и HTML).
    в следующей строке appendChild() ожидает не строку текста, а HTML узел (Node) – его можно создать как у вас выше document.createElement().

    В общем два пути:
    1. Создавать HTML, но тогда приклеивать его через element.innerHTML = myHTML;
    2. Создавать узлы и их через appendChild() Но у вас требуется два инпута вставить, с множеством атрибутов. На чистом JS это займет несколько строк:
    spoiler
    var input = document.createElement('input');
    input.type = "text";
    input.placeholder = "Наименование";
    input.className = "expenses-item";
    newDiv.appendChild(input);
    
    input = document.createElement('input');
    input.type = "text";
    input.placeholder = "Цена";
    input.className = "expenses-item";
    newDiv.appendChild(input);
    Ответ написан
    1 комментарий
  • Как эффективно выбирать каждый n элемент массива?

    sergiks
    @sergiks Куратор тега JavaScript
    ♬♬
    «Эффективно» в смысле кратко, в одну строку:
    const everyNth = (arr, n) => arr.filter((e, i) => i % n === 0);
    
    // применение
    everyNth([0, 11, 22, 33, 44, 55, 66, 77], 7) // [0, 77]


    «Эффективно» без лишних итераций, старым добрым циклом for():
    function everyNth(arr, n) {
      const result = [];
      for (let i=0; i<arr.length; i+=n) result.push(arr[n]);
      return result;
    }


    Какой быстрее – сделал проверку на jsPerf
    Цикл for()быстрее в 7 раз!
    скрин
    5dffbba9538a7281867384.png
    Ответ написан
    Комментировать
  • Как сделать AJAX запрос без jqury?

    sergiks
    @sergiks Куратор тега JavaScript
    ♬♬
    Дело в Content-type: вы передрали код из примера с application/x-www-form-urlencoded, который предполагает отправку данных как в GET-параметрах: a=1&b=2&c=3

    При этом шлёте JSON-закодированные данные.

    Замените на
    request.setRequestHeader("Content-Type", "application/json;charset=UTF-8");


    В PHP обработчике брать php://input
    $data = json_decode(file_get_contents("php://input"));
    Ответ написан
    6 комментариев
  • Работа с массивами. Метод forEach и его принцип работы?

    sergiks
    @sergiks Куратор тега JavaScript
    ♬♬
    forEach() вызывает функцию по очереди с каждым из элементов массива. В данном примере вызовется function(1), function(3), function(4), ... function(5)

    result это объект, где свойствами будут встреченные цифры (как строки).

    Пока цифра не встречалась, такого свойства у result нет, и, например, result[1] будет поначалу undefined. И в таком случае создаётся это свойство со значением 1.

    А если такое свойство (со значением-счётчиком = 1 или уже больше) найдено, это значение не равно undefined, и оно будет увеличено на 1.

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

    sergiks
    @sergiks Куратор тега JavaScript
    ♬♬
    Вопрос плохо составлен: некоторые, включая меня, в начале решили что школьник не знает математику.
    В комментариях выяснилось, что вопрос вызван опасениями проблем ошибок округления дробных чисел.
    Но не раскрыты детали – какие значения могут быть введены, что требуется на выходе.

    Возможно, достаточно простого округления Math.round() для определения попадания в интервал:
    var priceProduct = 2000;
    var monthlyPayment = 230;
    
    var precision = 1e-6; // точность одна миллионная
    
    var months = priceProduct / monthlyPayment;
    var nearest = Math.round(months);
    var diff = months - nearest;
    if (diff > precision) months = nearest + 1; // == Math.ceil()


    Если уверены, что проблема есть и точность важна – то можно использовать библиотеку для операций с десятичными числами любой точности. Например, decimal.js
    Ответ написан
    2 комментария
  • Как посчитать уникальные символы в строке?

    sergiks
    @sergiks Куратор тега JavaScript
    ♬♬
    Что не так:
    1. цикл в цикле – лучше обойтись одним, если можно. Поиск можно заменить на indexOf()
    2. в качестве накопителя уникальных строка как-то нетрадиционна. Обычно массив, или ключи объекта. Или, изысканно, Set – и потом будет интересовать его длина (размер, size, кардинальность : )

    const text2 = 'You know nothing Jon Snow';
    
    function countUniqChars(str) {
      return new Set(str.split('')).size;
    }
    
    countUniqChars(text2) // 13
    Ответ написан
    Комментировать