Задать вопрос
  • Можно ли в цикле foreach взаимодействовать с элементами цикла?

    zkrvndm
    @zkrvndm
    Архитектор решений
    vegs.forEach((veg, index) => {
        if (index === 0) {
            veg.classList.add('active');
        }
    });
    Ответ написан
    Комментировать
  • Как сделать переход между страницами без перезагрузки?

    zkrvndm
    @zkrvndm
    Архитектор решений
    Ниже пример функции для загрузки контента страниц по AJAX и без перезагрузки страницы:
    async function pageUpdate(event) {
    	
    	// Если функция вызвана без аргументов:
    	
    	if (typeof event == 'undefined') {
    		
    		// Устанавливаем обработчики
    		// на все ссылки на странице:
    		
    		$('body a[href]').click(pageUpdate);
    		
    	}
    	
    	// Если функция вызвана
    	// в результате клика
    	// по ссылке:
    	
    	else {
    		
    		// Берём адрес с нажатой ссылки
    		// и записываем в переменную link:
    		
    		var link = event.target.href;
    		
    		// Если ссылка ведет на наш сайт:
    		
    		if (new URL(link)['host'] == location.host) {
    			
    			// Предотвращаем переход:
    			
    			event.preventDefault();
    			
    			// Блокируем страницу, чтобы
    			// больше нельзя было кликать:
    			$('body').css('pointer-events', 'none');
    			
    			// Активируем анимацию исчезновения (полупрозрачности):
    			
    			var hide = $('body').animate({ opacity: 0.2 }, 500).promise();
    			
    			var ajax = $.ajax(link); // Запускаем загрузку новой страницы
    			
    			await hide; // Ждем окончания анимации исчезновения
    			
    			// Вставляем данные на страницу беря их с ново-скачанной страницы:
    			
    			var doc = new DOMParser().parseFromString((await ajax), 'text/html');
    			var html = $('body', doc).html();
    			$('body').html(html);
    			
    			// Скролим в самый вверх:
    			$('body, html').animate({scrollTop: 0}, 0);
    			
    			// Меняем адрес в адресной строке:
    			history.pushState(null, null, link);
    			
    			// Заново ставим
    			// обработчики:
    			
    			pageUpdate();
    			
    			// Активируем анимацию
    			// постепенного появления:
    			
    			await $('body').animate({ opacity: 1 }, 500).promise();
    			
    			// Снимаем блокировку с документа:
    			
    			$('body').css('pointer-events', '');
    			
    		}
    		
    	}
    	
    }
    
    pageUpdate();

    Функция перехватывает клики по ссылкам, добавляет анимацию и обновляет контент страницы без перезагрузки.

    Важно! Если на сайте есть какой-то сложный функционал, данный скрипт скорее-всего их сломает!
    Ответ написан
    Комментировать
  • Как синхронно получить Data URL?

    zkrvndm
    @zkrvndm Автор вопроса
    Архитектор решений
    Alexandroppolus к сожалению оказалось, что используя XMLHttpRequest нельзя загрузить файл как ArrayBuffer в синхронном режиме, такое возможно только, если запрос идет асинхронно, но мне ни что не мешает скачать файл, как текст, а затем этот текст уже перегнать в Uint8Array при помощи TextEncoder, а дальше уже его конвертировать в Base64 используя код из предложенного тобой плагина.

    Соответственно после такой конвертации получить так желаемый мной Data URL:
    var request = new XMLHttpRequest();
    request.open('GET', '/', false);
    request.send(null);
    
    if (request.status === 200) {
    
    	var type = request.getResponseHeader('Content-Type').split(';')[0].toLowerCase();
    	var u8a = new TextEncoder().encode(request.responseText);
    
    	var chars = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/';
    
    	var bytes = u8a, i, len = bytes.length, base64 = '';
    
    	for (i = 0; i < len; i += 3) {
    		base64 += chars[bytes[i] >> 2];
    		base64 += chars[((bytes[i] & 3) << 4) | (bytes[i + 1] >> 4)];
    		base64 += chars[((bytes[i + 1] & 15) << 2) | (bytes[i + 2] >> 6)];
    		base64 += chars[bytes[i + 2] & 63];
    	}
    
    	if (len % 3 === 2) {
    		base64 = base64.substring(0, base64.length - 1) + '=';
    	}
    
    	else if (len % 3 === 1) {
    		base64 = base64.substring(0, base64.length - 2) + '==';
    	}
    
    	var data_url = 'data:' + type + ';base64,' + base64;
    
    	console.log(data_url);
    
    }
    
    else {
    	
    	console.log('Ошибка', request);
    	
    }

    Главное, все это работает синхронно и метод можно применять для модификации скриптов сайта на лету через фоновый скрипт своего браузерного расширения, т. е. перехватываем запрос и делаем редирект на Data URL.
    Ответ написан
  • Как убрать .html в конце адреса каждой веб-страницы сайта?

    zkrvndm
    @zkrvndm
    Архитектор решений
    Размести на странице:
    <script> history.replaceState('', '', location.pathname.replace(/\.html$/i, '')); </script>

    Это будет убирать .html в конце, НО если потом попытаться обновить страницу, будет ошибка.
    Ответ написан
    Комментировать
  • Как отследить прогресс загрузки файла php?

    zkrvndm
    @zkrvndm
    Архитектор решений
    Попробуй так:
    $.ajax({
    	url: url,
    	type: 'POST',
    	dataType: 'JSON',
    	data: formData,
    	async: true,
    	cache: false,
    	contentType: false,
    	processData: false,
    	success: function(json){
    		if(typeof json.success !== 'undefined'){
    			$.jGrowl(json.success);
    		} else if(typeof json.error !== 'undefined'){
    			$.jGrowl(json.error);
    		}
    	},
    	error: function(json, jqXHR, status, errorThrown, exception){
    		alert(JSON.stringify(json));
    		return $.jGrowl('ОШИБКА AJAX запроса: ' + status, jqXHR, json);
    	},
    	xhrFields: {
    		onprogress: function(event) {
    			console.log('Загружено на сервер ' + event.loaded + ' байт');
    		}
    	}
    });
    Ответ написан
  • Какие есть схемы аутентификации, не требующие ввода пароля на разных устройствах?

    zkrvndm
    @zkrvndm
    Архитектор решений
    Почта все же нужна для идентификации.

    Просите у пользователя почту и высылаете на эту самую почту ссылку вида:
    https://yousite.ru/?authcode=sdksfkjdfsdjksd
    Где authcode - это зашифрованный JSON с почтой юзера и текущей датой.

    Когда кто-то переходит по такой ссылке, расшифровываете JSON обратно и авторизуете юзера под той почтой, что указана внутри JSON. Дата внутри нужна, если вы вдруг захотите, чтобы ссылка сгорала спустя неделю (допустим).

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

    zkrvndm
    @zkrvndm
    Архитектор решений
    Расширение которое будет запускать какой-то код на сайте делает очень просто, другое дело что даже это самое просто мне лично сейчас лень объяснять, да и не до этого пока. Из простых решений рекомендую:
    https://chrome.google.com/webstore/detail/custom-j...
    Это стороннее расширение позволяющие запускать свой код на чужих сайтах.
    Ответ написан
  • Создать локальный сервер как собственный хостинг?

    zkrvndm
    @zkrvndm
    Архитектор решений
    1. Надо вам у своего интернет-провайдера заказать услугу статичный IP адрес. Это нужно для того, чтобы на вашем домашнем компьютере всегда был один и тот же IP адрес и чтобы он не менялся никогда.
    2. Вам надо купить домен у любого регистратора доменов. Этот домен нужно направить на любой какой-угодно DNS-хостинг, обычно у регистраторов доменов есть бесплатные DNS-хостинги, можете использовать их.
    3. В настройках DNS-хостинга прописываете A-запись указав там IP адрес вашего компьютера. Помним, что на шаге 1 мы сделали статичный IP адрес себе.

    Этого в принципе достаточно, чтобы сайт открывался из интернета, при этом открывался находясь на вашем компе.

    P. S. Предполагается, что локально вы уже развернули свой сайт и настроили сам веб-сервер. Иначе все эти шаги бессмысленны.
    Ответ написан
    2 комментария
  • Как создать картинку из строки base64?

    zkrvndm
    @zkrvndm
    Архитектор решений
    Это элементарно делается в одну строку через fetch:
    blob = await (await fetch('data:image/png;base64,блабла')).blob();

    В переменной blob будет лежать файл, его можно спокойно отправить на сервер при помощи FormData.
    Ответ написан
    4 комментария
  • Как открыть консоль при помощи Javascript?

    zkrvndm
    @zkrvndm
    Архитектор решений
    Комбинация Ctrl + Shift + J открывает консоль. Если сильно надо ты можешь эту комбинацию забить в макрос и открывать консоль в один клик. Программ создающих макросы для винды полно.
    Ответ написан
  • Почему регулярное выражение парсит лишь первую строку?

    zkrvndm
    @zkrvndm
    Архитектор решений
    Для парсинга html кода существует DOMParser:
    https://developer.mozilla.org/ru/docs/Web/API/DOMParser
    Использовать регулярки для получения ссылок это накладно по расходам и неоправданно.
    Ответ написан
    Комментировать
  • Как создать сайт с минимальными ресурсами?

    zkrvndm
    @zkrvndm
    Архитектор решений
    Недавно в ответ на санкции ВКонтакте сделал свой конструктор сайтов бесплатным:
    https://vk.com/biz/site
    Можете полностью бесплатно создать сайт.
    Ответ написан
    Комментировать
  • Как удаленно имитировать нажатие кнопки на компьютере?

    zkrvndm
    @zkrvndm
    Архитектор решений
    Если видео воспроизводится в браузере, то остановка-воспроизведение элементарно настраиваются при помощи JavaSctipt. Понадобится поднять небольшой веб-сервер и через него сможете отдавать команды в браузер удаленно.
    Ответ написан
    9 комментариев
  • Почему через post не передаются данные?

    zkrvndm
    @zkrvndm
    Архитектор решений
    Чтобы $_POST был НЕ пустым надо отправлять данные в кодировке application/x-www-form-urlencoded или multipart/form-data. Вы в своем примере пытаетесь отправить данные в кодировке application/json, при этом еще и неправильно это делайте.

    Попробуйте так:
    window.addEventListener('load', check); // Запуск check после полной загрузки страницы
    
    async function check() {
    	
    	var data = {
    		'test': 'Привет, мир!',
    		'myname': 'Дмитрий'
    	};
    
    	var response = await (await fetch('https://site.ru/script.php', {
    		'method': 'POST',
    		'headers': {
    			'Content-Type': 'application/x-www-form-urlencoded; charset=UTF-8'
    		},
    		'body': new URLSearchParams(data).toString()
    	})).text();
    
    	console.log('Ответ сервера:', response);
    	
    	return response;
    	
    }
    Ответ написан
  • При парсинге телефона на Авито через json выдается другой номер телефона. Почему так?

    zkrvndm
    @zkrvndm
    Архитектор решений
    Вам НЕ нужно парсить номер телефона. Парсите просто сами объявления и ссылки на них. Вы ведь эти объявления потом все равно где-то выложите? Выложите! Вот там где вы это выложите сделайте аналогичную кнопку Показать номер - при нажатии на эту кнопку вытаскивайте номер с авито и показываете посетителю.
    Ответ написан
  • Как отменить событие скролла при достижении цели, а затем возобновить?

    zkrvndm
    @zkrvndm
    Архитектор решений
    Используй Intersection Observer API:
    developer.mozilla.org/ru/docs/Web/API/Intersection...
    Как только кнопка показать еще попадает в область видимости, то грузишь посты.
    Разумеется необходимо предусмотреть блокировку повторного вызова на время загрузки постов.

    Intersection Observer API позволяет указать функцию, которая будет вызвана всякий раз для элемента (target) при пересечении его с областью видимости документа (по умолчанию) или заданным элементом (root).
    Ответ написан
    Комментировать
  • Как заблокировать изменение значения инпута, кроме прямого ввода с клавиатуры?

    zkrvndm
    @zkrvndm
    Архитектор решений
    Нужно повесить обработчик на событие ввода и принимать данные только если имеется положительный isTrusted.
    Но по правде говоря все это бессмысленно, так как легко обходит любым, кто хоть немного смыслит в JavaScript.
    Ответ написан
    Комментировать
  • Как корректно кликать по формам JQuery?

    zkrvndm
    @zkrvndm
    Архитектор решений
    Если вызываете на элементе событие, то делайте его всплывающим. Например, после ввода текста в поле:
    input = document.querySelector('input');
    
    input.dispatchEvent(new KeyboardEvent('keydown', { bubbles: true }));
    input.dispatchEvent(new KeyboardEvent('keypress', { bubbles: true }));
    input.dispatchEvent(new KeyboardEvent('keyup', { bubbles: true }));
    input.dispatchEvent(new InputEvent('input', { bubbles: true }));
    input.dispatchEvent(new InputEvent('change', { bubbles: true }));

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

    zkrvndm
    @zkrvndm
    Архитектор решений
    Прекрасно все открывает, пробовал с других стран, все открывает. Если у вас не так, вам надо использовать прокси, видимо ip адрес вашего сайта в бане.
    Ответ написан
    1 комментарий