Задать вопрос
  • Использование методов со своими свойствами, внутри методов других классов со своими свойствами?

    Lastor
    @Lastor
    В чем сила, брат? В ньютонах.
    Вы затрудняетесь в выборе между шаблонами 'внедрение зависимостей' и 'инверсия зависимостей'. Тут нет однозначно верного решения, поскольку для этого нужно знать каким образом будет (и будет ли) расширяться поведение ваших классов в будущем.
    Исходя из описанного, я думаю, что оба способа будут иметь одинаковый результат. А в будущем вы легко сможете изменить выбранную архитектуру, если возникнет такая необходимость.
    То есть, речь о том, что проблемы можно решать по мере их поступления.
    Ответ написан
    Комментировать
  • Почему sql запрос не определяет имя таблицы, если записывать имя через prepare?

    @pantsarny
    Потому что подстановка не используется для имен таблиц, так как имя таблицы не может быть в одиночных кавычках
    Ответ написан
    3 комментария
  • Почему sql запрос не определяет имя таблицы, если записывать имя через prepare?

    @alexalexes
    1. В качестве входных параметров никогда не использовались имена таблиц в подготовленных запросах - это попытка забивать микроскопом гвозди.
    2. Метки для входных параметров - это не тип данных, это просто название места куда будет подставлено значение этой метки по ключу из массива значений.
    Причем, именованные метки нужно связывать со значением с помощью специальной функции:
    $stmt = $db->prepare("SELECT * FROM moya_tablitsa WHERE id = :metka_parametra_identifikatora");
    $stmt->bindParam(':metka_parametra_identifikatora', 123);
    $stmt->execute();

    Но можно не использовать именованные метки (если их несколько в запросе, то нужно вставлять значения по порядку)
    $stmt = $db->prepare("SELECT * FROM moya_tablitsa WHERE id = ?");
    $stmt->execute([123]);

    Можно использовать связывающую функцию, указав порядок метки.
    $stmt = $db->prepare("SELECT * FROM moya_tablitsa WHERE id = ?");
    $stmt->bindParam(1, 123); // 1 - это номер метки, 123 - значение параметра
    $stmt->execute();
    Ответ написан
    Комментировать
  • Как лучше всего реализовать вывод данных по мере их добавления в режиме реального времени?

    @pokinulchatnavremya
    если правильно понял вопрос, ты тожешь сделать через check базы данных, запрашивая запрос от БД (sql) выводить это через send. туда, куда тебе надо (например на веб ресурс)
    Ответ написан
    Комментировать
  • Как сделать замену только для первой группы regExp?

    demon416nds
    @demon416nds
    Разработчик на чем попало
    вот кривой код который делает почти то что нужно, дальше сам разбирайся
    function addspan(word){
      let vari='';
    let letters = word.split('');
      for(letter of letters) 
       vari += `<span class='cls'>${letter}<\/span>`;
      return vari;
      }  
      
      function textNodesUnder(node){
      var all = [];
      for (node=node.firstChild;node;node=node.nextSibling){
        if (node.nodeType==3) all.push(node);
        else all = all.concat(textNodesUnder(node));
      }
      return all;
    }
    
    nodes=textNodesUnder(document.querySelector('.block'));
    nodes.forEach(node => {
    tempnode=document.createElement("span");
    tempnode.innerHTML=addspan(node.nodeValue);
    node.parentElement.replaceChild(tempnode,node);
    tempnode.outerHTML=tempnode.innerHTML;
    });
    Ответ написан
    1 комментарий
  • Как сделать замену только для первой группы regExp?

    Aetae
    @Aetae Куратор тега JavaScript
    Тлен
    Во-первых: не работайте с html через регулярки.
    Во-вторых: см. во-первых.
    В-третьих: `(?<=>)(${letter})(?=<)`
    Ответ написан
    Комментировать
  • Почему выдает ошибку: Arithmetic operation resulted in an overflow.?

    freeExec
    @freeExec
    Участник OpenStreetMap
    Потому что IntPtr это машинное слово, и если у вас не древний мамонт, то но равно 64 битам (оно же long). И оно никак не может поместиться в ваш int
    Ответ написан
    Комментировать
  • Как сделать, чтобы координаты курсора совпадали с шириной блока?

    v3shin
    @v3shin
    Веб-шаман
    width() возвращает ширину блока без отступов. Используйте outerWidth(), тогда увидите, что ширина больше ожидаемой.
    Ответ написан
    1 комментарий
  • Как заменить все цифры на странице?

    0xD34F
    @0xD34F Куратор тега JavaScript
    Какие есть косяки:
    • Перебираете вложенные узлы, но замену выполняете у того, что передан в функцию.
    • Заменять содержимое надо только у текстовых узлов - чтобы проверить тип, смотрим nodeType.
    • У текстовых узлов нет innerText. Есть textContent и nodeValue.
    • Зачем функции знать заранее, что за замена должна быть выполнена? Что будете делать, если понадобится выполнить другую замену - закопипастите функцию, заменив регулярку? Лучше добавим второй параметр - функцию, принимающую текущий текст и возвращающую новый.

    Исправляем:

    function replaceText(node, replacer) {
      if (node.nodeType === Node.ELEMENT_NODE) {
        node.childNodes.forEach(n => replaceText(n, replacer));
      } else if (node.nodeType === Node.TEXT_NODE) {
        node.textContent = replacer(node.textContent);
      }
    }
    
    
    replaceText(document.body, str => str.replace(/\d/g, 'hello, world!!'));

    Или, долой рекурсию и проверки типов узлов, можно сразу текстовые перебирать:

    function replaceText(node, replacer) {
      const iter = document.createNodeIterator(node, NodeFilter.SHOW_TEXT);
    
      for (let n = null; n = iter.nextNode();) {
        n.nodeValue = replacer(n.nodeValue);
      }
    }
    Ответ написан
    Комментировать
  • Как сделать подключение своего js и css на чужой сайт через разширение созданное на manifest.json?

    XOR2048
    @XOR2048
    Web & Browser extension developer
    {
      "name": "Test Extension",
      "version": "1.0",
      "manifest_version": 2,
      "description": "Test",
      "action": {
        "default_icon": "icon.png",
        "default_popup": "popup.html"
      },
      "host_permissions": ["https://example.com/"],
      "content_scripts": [
        {
          "matches": ["https://example.com/*"],
          "css": ["style.css"],
          "js": ["script.js"]
        }
      ]
    }


    Как-то так должен будет выглядеть ваш manifest.json, если я правильно вас понял. Ну и соответственно прописать правила для стилей в style.css, желательно с припиской !important, сделать popup окошко, ну и написать нужный вам скрипт.
    Ответ написан
    1 комментарий
  • Как решить проблему?

    alexey-m-ukolov
    @alexey-m-ukolov Куратор тега JavaScript
    передать сюда аргументы
    Это вы уже умеете, тут ничего сложого. Вызов функции с аргументами - это азбука программирования.

    получить их в addCommentFn
    Вы уже передаёте туда один аргумент reset_timeComment.

    Осталось только совместить эти два кусочка пазла.
    Когда вы вызываете функцию startThrottle, вы вызываете функцию, которую вернула функция throttle. А тело этой функции контролируете тоже вы. Значит, вам ничто не мешает сделать, например, вот так:
    const throttle = (func, ms) =>{
        return function(additionalArgs){
            ...
                func.apply(this, [() => {
                    clearInterval(timer);
                    localStorage.setItem('time_comment-last', 0);
                    recalls__columnReminder.removeClass('visible');
                }, additionalArgs]);
            ...
    }
    
    function addCommentFn(reset_timeComment, additionalArgs) {
        console.log(additionalArgs.arg1);
    }
    
    startThrottle({arg1: 42, arg2: 'foo'});


    Это самый простой и "некрасивый вариант", когда все аргументы оборачиваются в объект-пакет.
    В современном javascript это вполне можно записать так:
    const throttle = (func, ms) =>{
        return function(...additionalArgs){
            ...
                func.apply(this, [
                    () => {
                        clearInterval(timer);
                        localStorage.setItem('time_comment-last', 0);
                        recalls__columnReminder.removeClass('visible');
                    },
                    ...additionalArgs
                ]);
            ...
    }
    
    function addCommentFn(reset_timeComment, arg1, arg2) {
        console.log(arg2);
    }
    
    startThrottle(42, 'foo'});
    Ответ написан
    Комментировать
  • Как переключить объект в дефолтный класс через js?

    Dasihub
    @Dasihub
    Чтобы поставить дефолтный класс ты можешь место Classlist использовать метод ClassName = "". Так же с помощью этого метода можешь дать класс, просто внутри написав название класса
    Ответ написан
    4 комментария
  • Не могу понять, как правильно задавать классы большим вложенностям по методологии бэм?

    Get-Web
    @Get-Web
    Front-End Developer
    Надо смотреть дизайн, чтобы более точно сказать как лучше, но в любом случае вы делаете не правильно.
    Задавайте короткие лакончиные названия, если у вас это не получается, значит вы свернули не туда.
    Чтобы получалось дробите блоки на более мелкие блоки.
    Вместо этого ужаса communication__forms-wrapper-create-recall-form-buttons-send создайте отдельно блок кнопку button или любое другое не зарезервированное название. Кнопку вы можете модифицировать так button_clear button_send, хотя лучше конечно дать более общее название или вообще делить по типу например button_type_1 button_type_2. Затем если в контекте кнопка другая используте микс

    <button class="communication_button button button_type_1">Очистить</button>

    Очень аккуратно и понятно

    то же самое с формой, создайте блок form и используйте как независимую структуру в нужном месте.

    ну и вообще вы только вдумайтесь у вас есть якобы элемент communication__forms-wrapper-create-recall-form и вы наследуетесь от него все глубже и глубже communication__forms-wrapper-create-recall-form-name так нельзя делать, вы косвенно пытаетесь делать элемент элемента, каждый элемент должен наследоваться от блока и редких случаях можно немного разбавить связями по типу el__price el__price-old el__price-new
    Ответ написан
    8 комментариев
  • Почему моя функция выполняется по многу раз за один вызов?

    @vitaliy_balahnin
    Новичок в веб-разработке
    changeComment сколько раз вызывается?
    Если вы говорите при первом вызове все нормально, а при втором у вас 2,4,20.
    applyUpdateds.click у вас внутри этой функции.
    Очевидный вывод я думаю сами сделаете.
    Ответ написан
    Комментировать
  • Как вернуть html код в ответ ajax запросу?

    Rsa97
    @Rsa97
    Для правильного вопроса надо знать половину ответа
    Вы пытаетесь выполнить внешнюю команду с именем <div
    Изучайте синтаксис PHP. Посмотрите, чем обратные апострофы отличаются от прямых и от двойных.
    Ответ написан
    Комментировать
  • Как вернуть html код в ответ ajax запросу?

    alexey-m-ukolov
    @alexey-m-ukolov Куратор тега PHP
    Вы уже возвращаете ответ через echo.
    Проблема в том, что вы не понимаете собственный код. Сначала вы вызываете ferchAll, а потом пытаетесь работать с результатом как с одной записью, а не их набором. Скрипт ваш падает из-за этой ошибки, а сервер не настроен для разработки и ошибки не показывает.

    PDOStatement::fetchAll() возвращает массив, содержащий все оставшиеся строки результирующего набора. Массив представляет каждую строку либо в виде массива значений одного столбца, либо в виде объекта, имена свойств которого совпадают с именами столбцов.
    https://www.php.net/manual/ru/pdostatement.fetchall.php

    P.S. И это если игнорировать неправильные кавычки.
    Ответ написан
    Комментировать
  • Как имея позицию и направление двух объектов в пространстве координат y, x, z, повернуть один объект в другой?

    @MarkusD
    все время мелю чепуху :)
    Решением вопроса будет скалярное произведение двух векторов. Операция еще называется Dot Product.

    Скалярное произведение позволяет узнать косинус угла между двумя нуль-векторами. Позиции обоих объектов надо привести к единой локальной системе координат. В твоем случае это должна быть локальная система координат объекта, который нужно вращать. Первый нуль-вектор берется из любой оси в нужной плоскости вращения текущей матрицы поворота объекта. Второй нуль-вектор берется через приведение глобальной позиции второго объекта в локальную систему координат первого.
    Далее полученные вектора нормализуются, берется их скалярное произведение и делается доворот матрицы вращения первого объекта на арккосинус результата произведения.

    В качестве бонуса.
    Чтобы определить направление вращения, можно воспользоваться векторным произведением, еще называемым Cross Product.

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

    @FinderOT
    Frontend разработчик
    сократите код до:
    $('.recall__people-fio').on('click', function(){
      $(this).toggleClass('elipsise');
    });

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

    hahenty
    @hahenty
    ('•')
    Нужно в addCommentFn пробросить функцию для сброса таймера в throttle-обёртке.
    Или внутри обёртки ловить ошибку из промиса.

    я бы делал первым вариантом.
    /**/
      func.apply( this, [ () => lastTime = $.now() ] );
      /*****/
    
    function addCommentFn(dethrot){
      /****/
      if(result.error){
        dethrot();
      }
      /****/
    }

    Но, учитывая прошлые вопросы, предвижу ещё серию вопросов.
    Ответ написан