Задать вопрос
  • На сколько практично разделять логику загрузки данных?

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

    Некоторые даже идут в экстрим: дело в том, что первые 14 килобайт HTTP запроса загружаются и могут отображаться браузером практически мгновенно, остальные данные загружаются гораздо дольше. И вот некоторые пытаются в эти 14 килобайт запихнуть такие данные, которые позволят отобразить самые важные элементы страницы.

    Поэтому, отложенная загрузка - это очень верное решение. Главное, постараться сделать её как можно более незаметной и плавной, нельзя делать "прыгающую" вёрстку. Ещё вам лайфхак, который я выстрадал сам: если подзагрузка данных не долгая, то лучше не отображать прогрессбары, спиннеры и т.д. Чисто психологически эти элементы вызывают ощущение тормознутости. И если запрос точно такое же время будет длиться без отображения спиннера, то он будет ощущаться быстрее. Это конечно, тонкий момент, и настравать нужно в каждом случае отдельно.

    Насчёт типа рендеринга и "правильности" тут всё очень хорошо описал уважаемый VoidVolker . В каждом случае вы сами должны решить, как будет удобнее для пользователя. Лично я последнее время всё чаще использую гибридный рендеринг при помощи библиотеки HTMX
    Ответ написан
    1 комментарий
  • Почему input в состоянии webkit-autofill искажает бордер?

    delphinpro
    @delphinpro Куратор тега CSS
    frontend developer
    у меня не отображает.

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

    VoidVolker
    @VoidVolker
    Dark side eye. А у нас печеньки! А у вас?
    Точно так же как и любую другую программу:
    1. Формулируете вашу задачу в виде какого-то текстового/графического описания
    2. Формулируете ТЗ с конкретными требованиями, ограничениями и всем прочим
    3. На основе ТЗ разрабатываете ЧТЗ (Частное ТЗ) со всеми полными деталями, описаниями всех действий, событий, взаимодействий и прочее
    4. Используя ЧТЗ подготавливаете проект - архитектура, инструменты, системы, подсистемы и прочее с полным описанием, декомпозированными элементами вниз до самых простых и прочее
    5. Берёте проект и по шагам его реализовываете
    6. Profit

    Конкретных вариантов реализации в вашем случае целая куча: гифка фоном, таблица, grid, flex с рандомным изменением через JS прозрачности фона, даже хоть canvas можно использовать.
    Ответ написан
    Комментировать
  • Как сделать, чтобы на сайте картинка при нажатии открывалась в большом размере а при повторном щелчке возвращалась к исходнику? В HTML?

    Rsa97
    @Rsa97
    Для правильного вопроса надо знать половину ответа
    Такие вещи лучше делать не ковырянием в стилях, а переключением класса.
    И jQuery не нужен.

    А иногда можно и вообще без JS обойтись, но не всегда структура документа такое позволяет.
    Ответ написан
    4 комментария
  • Есть web-сервер на php или nodejs который поддерживает работу с .htaccess?

    @Refguser
    Решения для бизнеса: корп.сайты, ИМ, боты и пр.
    Для выполнения тестов нужен web сервер на php или nodejs который поддерживает обработку файла .htaccess
    Есть что-то такое в природе?

    Вебсерверов на php не бывает. Есть с поддержкой php.
    И естественно htaccess - это часть аппача.
    Ответ написан
  • Как создать плиточное меню WP с различным кеглем, по мере варьирования числа постов в категориях?

    wppanda5
    @wppanda5 Куратор тега WordPress
    WordPress Mедведь
    как ни будь так

    $categories = get_categories(array(
            'orderby' => 'count',
            'order' => 'DESC',
            'hide_empty' => true
        ));
    
            $counts = wp_list_pluck($categories, 'count');
            $max_count = max($counts);
            $min_count = min($counts);
            $count_range = ($max_count - $min_count) ? ($max_count - $min_count) : 1;


    дальше проходите категории циклом


    $normalized = ($category->count - $min_count) / $count_range;
        
                $font_size = 14 + round($normalized * 10, 2);


    ну а дальше стилизуете как надо
    Ответ написан
    Комментировать
  • Как выровнять текст и картинку внутри ссылки?

    coubwebdev
    @coubwebdev
    .header__link a{
    display: flex;
    align-items: center;
    gap: 10px;
    }

    .header__link img {
    width: 100px;
    height: 100px;
    }

    .header__link span {
    font-family: 'Poppins', serif;
    font-size: 17px;
    color: rgb(104, 109, 119);
    font-weight: 500;
    }

    у вас флекс был на header__link, а не на кнопку
    Ответ написан
    Комментировать
  • Могу ли я прогнать через password_hash пароли в бд, которые md5, чтобы не сломалась авторизация?

    @alexalexes
    Смену способа хеширования пароля вы можете провернуть только при участии каждого пользователя, в два этапа.
    1 этап.
    Делаете патч в функцию авторизации.
    Когда пользователь авторизуется, проверяете, что заполнено поле по хешу новой функции.
    Если оно заполнено по новой функции, то все проверки верности пароля проводите с ней, поле старой функции игнорируете.

    Если хеш по новой функции не заполнен, то проверяете, что пароль верен с точки зрения хеша старой функции. Если верен пароль, то записываете хеш по новой функции, так как у вас есть исходный пароль.
    Так вы накапливаете базу пользователей, которые часто заходят. И для них вы бесшовно меняете хеши.

    2 этап
    Когда число поменянных хешей примерно будет равно числу активных пользователей за определенный период, то в патче запрещаете пользоваться старым хешем для проверки паролей, отправляете пользователя принудительно восстанавливать пароль по другим учетным данным, например, по эл. почте.
    При восстановлении доступа пароль хешировать новой функцией.
    Все, с этого момента можно избавиться от логики использования старого хеша.
    Ответ написан
    Комментировать
  • Как сохранить данные на сайте html+css в файл txt?

    @rPman
    Без скриптов никак, потому что html+css это только способ описания внешнего вида (и очень немного анимации), при этом это только браузерный фронтэнд - то что работает у пользователя. На этой стороне даже со скриптами файл не сохранить (можно сформировать сам файл и выдать запрос на загрузку файла, но не контролировать куда)

    С другой стороны html forms (теги form и input/textarea) и простейший скрипт из пары строчек на сервере, позволят решить эту задачу
    <!DOCTYPE html>
    <html>
    <head>
        <title>Форма</title>
    </head>
    <body>
        <form action="save.php" method="post">
            <input type="text" name="data" placeholder="Введите данные" required>
            <button type="submit">Отправить</button>
        </form>
    </body>
    </html>

    <?php
    file_put_contents('data.txt', $_POST['data']);
    echo "Данные сохранены!";
    ?>

    Само собой тут никаких защит, атворизаций и прочего
    Ответ написан
    Комментировать
  • Как сохранить данные на сайте html+css в файл txt?

    @RafGal
    подаешь на вход имя файла и текст
    let export_text_file = function(имя_файла, текстовое_содержимое){ var blob = new Blob([текстовое_содержимое], { type: "text/plain" }); function download(blob,filename){ if(typeof blob == "object"){ if(window.navigator.msSaveBlob) {return window.navigator.msSaveBlob(blob,filename);} blob=window.URL.createObjectURL(blob); } var s=document.createElement("a");  s.href=blob; s.download=filename; document.body.appendChild(s); s.click(); setTimeout(function(){ window.URL.revokeObjectURL(blob); document.body.removeChild(s); s.remove(); }, 300); } download(blob, имя_файла); }
    Ответ написан
    Комментировать
  • Как сохранить данные на сайте html+css в файл txt?

    Если ваша задача - просто и относительно безопасно сохранить данные, которые пользователи вводят на вашем сайте, не поднимая самостоятельно никакого сервера, то рассмотрите какой-то сервис, который может принимать формы. Например:

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

    - Formspree или Formcarry Тут еще проще, но больше 50 заполнений в месяц платно.

    - Ну а можно сильно заморочиться и сделать заполнение гугл-таблиц в гугл-докс результатами своей формы. Но тут надо написать обработчик формы на их языке Google Apps Script, опубликовать у них это в виде веб-приложения, и настроить свою форму на адрес этого веб-приложения. Данные будут сохраняться в ту гугл-таблицу, которую вы выбрали в этом скрипте.
    Ответ написан
    Комментировать
  • Может ли браузер дублировать POST запрос?

    Такое обычно происходит, когда запрос кидается в lifecycle-хуках, которые могут сработать много раз (например, updated), либо в watch. И когда у вас что-то ошибочно повторно перерендерится, то может бахнуть второй запрос. Дабл-клик по кнопке, которую вы не выключаете сразу после первого клика также не исключается.

    Насчёт идентификатора вашего ничего не могу сказать, потому что не вижу, где и как вы его генерируете.

    Дебажить, дебажить, и ещё раз дебажить VUE.

    1. Если есть возможность запустить фронтенд на локалке в development environment, установите в браузер плагин Vuejs devtools, и посмотрите поведение компонента, кидающего запросы, может быть там что-то увидите.

    2. Откройте devtools браузера и на вкладке Network и кликните ссылку в колонке Initiator (не знаю, как по-русски, не пользуюсь русским в браузере) у этих повторяющихся запросов. Если будут показаны разные участки кода, значит, где-то еще в коде затерялся такой же запрос.

    3. Самое простое: прямо перед строчкой с вызовом запроса axios (прямо перед запросом, в этой же функции, не где-то вне её, а прямо в предыдущей строчке) напишите банальный console.log("Gotcha!!!!"). Если сообщение в консоли браузера появится дважды, значит, проблема исключительно в логике вашей программы.

    4. Если ваш ID действительно генерируется прямо рядом с вызовом запроса, прямо в той же самой функции (что исключает баг с тем, что в запрос подставляется где-то сохранённый и кэшированный фреймворком ID), и это действительно подлый Chromium повторяет запросы из-за крайне нестабильного коннекта у пользователя, то тогда генерируйте ID не просто рандомом, который всё же может повториться, а сгенерируйте нормальный UUID, вероятность повторения которого ЗНАЧИТЕЛЬНО ниже. При приходе запроса сохраняете этот UUID на короткое время где вам удобнее, и если придёт такой же запрос с таким же UUID, то не обрабатываете его. Этот же UUID вам может помочь и в других аспектах: например, вы можете его использовать как "Correlation ID" данного конкретного запроса. Его можно отражать в логах, передавать в другие сервисы, если у вас их несколько. И тогда вы сможете без проблем отслеживать жизненный цикл каждого конкретного запроса.
    Ответ написан
    6 комментариев
  • PHP. Deprecated: trim(): Passing null to parameter #1 ($string) of type string is deprecated in?

    @AUser0
    Чем больше знаю, тем лучше понимаю, как мало знаю.
    В приведённом коде вообще нет вызова trim(...).
    Ну а по тексту ошибки: в вызове trim($variable) (в файле /var/www/u2340392/data/www/test.kaikova.ru/modules/mod_bt_contentslider/tmpl/default.php) указана переменная, хранящая значение null, вместо ожидаемой строки. Из-за этого и ошибка...
    Ответ написан
    Комментировать
  • Как могли узнать код для входа в Телеграм?

    15432
    @15432
    Системный программист ^_^
    Современные недорогие кнопочные телефоны зачастую имеют в системе закладки, которые сливают смс и ваши данные кому попало. Поэтому прежде всего напишите модель вашего телефона
    Ответ написан
    9 комментариев
  • Как могли узнать код для входа в Телеграм?

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

    @Refguser
    Решения для бизнеса: корп.сайты, ИМ, боты и пр.
    Скорее всего с ПК и был уведён.
    Вирусы, левый клиент и и тп.
    Ответ написан
  • Как сделать обмен музыки из канала в телеграмме с сайтом?

    @q2digger
    никого не трогаю, починяю примус
    берем Telegram Bot API (https://core.telegram.org/bots/api), в другую руку берем какой нибудь знакомый язык программирования, например Python и пишем бота, который следит за постами с музыкой в вашем канале и при появлении новой делает какие-то запланированные действия, например выкладывает музыку на вашу страницу. У таких платформ как Wordpress или Django есть API, и все это отлично автоматизируется.
    Ответ написан
    Комментировать
  • Как разместить сам flex-контейнер (котором есть перенос по рядам) по центру?

    Rsa97
    @Rsa97
    Для правильного вопроса надо знать половину ответа
    Вы бы лучше вместо картинок сделали пример на том же JSFiddle или CodePen.
    А так, в общем случае
    div.operation-selector {
      width: 860px;
      margin: auto;
    }
    Ответ написан
    Комментировать
  • Как убрать слеш в конце главной страницы?

    RewriteEngine On
    RewriteCond %{REQUEST_FILENAME} !-d
    RewriteCond %{REQUEST_URI} /(.+)/$
    RewriteRule ^(.+)/$ /$1 [L,R=301]

    Или:

    DirectorySlash Off

    https://www.slingacademy.com/article/apache-htacce...
    Ответ написан
    Комментировать
  • Как передать значение из Select2 в другую функцию?

    @catch-a-chalk
    Привет!
    $(document).ready(function() {
        // инициализация Select2
        $(".city").select2({
            ajax: {
                url: "/ajax.php?action=main&type=get_city",
                type: "post",
                dataType: 'json',
                delay: 250,
                data: function(params) {
                    return {
                        searchTerm: params.term
                    };
                },
                processResults: function(response) {
                    return {
                        results: response
                    };
                },
                cache: true
            }
        });
    
        // глобальная переменная для хранения выбранного города
        let selectedCity = null;
    
        // обработчик выбора города
        $('.city').on('select2:select', function(e) {
            selectedCity = e.params.data.id; // или e.params.data.text в зависимости от того, что нужно
            console.log("Выбран город:", selectedCity);
        });
    
        // основная функция фильтрации
        function getFilter() {
            let action = 'get_data';
            let category = filterCategory('category');
            let city = selectedCity; // используем сохраненное значение города
            
            $.ajax({
                url: '/ajax.php?action=main&type=get_data',
                method: 'POST',
                data: { 
                    action: action, 
                    category: category, 
                    city: city 
                },
                success: function(response) {
                    $('#filterResults').html(response);
                }
            });
        }
    
        function filterCategory(classname) {
            let filter = [];
            $('.' + classname + ':checked').each(function() {
                filter.push($(this).val());
            });
            return filter;
        }
    
        $('.filter_click').click(function() {
            getFilter();
        });
    });
    Ответ написан