Ответы пользователя по тегу JavaScript
  • Могут ли ошибки в консоли Хрома забить оперативную или постоянную память, если да, то как это предотвратить?

    @rPman
    само по себе сообщение об ошибке занимает мало времени и чтобы это стало заметно нужно действительно много
    но вот отладочная информация, когда в console.log выводится объемный объект и очень много - занимает прилично оперативной памяти (так как весь объект копируется и хранится в памяти чтобы в интерфейсе его можно было посмотреть) у меня был пример когда окно firefox работало больше суток и отладочная информация нагрузило так сильно оперативную память что был задействован своп файл и сам браузер дико тормозил, но очистка консоли тут же все исправило

    вызывай скриптом consloe.clear() типа такsetInterval(()=>console.clear(),3600*1000)для автоматической очистки консоли раз в час, этого будет более чем достаточно
    Ответ написан
    Комментировать
  • Ограничение работы 2 пользователей на одном сайте?

    @rPman
    направления решения задачи многопользовательского редактирования:

    - нулевое, самое злобное для клиентов, выдавать ошибку, при попытке сохранить документ, если его редактировали, обновлять форму и предлагать ввести все заново, реализуется полем 'last modified time', которое загружается на форму и отправляется с запросом на обновление, если сервер видит их разными - писать ошибку.

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

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

    - третье, наилучшее в современных реалиях, применять изменения и выводить их в тот же момент как они вносятся на форму, как документы google docs, видно в какой ячейке какой пользователь сейчас поставил курсор, можно даже подсвечивать цветами, с затуханием. Рекомендуется, как ни странно достаточно проста в реализации, если интерфейс client side javascript а не генерация html на сервере.

    Все три способа требуют оперативную информацию о наличии блокировок пользователями, что реализуется с помощью вебсокет
    Ответ написан
    Комментировать
  • Как можно ускорить парсинг json?

    @rPman
    897kb
    надо почти мегабайт скачать! я не верю что у тебя с твоим интернетом за 80миллисекунд это происходит, скорее все из кеша берется

    на парсинг json как раз уходит несколько десятков миллисекунд, и это нереально быстро для мегабайтового файла

    p.s. на c++ есть парсер simdjson, он в десять раз быстрее парсит, но делает он это не в память, а по лексемам, прямо в процессе анализа результата, там что то типа, получить следующую лексему, смотрим ее тип, имя и либо пропускаем (включая объхекты) либо рекурсивно работаем с объектом

    браузер так не умеет, в теории можно попробовать написать такой парсер на javascript но я не верю что это будет быстрее

    upd: https://www.npmjs.com/package/simdjson
    Ответ написан
    2 комментария
  • Как реализовать проверку и подгрузку файлов между серверами?

    @rPman
    Не советую изобретать свою систему, пользуйся готовым rsync, который может работать как по своему протоколу (рекомендуется, для этого на обоих сторонах запускается rsyncd) так и к примеру по ssh, так же штатно scp умеет копировать только изменившеися файлы по ssh, ничего дополнительно настраивать и устанавливать не надо.

    по теме, я пилил простенькую програмку, на сервере-источнике маленький php сервер, возвращающий список новых файлов (у меня было много серверов источников файлов, и один клиент, он запрашивал список с каждого, проверял наличие их локально и скачивал отсутствующие), а каталог с файлами расшарен как обычный каталог со статикой в веб сервере, файлы загружались с помощью wget (у него штатная поддержка докачки прерванных, но можно что-нибудь еще поискать)
    Ответ написан
    Комментировать
  • JS: Бесконечная загрузка контента без лагов страницы - какие есть библиотеки?

    @rPman
    это называется virtual scrolling
    погугли готовые решения есть, чаще заморочки с поддержкой одновременно pc/mobile

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

    Совет, если человек скролит с меньшим интервалом времени или сразу следующую страницу, запрашивай у бакэнда большего размера окно чем обычно, так как это типичный паттерн проскролировать 'подальше'
    Ответ написан
    Комментировать
  • Как проверить ссылку RSS?

    @rPman
    если ссылку спрашивать у пользователя, то он сам дурак, если даст неверный тип контента

    с высокой вероятностью в ссылке будет слово rss (либо type=rss, так многие cms-ки экспортируют свои статьи туда либо .rss) но само собой никто ничего не гарантирует, никаких стандартов на это нет

    как правильно - запрашиваешь по ссылке заголовки, без контента, и смотришь Content-Type должен быть тип text/rss+xml или application/rss+xml, редко бывает text/xml или application/xml но тут дальше только по содержимому
    Ответ написан
    Комментировать
  • Как защитить переписку от MITM атаки?

    @rPman
    Имеется функция, с помощью которой при общении смс не летят на сервер, то есть общение идет в барузере, закрыли вкладку и смс улетели
    вы доверяете коду, который браузер подгружает с сервера?
    Если на сервер данные не идут, значит используется webrtc, шифрование там заявлено но не совсем ясно что тут работает удостоверяющим центром, не сервер ли случайно? которому приходится доверять, так как формально обладая всеми этими данными и технической возможностью владелец сервера смог бы устроить MITM между клиентами.

    если ключи шифрования передавать лично из рук в руки, то можно передавать шифрованные сообщения поверх любого ненадежного протокола, есть даже плагины OpenPGP к браузеру, правда найти достаточно популярного и удобного я не смог, есть к примеру maiilvelope заявлено что автоматически работает с почтовыми сервисами, шифруя текст на стороне клиента, но добавить свой домен не получилось...
    Ответ написан
    Комментировать
  • Как работает цикл for и fillRect() в данном примере?

    @rPman
    для затирания хвоста змейки нужно хранить его тело, в виде массива (размер которого - длина змейки) координат. Этот массив - это fifo буфер, т.е. тебе нужно хранить указатели на начало и конец, делая шаг змейки, ты добавляешь новую запись в массив, стираешь квадрат по координатам самой старой записи и удаляешь эту запись, сдвигая оба указателя.
    Ответ написан
    1 комментарий
  • Как сделать эмуляцию нажатии кнопки на сайте?

    @rPman
    Нажимаешь правую кнопку на нужном тебе элементе на странице (иногда надо добавлять shift+) выбираешь Инспектор (Исследовать) и получае консоль разработчика, она выберет нужный html элемент либо выбирай сам, правую кнопку на нем, выбирать copy -> css selector

    Получишь в буфере css селектор для данного элемента, очень часто он правильный
    Теперь тут же в консоли пишешь команду
    $('вставь_сюда_селектор').click();
    на нужный элемент будет сэмулирован клик мышкой.
    Можешь добавить больше кода и логики, например кликать через указанный интервал - setTimeout

    Если надо автоматизировать при загрузки страницы, бери расширение greasemonkey (tampermonkey), оно позволяет запускать пользовательские скрипты по разным условиям
    Ответ написан
    1 комментарий
  • Как включить немецкий язык в синтезаторе речи?

    @rPman
    а соответствующий голос в синтезаторе на машине есть?
    window.speechSynthesis.getVoices()

    на хроме работает
    var u = new SpeechSynthesisUtterance('Ich bin nicht sicher, dass er ein gutes Beispiel wäre.');
    u.voice=speechSynthesis.getVoices()[2]; // SpeechSynthesisVoice {voiceURI: 'Google Deutsch', name: 'Google Deutsch', lang: 'de-DE', localService: false...
    speechSynthesis.speak(u)

    upd. очень странно инициализируется в первый раз в браузере язык, самый первый раз выбирая язык может остаться язык по умолчанию, но повторная попытка через некоторое время срабатывает, полагаю браузер подгружает поддержку локально (она несколько мегабайт вестит)
    Ответ написан
  • Как вы обычно храните данные об объектах на странице, которые вернул php?

    @rPman
    Получаешь ты от php всегда строку, пусть сервер дает тебе json твоих объектов (jquery автоматически его парсит), парсить самому можно с помощью JSON.parse(str)
    без AJAX получить эти объекты на стороне php до загрузке страницы.
    ajax это не магия, а штатный метод XMLHttpRequest, конечно можно вспомнить древние техники получения данных от сервера в javascript файлах вида вызова функции с json
    object_received({...});
    подключая их как обычный скрипт
    <script type="text/javascript" src="request_data.php"></script>
    Ответ написан
    Комментировать
  • Почему происходит такое с WebSocket?

    @rPman
    Можно ли как-то это поправить? Или есть альтернатива может?

    WebWorker должен работать не зависимо от того, активная вкладка или нет
    Ответ написан
    Комментировать
  • Как удалить переменные из URL страницы без её перезагрузки?

    @rPman
    в приведенном примере - невозможно
    но если переменные хранить с использованием anchor:
    https://site.com/payment#id=12345678910

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

    Этим активно пользуются в SPA приложениях, когда реально страница грузится один раз за все время работы сайта, а все остальное подгружается с помощью ajax
    Ответ написан
  • Как добавить свой код на чужой сайт?

    @rPman
    Это функция глобальная или метод какого то класса?

    В любом случае ты можешь переопределить эту функцию на свою, просто определив ее заново, протестируй в консоли руками, потому просто вставь тот же код в tempermonkey (этот плагин позволяет вызывать твой код javascript в зависимости от ссылки страницы)
    Ответ написан
    Комментировать
  • Как с iframe youtube видел убрать рекомендуемое видео и логотип канала?

    @rPman
    Мысли в порядок приведи, не понять что ты хочешь.

    Ты хочешь на свой сайт фоном поставить видео, хостящееся на youtube и при этом не желаешь 'платить' либо деньгами за соответствующую подписку гуглу либо рекламой с него? тут только пропускать трафик через свой сервер (а там фильтруй что угодно) в теории можно ковыряться в форматах (то чем занимается разработчик youtube-dl, кстати он в конце концов выдает ссылку на raw видео и ее можно попытаться выдать на сайт но это счастье будет не на долго)

    Или же ты хочешь удалить проигрывание видео с чужого сайта с помощью плагина типа adblock или ublock origin и не знаешь как это сделать с помощью css фильтра?
    Ответ написан
    Комментировать
  • Как сделать цикл с setInterval который запускался и останавливался через каждые 10 секунд?

    @rPman
    Ты вызываешь count, запускающую новый setInterval рекурсивно , сразу как срабатывает тик интервала, т.е. с каждым новым тиком количество интервалов у тебя увеличивается, лимиты ресурсов у браузера заканчиваются и вот ошибка.

    setInterval должен быть запущен однократно.

    Код в примере и задача в вопросе отличаются, что нужно то?
    Если исходить из задачи, нужно создать setTimeout, который через 10 секунд запустит setinterval с 1 секундным шагом, который уже в свою очередь будет вызывать твой принт и только его
    Ответ написан
    1 комментарий
  • Заполнение и отправка формы в точно указанное время, можно ли?

    @rPman
    Скрипт будет зависеть от верстки сайта, и будут меняться при ее изменении. Браузеры имеют вместе с консолью разработчика отличный инспектор, если нажать правую кнопку мыши на желаемом элементе на форме (если возможность заблокирована, то нужно жать shift+правая кнопка мыши) и выбрать Inspect/Посмотреть код, а затем уже в открывшемся инспекторе выделить нужный элемент (input например) и в меню выбрать Copy -> CSS selector, то полученную строку можно напрямую скормить $('строка css selector') и получить нужный элемент, у которого можно править .value=xxx или нажимать .click(). Могут возникнуть сложности с кастомными select или там где форма отслеживает нажатия на клавиатуре,..

    В борьбе с блокировщиками рекламы и автоматизаторами некоторые веб разработчики научились создавать такую верстку, что в ней сложно определить простые правила css selector, так как они будут меняться (но не невозможно, например с помощью getBoundingClientRect() к каждому элементу на странице можно определить его координаты (и видимый ли он) и уже по координатам идентифицировать нужный (блокировщики пока не умеют его использовать но автоматизаторам уже не проблема), так же можно поглядывать на текстовое содержимое, например выделяя подписи к элементам формы.

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

    Работа творческая, и без возможности провести управляемый и повторяемый эксперимент, почти обречена на провал (точнее твой автоматизатор ничем не будет выделяться по сравнению с другими)

    p.s. а потом осознать, к примеру, что декларируемые и фактические правила получения скидки у владельца сервиса - отличаются.
    Ответ написан
    Комментировать
  • Как скопировать числа из кода и вставить в код, но в iframe?

    @rPman
    Если фрейм на том же домене что и создавшее его окно, то получив элемент штатно getElemenById а затем получай его document вот так:
    var frameDocument = myFrame.contentDocument || myFrame.contentWindow.document

    Так же можно получить доступ к фрейму (точнее его winodow) если задать ему атрибут name с помощью:
    window.frames["имя фрейма"]
    и уже от полученного получить document

    Имея доступ к document, можно уже запрашивать любые элементы на странице и править их

    p.s. там много исторических наслоений от разных браузеров, советую протестировать выбранный способ, в т.ч. на мобильных

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

    Полный доступ к содержимому фреймов имеют браузерные плагины, или к примеру твой собственный браузер на базе готовых компонент
    Ответ написан
  • Может-ли быть пустой JS на 1 Гб?

    @rPman
    проверять наличие не пробелов в файле лучше автоматически а не глазками, натрави утилиту wc на него (скажет сколько слов в нем, т.е. всего что между пробелами) и строк

    можно простым sed скриптом поменять 'лишние' пробелы в скрипте на одиночные и посмотреть что там действительно есть
    sed -e 's/ */ /g' src.js > dst.js

    Гигабайтовый js это может быть ресурсная бомба для ddos-а твоего сайта (например вебсервер настроен на сжатие файлов на лету, т.е. сетевой трафик в результате не будет тратиться но вот ресурсы сервера на отдачу пустого файла - будут огого)
    Ответ написан
    3 комментария
  • Можно ли поменять адрес сайта после отправления формы с использованием данной одного поля в виде utm метки?

    @rPman
    да, разрешаю.

    формируешь новый url на основе данных формы и делаешь
    window.location.href = полученная ссылка;
    Ответ написан
    Комментировать