• Как верстать картинки?

    @mr-troll
    Сделал два простых примера, с адаптивностью:
    https://usabili.ru/labs/mockup/ собственно зацикленная анимация
    https://usabili.ru/labs/mockup/onscroll.html - js анимация привязанная к скролу окна.

    > это как без js привязать таймлайн анимации к скроллу? Я чего то не знаю? ))

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

    > мне мало интересны посетители со старыми нокиями
    > на сафари анимация смещения бекграунда часто дерганая при быстром скролле

    мне мало интересны посетители со старыми iphone 11 pro =) я с компа сижу, тут и аппаратное ускорение, и прочие фишки. Тем не менее, чтобы у вас в сафари анимация не лагала, надо понимать как она устроена и что тормозит. У реального пользователя (как я) на айфончике или, там, самсунге, будет открыть 40 вкладок в браузере, и 20 приложений - музыка, мессенджеры и прочее. Поэтому ресурсы чтобы обрабатывать вашу анимацию будут очень ограничены. Поэтому надо профилировать. Например в хроме в девтулз открыть вкладку performance - выбрать там cpu 6x slowdown и посмотреть. Если в анимации будет ~60fps - то всё хорошо.
  • Почему перестало работать объявление функции?

    @mr-troll
    Она нигде не вызовется, ошибка на этапе парсинга js. Мне кажется перед этим куском чего-то не хватает, может какая-то точка с запятой отсутствует. Покажите более полный пример.
  • Google отказывается принимать почту с нашего домена, что делать?

    @mr-troll
    Что означает "очень большое количество раз"? У меня во время профилактических работ (ночью, в выходные) легко приходило до 3000 писем однотипных, с отчётами об ошибке например. И ничего. Рассылки тоже идут.
    Другое дело, вы написали выше, что отправляете почту через гугловый smtp, т.е со своего гмайл ящика - там действительно могут быть лимиты. Шлите сервером, и будут у вас и dkim, spf, dmark.
  • Стоит ли хранить базы данных на SSD?

    @mr-troll
    Лентюй, у нас боевые базы на ssd уже лет 10, прекрасно себя чувствуют, вместе с системой.
    Бекап раз в сутки. Если диск у вас крякнется его восстановить тоже сутки, так и так, не меньше. И hdd может крякнутся,чо. Если критично раз в полчаса - держите резервный сервер и бекапте туда. Плюс инкрементальный лог запросов =) Но всё равно если полетит ночью за полчаса не поднимите
  • Как писать FrontEnd не "колхозно"?

    @mr-troll
    Слишком часто дом дёргать не надо. 2 раза достаточно. Тут важно помнить, что большинство твоих обращений к dom могут вызвать realign, или даже полный reflow документа.
    объясняю чо такое:
    У тебя есть таблица на 10000 строк.
    Браузер считавет кусок (chunk) информации, в несколько килобайт. захватив например 1000 строк. Кладёт в dom.
    Параллельно начиная рисовать dom на экране. Типа шапку таблицы, где она расположена относительно других элементов, какая ширина, высота у неё, несколько строк первых. В это время html-парсер парсит дальнейший html в некий временный dom. Браузер заканчивает отрисовку и говорит чо там ещё у нас в доме? О, ещё 1000 строк. Перемещает из временного дом в основной и начинает рисовать их. Проверяя там всякие размеры снова, позиционирование, слои. Это называется realign, если вдруг в 1001й строке таблице контент оказался шире чем в предыдущих 1000. В этот момент ты говоришь браузеру чо там по тегам инклуд, querySelectorAll('include')? Браузер такой, блин, чо-то от меня хотят. Дайте мне dom весь какой прошли, заньте туда из временного не отрисованного дом 10000 элементов. Выдаёт тебе результат селектора. И такой, нифига ж тут дом поменялся, делаем пересчёт всего заного, и заново рисует тебе всю таблицу, понятно имея чуть больше данных, но всё равно ты его принудительно дёрнул её перерисовать. Поэтому если прям жёстко дёргать события изменения дома - то fps отрисовки печально просядет.
    Поэтому и идея дёрнуть два раза. Один когда твоя библиотека подгрузилась. Второй когда дом и так уже весь готов и начально отрисован. (Рефлоу и репейнтов после загрузки конечно ещё много будет, когда там шрифты загрузятся, картинки, они тоже всё принудительно заставляют пересчитать, но это уже отдельная тема).
  • Как писать FrontEnd не "колхозно"?

    @mr-troll
    Вот тут, как я понимаю, и есть разрыв: неполный DOM при первом вызове!
    И моя библиотека и браузерный DOM-обходичик будут в режиме race condition, используя HTML-текст (для заполнения DOM), как общий входной пул.

    В целом так, да. Но у тебя нет задачи race condition. Т.е. не надо пытаться отловить когда прям появился нужный элемент в доме. Достаточно просто запустить функцию когда будет собственно загружена сама функция. И всё. А потом загрузить когда будет готов весь дом.

    Может можно, чтобы не дёргать потом 2-й раз:
    1. Как-то следить за "курсором" браузерного обработчика по HTML-разметке во время его прохода при формировании DOM?

    Увы, нельзя. Точнее можно, но это будет ООЧЕНЬ тормозить систему.

    2. Или попробовать обработать в своём скрипте (распарсить "вручную")
    HTML-разметку при первом вызове (избегая DOM)? Но не будет ли это медленнее?

    Не очень понял. Но короче я предлагаю только 2 вызова. При этом второй раз скорее всего будет вхолостую, т.е первый уже всё сделает. Это быстро. Там единственный медленный момент, это
    node.querySelectorAll('include,div[data-src],div[data-include]');
    Я бы поставил жёсткое условие ставить на все нужные элементы - класс. Например - это конечно будет менее элегантно, зато селектор по классу ну очень быстрый. И после прохода как раз просто этот класс убрать - чтобы второй проход его не учитывал.

    3. Или, после завершения обхода начального "дерева" (тех тегов, что уже обходчик браузера загрузил выше), проверить наступление события изменения DOM-структуры (если не дошли до события window.onload), и если DOM изменился - рекурсивно себя дёрнуть, чтобы не ждать window.onload ?

    Ну моё предложение не привязываться к onload, а привязаться к domloaded, ну и дёргание себя, не рекурсивно а просто первый раз сам себя дёргаешь, а второй по событию. И всё. Этого на 100% достаточно.

    Т.е. как-то надо понять, как самому лучше превратиться в обходчика разметки напару с браузером не ожидая и не мешая друг другу)

    У Пола Айриша есть вроде выступления на тему как браузер что парсит. У кого-то ещё не помню.
    У Дмитрия Сошникова можно про контексты исполнения почитать dmitrysoshnikov.com/ecmascript/javascript-the-core... там идея в том что вычисления в основном потоке - например синхронны. Например в момент твоей работы с dom - браузер временно тормознёт любую свою работу с дом.
  • Как писать FrontEnd не "колхозно"?

    @mr-troll
    xmoonlight, Щас постараюсь ответить. Можно либо в почту или скайп перенести дискуссию. либо раз уж это образовательный ресурс - продолжим флудить здесь. И я максимально простыми словами постараюсь изложить мысль.

    Итак. Для начала. Схематичный код твоей библиотеки. Для тех кто не смотрел гитхаб:
    (function() {
    	window.includeHTML = function(src, destination, callback) {
    	}
    	function includeHTMLAuto(node) {
    	}
    	var old_onload = window.onload;
    	window.onload = function() {
    		old_onload && old_onload();
    		includeHTMLAuto(document.body);
    	}
    })();

    Комментирую что происходит тут. В текущий момент, ты можешь скрипт загружать с async, без async, с defer как хочешь. Разницы НЕТ! Она в любом из вариантов (код библиотеки), спарсится до события window.onload.
    Поэтому, она привязывается к этому событию. Потому что, оно, в любом случае, произойдёт после подгрузки этой библиотеки.

    Далее. Отступление. Что такое загрузка dom и что такое блокирующий скрипт:
    Контент документа не загружается сразу весь. Он парсится последовательно. Пример:
    <html>
    <title>boo</title>
    <script src="foo.js">
    <p>something</p>
    </html>

    В данном случае начнёт загружаться html в domcontent. Загрузится титл. Дойдёт до скрипта и всё. Остановится. Параграф не попадёт на первом шаге в дом. Потому что скрипт foo - блокирующий. Браузер остановит вообще всё. Будет загружать foo.js, парсить его и выполнять. Только после этого добавит в дом параграф.
    Почему? Потому что браузер ожидает что этот скрипт может коренным образом поменять весь дом.
    Например в foo.js может быть
    document.write('<h1>somethign</h1>');
    Т.е. это равносильно коду
    <html>
    <title>boo</title>
    <h1>somethign</h1>
    <p>something</p>
    </html>

    Т.е. сначала он всё выполнит в яваскрипте, потом пойдёт парсить дальше, увидит что появился <h1> вставит его в документ. И только после этого вставит параграф.

    Теперь рассмотрим событие domcontentloaded относительно скрипта foo.js. На момент выполнения foo.js - документ не загружен полностью, событие не наступило. Но, с уже загруженными частями документа (например <title>) скрипт может работать.

    Допустим вместо foo.js - твоя библиотека includehtml.js , а вместо title некий <div data-src="menu.html"></div>

    <html>
    <div data-src="menu.html"></div>
    <script src="includehtml.js">
    <div id="load_later" data-src="load_later.html"></div>
    </html>


    Поменяем твою библиотеку следующим образом:
    (function() {
    	window.includeHTML = function(src, destination, callback) {
    	}
    	function includeHTMLAuto(node) {
    	}
    	var old_onload = window.onload;
    	window.onload = function() {
    		old_onload && old_onload();
    		includeHTMLAuto(document.body);
    	}
    
    	includeHTMLAuto(document.body); // - добавили это
    })();


    Что произойдёт. Браузер начнёт парсить dom, найдёт див. вставит. Найдёт твою библиотеку. Выполнит.
    Библиотека просканирует текущий dom, в document.body будет только один тег, див. Оно его там начнёт асинхронно грузить, в это время уже пойдёт дальнейшая работа с дом. Он загрузит #load_later, и начнёт условно подгружать другие ресурсы если есть, картинки там, видео и т.п.
    Когда всё загружено, выполнится window.onload, и начнёт уже загружаться твоя старая функция, (т.е. прошло куча времени с момента запуска), и загружит таки load_later.html

    Далее. Нам надо рассмотреть два следствия. Что будет когда includehtml.js будет таки загружен как async, и что будет если поменять window.onload на document.DOMContentLoaded. Начнём по порядку.
    Поменяем код на
    <html>
    <div data-src="menu.html"></div>
    <script async src="includehtml.js">
    bla bla bla some code
    <div id="load_later" data-src="load_later.html"></div>
    bla bla bla some code 2
    </html>


    Какое отличие? Скрипт не будет блокировать парсинг дом. Это раз. Т.е. браузер вставит тег скрипт за меню и пойдёт дальше парсить документ. Этот скрипт больше никак не влияет вообще на парсинг dom браузером.
    includehtml.js - начнёт грузиться как минимум после того как в дом вставится <div data-src="menu.html"></div>.
    Когда он загрузится и выполнется - он обработает menu.html. Будет ли на этот момент в доме #load_later или нет - не известно. Скрипт асинхронный, когда загрузится тогда загрузится. Он может выполниться раньше, а может позже. Может выполниться даже после ВСЕЙ ЗАГРУЗКИ DOM! Важно. Т.е. после события domcontentloaded.

    Что будет если просто поменять window.onload - на domcontentloaded? Ну. скрипт очевидно будет обрабатываться быстрее, потому что сперва наступает domcontentloaded. Но что если скрипт асинхронный и загрузится после этого события? includeHTMLAuto внутри навешенного обработчика - не выполнится. А вот прямой вызов, который мы добавили вне обработчика - выполнится.

    Т.е. схема работы при загрузке библиотеки будет:
    1) выполнить includeHTML - какой есть
    2) по загрузке dom выполнить что осталось.

    При этом конечно надо поправить библиотеку так чтобы она поддерживала эти два вызова. Т.е. не загружала повторно menu.html например.

    Вроде объяснил =)
  • Как писать FrontEnd не "колхозно"?

    @mr-troll
    сохранять всю статику в локал-сторадж - думал,

    Можно сделать флажок, типа enable_cache_in_local - внутри самой функции. Скорее всего когда грузят - выберут какой-то один вариант. Есть ещё sessionstorage если не засорять хочется.
    Она стартует и сейчас сама автоматически сразу, после инициализации функции

    Нет. Порядок событий такой:
    1) Сперва весь html парсится в dom-content. Останавливая отрисовку на всех блокирующих ресурсах. Т.е. стили, скрипты без async, defer, или module. Когда они загрузились и отработали - запускается domcontentloaded, с домом уже можно работать.
    2) потом начинают загружаться все картинки, ифреймы и прочие не блокирующие ресурсы, (например шрифты с font-display). Запускаются defer скрипты и т.п. Когда загрузились они - запускается window.onload.
    Асинхронные скрипты - в любой момент времени, но до события window.onload.
    Т.е. у тебя есть код
    <html>
    <script ASYNC src="includehtml.js">
    <div id="menu" data-src="instant_menu.html"></div>
    <link rel="stylesheet" href="1mb_style.css" type="text/css">
    ... blabla bla ... куча кода дальше. 
    <div id="defer_load" data-src="defer_load.html"></div>
    <img ..><img ..><img ..>
    </html>

    У тебя начнёт парсится дом. Дойдёт до асинк скрипта, начнёт его грузить асинхронно. Дойдёт до #menu, вставит div в dom. Начнёт грузить большой файл. Долго. Вероятнее всего уже на этом этапе отработает async скрипт, и должен, (по моей задумке) , запуститься первый раз. И собрать всё что он уже успел в доме найти. Например menu. Запустит асинхронную подгрузку и всё. Дальше браузер пойдёт параллельно обрабатывать стили, и потом грузить дальше весь остальной код в дом, включая #defer_load. Когда всё загрузит, наступит domcontentloaded, вот на него надо бы повесить уже второй повторный обработчик который пройдёт и начнёт асинхронно грузить то что скрипт не догрузил когда выполнился.
    Потом начнут грузиться картинки всякие. И наступит window.onload. Когда уже прям куча времени прошло. Т.е. если страничка вся грузится секунд 5-20 (поставь 3g эмуляцию в браузере), то критичные куски кода, например меню, будут без наполнения. Сайт будет не юзабельным, и юзер заплачет.
    Тут правило простое. На window.onload вешают все незначительные вещи. яндекс.метрику, чаты типа Jivosite, и т.п.
    Всё остальное надо запускать asap, либо по готовности документа.
    При этом, ещё пункт про нужность двух запусков. Асинхронный скрипт может запуститься после domcontentloaded, а тут ты бац, и запустишь первый проход не зависимо от этого принудительно. =)
  • Как писать FrontEnd не "колхозно"?

    @mr-troll
    xmoonlight, очень понравился скрипт, полезный. Только async вариант не асинхронный, т.к ждёт загрузки 1. самой библиотеки ,2.html страницы. Т.е когда ваш скрипт погружен как async, нужной функции, очевидно, не будет.
    Тру асинхронный вариант будет как раз через атрибуты тегов.
    Для этого надо запускать не по window.onload,а по domcontentready, сам скрипт с async, и вообще сперва при загрузке скрипта запустить функцию, а потом и по загрузке дома. Будет прям очень быстро работать.
    А ещё... Написать обертку с localstorage, и грузить туда, чтобы типа один раз всего грузить статику. Будет прям огонь
  • Как изменить таблицу чтобы она стала динамическая на php?

    @mr-troll
    Сложно подсказать, в примере всё форматирование сьехало.
    Основной затык у вас в переменной firstrow, как я вижу. Поскольку вам надо сделать таблицу, а не по одной записи на строку выводить с то вам надо сделать вложенные циклы
    Foreach (недели....) {
    For(day=0;day<6;day++) - дни недели

    В каждой неделе свой tr, в каждом дне свой td. Вынести все стили и атрибуты оформления в классы css. Сразу код читабельней будет.

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

    @mr-troll
    Xdevelx, как это сделать? 20 версий назад там можно было проходить по страницам сайта. Сейчас coverage для одностраничников.
  • Насколько оправдано использование VUE?

    @mr-troll
    А почему должно не хватать возможности jquery, если у вас бекенд на php? Даже нативный js достаточно хорош. Тут загвоздка в том, что значит редактировать таблицы.
    Визуальником они обычно не редактируются потому что юзеры выставят что-то не так.
    Вам нужна таблица с возможностью добавления строки и удаления любой строки, где каждая строка - набор инпутов типа
    например, без всяких аяксов.
    Разница между jquery и чистым js, 2-3 строчки на каждую функцию.
    Использовать поверх этого vue, не даст ни скорости разработки ни быстродействия.
  • Как сделать, что бы jquery скрипт срабатывал на определенном медиазапросе?

    @mr-troll
    Underdoggit, эту штуку надо засунуть ещё в $(window).on('resize',function(
    Чтобы учитывать возможную смену размеров экрана
  • Почему не работает функция php?

    @mr-troll
    FanatPHP, я читал и коммитил по поводу mysql_real_escape_string, спасибо. Троллинга тут нет. Про возможные уязвимости, навскидку https://stackoverflow.com/questions/134099/are-pdo... , публиковали ещё ряд багов на whb (до того как его прикрыли)
  • Почему не работает функция php?

    @mr-troll
    Не рекомендую использовать подготовленные запросы. В php их нет (ни в mysqli, ни в pdo). Во многих ЯП prepared statements реализованы как подготовка запроса и послание переменных в него по отдельному каналу, что даёт защиту от инъекций. В пхп весь запрос идёт по одному каналу и язык сам вам сделает запрос в виде одной строки, вставив переменные в запрос используя mysql_real_escape_string (внутреннюю), а эта функция не преднозначена для защиты от инъекций, что может сбивать с толку. В определённых условиях (utf32) можно всё поломать. Читайте сырцы пхп.
  • Как оптимизировать поиск телефонного номера (часть строки)?

    @mr-troll
    Александр, поиск по середине - не то что указано в условии вопроса. Только like, фултекст вам не поможет тут, это индекс отдельных слов. А у вас одно "слово" в столбце.
  • Как оптимизировать мой код на PHP и сократить повторение функций для немного различимых переменных из массива?

    @mr-troll
    Sp1keazyYT, в том что тут 5 строчек, а не 10, и легко можно понять что происходит, а у тебя ненужные вызовы функций, лишние переменные, и работает в 100 раз медленнее! Тебе оптимизация нужна или что?
    А делать форич по трём статическим свойствам - это паттерн плохого программирования, никакого код-ревью не пройдёт.