Задать вопрос
Ответы пользователя по тегу JavaScript
  • Почему возникает ошибка "Failed to resolve filters" Vue.js?

    Aetae
    @Aetae Куратор тега JavaScript
    Тлен
    А нечего отступы вручную расставлять.
    Вот ваш код в нормальном виде:
    var app = new Vue({
      el: '#vue-app-one',
      data: {
        sitename: 'The Shop',
        string: 'Hello',
        product: {
          id: 1001,
          title: 'Phone',
          description: 'The best one <em>phone</em> ever',
          price: 1000000,
          image: 'This is an image',
        },
        filters: {
          formatPrice: function(price){
            if (!parseInt(price)) {return "";}
            if (price > 9999){
              var priceString = (price /100).toFixed(2);
              var priceArray = priceString.split("").reverse();
              var index = 3;
              while (priceArray.length > index +3){
                priceArray.splice(index+3, 0, ',');
                index +=4;
              }
              return '$' + priceArray.reverse().join('');
            } else{
              return '$' + (price/100).toFixed(2);
            }
          }
        }
      },
    });
    Ничего не замечаете?

    Разгадка
    Фильтры не должны лежать в data, они не данные.
    Ответ написан
    1 комментарий
  • Можно ли получить head удаленной страницы?

    Aetae
    @Aetae Куратор тега JavaScript
    Тлен
    Грузите вы в любом случае всё - это в первую очередь поток байт, во вторую простой текст, и только после парсинга движком браузера появляются какие-то там head и прочие body.
    В принципе, вы можете прервать загрузку, если посчитали что загрузили достаточно.
    XMLHttpRequest вызывает событие readystatechange\onprogress несколько раз с промежуточными результатами, а также имеет метод abort для остановки. Однако с современными скоростями интернета весь контент скорее всего будет загружен быстрее чем браузер сможет остановить зарос.

    Примерно так
    function parseHead(text) {
      if(!parseHead.parser) 
        parseHead.parser = new DOMParser();
    
      return parseHead.parser.parseFromString(
        text.match(/<head>[\s\S]*?<\/head>/i)[0], 
        "text/html"
      ).head;
    }
    
    function getHead(url) {
      return new Promise((resolve, reject) => {
        const xhr = new XMLHttpRequest();
        xhr.open('GET', url);
        xhr.onreadystatechange = function(event) {
          if (xhr.readyState === 3) { // если частично загружено
            if(/<\/head>/i.test(xhr.responseText)) { // если в загруженном есть закрывающий тег </head> 
              resolve(parseHead(xhr.responseText));  // парсим текст и возвращаем head
              xhr.onreadystatechange = null; // убираем дальнейшую обработку изменения состояния
              xhr.abort(); // останавливаем дальнейшую загрузку
            }
          } else if (xhr.readyState === 4){ // если запрос завршён
            if(xhr.status === 200) // если завершён успешно
              resolve(parseHead(xhr.responseText));   // парсим текст и возвращаем head
            else 
              reject(xhr); 
          }
        };
        xhr.send();
      }) 
    
    }
    
    getHead('/').then(console.log, console.error)
    Ответ написан
    Комментировать
  • Почему mousemove срабатывает при mousedown?

    Aetae
    @Aetae Куратор тега JavaScript
    Тлен
    Смотреть на свою гиперчуствительную мышь, которая сдвигается когда вы кликаете.
    Сам по себе этот код не выводит 111 при клике.
    Ответ написан
  • Как с помощью JSFiddle сделать проверку асинхронного запроса?

    Aetae
    @Aetae Куратор тега JavaScript
    Тлен
    JSFiddle и CodePen так не умеют, умеет Plunker.
    Ответ написан
    Комментировать
  • Как правильнее всего достать значение объекта при помощи строки?

    Aetae
    @Aetae Куратор тега JavaScript
    Тлен
    Использовать lodash get.
    Если интересует код - смотрите исходники.
    Писать велосипед не рекомендуется, можно наступить на грабли и не раз.
    Ответ написан
    Комментировать
  • Как работает getComputedStyle в JS??

    Aetae
    @Aetae Куратор тега JavaScript
    Тлен
    Потому что getComputedStyle даёт только не композитные значения, т.е. вы можете запросить borderTopColor, но не borderColor и не border.

    getComputedStyle возвращает итерируемый объект CSSStyleDeclaration.
    Для справки Array в javascript тоже просто итерируемый объект.

    P.S. Ребята до меня почему-то все дали ссылки на "русскую" mdn, которая мало того что всё равно не переведена, так в ней, собственно, отсутствуют упоминания об этой особенности.
    Как и о том, что совершенно не имеет значения как забирать, через getPropertyValue, camelCase свойством или kebab-case свойством - любой вариант верен.
    Ответ написан
  • Как удалять знаки, для которых нет символа в назначенном шрифте?

    Aetae
    @Aetae Куратор тега JavaScript
    Тлен
    Не очень надёжно: назначить шрифт спану, смотреть по ширине. Если отличается от "символа отсутствия символа" - значит есть.
    Боль-мене надёжно: рисовать на canvas и сверять с "символом отсутствия символа".

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

    Aetae
    @Aetae Куратор тега JavaScript
    Тлен
    В javascript максимально возможное число: Number.MAX_VALUE.
    При этом использовать что то больше Number.MAX_SAFE_INTEGER не рекомендуется, т.к. будут серьёзные погрешности в расчётах.

    Для больших чисел используйте BigInt.
    Ответ написан
    Комментировать
  • Сделать чтобы функция randomTime при нажатии 'n' button возвращала один результат как для setTimeout так и для отрисовки?

    Aetae
    @Aetae Куратор тега JavaScript
    Тлен
    Мужик, ты что такое переменные знаешь?
    buttonClickHandler = id => {
        const delay = randomTime();
        setTimeout(() => {
          this.setState({
            array: [
              ...this.state.array,
              `${asd()} Button ${id} was pressed  with ${delay}s timeout`
            ]
          }); // распаковываю массив array из стейта и  добавляю "Нажата кнопка"
        }, delay * 1000);
      };
    Ответ написан
    1 комментарий
  • Как сделать скролл на 1-10px вверх при клике на элемент?

    Aetae
    @Aetae Куратор тега JavaScript
    Тлен
    <script>
    function scrollTop1to10px(element) {
      while(element && element.scrollTop === 0)
        element = element.parentNode;
      if(element) {
        element.scrollTop -= Math.random() * 10 + 1 | 0;
      }
    }
    </script>
    
    <button onclick="scrollTop1to10px(this)">
      cкролл на 1-10 px вверх
    </button>
    Ответ написан
  • Как убрать eventListener из window?

    Aetae
    @Aetae Куратор тега JavaScript
    Тлен
    Если не помогает e.stopPropagation - можно заюзать e.stopImmediatePropagation. :)
    И это даже сработает. По своему.

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

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

    Aetae
    @Aetae Куратор тега JavaScript
    Тлен
    Тут полноценный "мультик" на canvas. HTML, CSS и прочее тут особо не нужно, нужно знание мультипликации и умение оную в canvas впихнуть.)
    Ответ написан
    Комментировать
  • Почему .parentNode underfined?

    Aetae
    @Aetae Куратор тега JavaScript
    Тлен
    let btn = $(this);
    $ - jquery,
    this - HTMLElement,
    $(this) - объект jquery.

    У объекта jquery нет свойства parentNode. У него есть метод parent().
    parentNode есть у HTMLElement.

    remove(), который вам советуют, есть и там и там, но лучше вам понимать что вы делаете, чем полагаться на удачные совпадения.
    Ответ написан
    Комментировать
  • Как навесить JS-событие/CSS-стили на N-ое слово в текстовой node без изменения DOM?

    Aetae
    @Aetae Куратор тега JavaScript
    Тлен
    Как обычно - абсолютный div поверх и перепроверять позицию на каждый чих.
    Ответ написан
    4 комментария
  • Почему игнорируется строчка перезаписи поля объекта?

    Aetae
    @Aetae Куратор тега JavaScript
    Тлен
    Всё работает:
    var navItems = Array.from({length: 10}, (_, id) => ({
      id,
      title: 'ещё',
      children: []
    }));
    navItems.find(item => item.id === 5).children = navItems.slice(5, navItems.length);
    console.log(navItems)

    Возможно объекты у вас в получаемом navItems заморожены или просто свойство children имеет запрет на запись, проверьте:
    var item = navItems.find(item => item.id === 5);
    console.log(
      Object.isFrozen(item), 
      Object.getOwnPropertyDescriptor(item, 'children').writable, 
      Object.isFrozen(item.children)
    )

    Если заморожен только item или ограничена запись, но сам children не заморожен, то вместо замены children вы можете просто изменить его содержимое:
    var children = navItems.find(item => item.id === 5).children;
    children.splice(0, children.length, ...navItems.slice(5, navItems.length));

    Если заморожено всё, то только грязные хаки с подменой Object.freeze. Но перед этим стоит подумать: если объекты заморожены, наверное для этого была какая-то причина?
    Ответ написан
  • Создание простого PDF через чистый JS?

    Aetae
    @Aetae Куратор тега JavaScript
    Тлен
    Твои требования уникальны, а значит в дикой природе не встречаются.
    Так что качаешь сырцы jsPdf или pdfmake и потрошишь от всего что тебе не нужно. В размер скорее всего уложишься с запасом, он никто за тебя (бесплатно) это не сделает.
    Ответ написан
    Комментировать
  • Как превратить svg файл в массив координат и обратно?

    Aetae
    @Aetae Куратор тега JavaScript
    Тлен
    Chrome убрал исключённый из нового стандарта SVG path.pathSegList, но при этом не добавил path.getPathData() - предлагаемую этим стандартом альтернативу. Гениальный ход, надо сказать.
    Так что варианты:
    1. юзать полифил для pathSegList - так по крайней мере в фоксе оно будет работать нативно(до поры).
    2. юзать полифил для getPathData() - так когда-нибудь везде заработает нативно(пока - нигде).
    3. использовать какую-нить svg-либу общего назначения - так либа подумает за вас, а у вас в проекте будет лежать сотня-другая кило мусорного кода.
    4. написать совой велосипед - так у вас будет кусочек кода подходящий именно вам, и плевать на нативность, чай не тысячами путей ворочаем.
    Ответ написан
  • Почему DOMContentLoaded не отрабатывает и как это исправить?

    Aetae
    @Aetae Куратор тега JavaScript
    Тлен
    Проверяйте предварительно document.readyState. Если состояние нужное - вызываете сразу, иначе - уже ожидаете DOMContentLoaded.
    Ответ написан
  • Почему JSON.parse не хочет работать с тегом a href?

    Aetae
    @Aetae Куратор тега JavaScript
    Тлен
    Потому что вы задаёте строку напрямую в коде. Из кода описание строки вида '{ foo: "b\"ar" }' превращается в памяти в строку { foo: "b"ar" } после чего JSON.parse, пытаясь её распарсить, естественно, спотыкается.
    Когда вы получаете ajax ответ от сервера вида { foo: "b\"ar" } сразу строкой, он именно таком виде и идёт в память.
    Если хотите получить строку содержащую символы экранирования - эти символы также надо заэкранировать:
    blocks: JSON.parse('[{"type":"header","data":{"text":"Тест","level":1}},{"type":"paragraph","data":{"text":"Тут вот <a href=\\"https://wordpress.org/plugins/woo-variations-style-buttons/\\">ссылка</a>."}}]')
    Ответ написан
    6 комментариев
  • Почему отображается NaN вместо цифр в таймере JS в Safari?

    Aetae
    @Aetae Куратор тега JavaScript
    Тлен
    Можно предположить, что Date.parse в сафари не может прочитать формат '"'.$mm.' '.$dd.' '.$yy.' '.$hh.':'.$mi.':00"'.
    Попробуйте так:
    var deadline= new Date(+YearS, MonthS-1, +DayS, +HourS, +MinS);
    Ответ написан
    Комментировать