Ответы пользователя по тегу HTML
  • Как сделать отправку формы на новую страницу и потом редирект в текущей?

    zkrvndm
    @zkrvndm
    Архитектор решений
    Во первых, нужно добавить атрибут target="_blank" для тега form - это заставит форму открываться в новом окне. Во вторых, на событие submit у формы надо повесить обработчик, который поменяет адрес у текущей вкладки при отправке. Если не умейте в JS то такой обработчик тоже в принципе можно повесить через атрибуты:
    <form target="_blank" onsubmit="location.href='https://yandex.ru'" action="send.php">
    ...
    </form>
    Ответ написан
    Комментировать
  • Как отключить zoom на iphone при клике на input?

    zkrvndm
    @zkrvndm
    Архитектор решений
    А если попробовать другие типы полей?
    Например textarea или div contenteditable?
    Их можно в скрытом виде держать и ввод с них перенаправлять в input.
    Ответ написан
    Комментировать
  • Чем можно заменить a href?

    zkrvndm
    @zkrvndm
    Архитектор решений
    Ничем, если ваc это раздражает, просто заблокируйте контекстное меню на таких ссылках. Пример:
    <a oncontextmenu="event.preventDefault();" href="#">Тест</a>

    Попробуйте нажать такую ссылку правой кнопкой мыши... ничего не будет происходить.

    Немного доработав пример, можно сделать так, чтобы правый клик был равноценен клику левому:
    <a oncontextmenu="event.preventDefault(); this.click();" href="#">Тест</a>

    А значит будет открываться модалка даже при клике правой кнопкой мыши.
    Ответ написан
    6 комментариев
  • Существует ли современная альтернатива iframe?

    zkrvndm
    @zkrvndm
    Архитектор решений
    Существует, называется порталы:
    https://habr.com/ru/news/t/451328/
    Там же можно посмотреть демо.

    Если вдруг не работает, убедитесь, что поддержка технологии включена в вашем браузере:
    chrome://flags/#enable-portals
    Ответ написан
  • Как наладить отправку данных с формы на почту?

    zkrvndm
    @zkrvndm
    Архитектор решений
    Просто используй Яндекс Формы и встрой их на свой сайт, самый простой вариант.

    https://yandex.ru/forms/mobile
    Ответ написан
  • Как активировать вывод всплывающего окна у input[type="datetime-local"] при клике в любую часть поля?

    zkrvndm
    @zkrvndm
    Архитектор решений
    Сделать можно, но работать будет не везде, так как это календарик он системный и где-то он есть, а где-то нет.

    Используйте эту инструкцию:
    https://frontips.ru/effekt-sledovaniya-za-kursorom/
    Только вместо кружочка сделайте так, чтобы за курсором следовал уголок поля. Само поле сделайте невидимым при помощи opacity. Это называется кликджекинг.

    P. S. Но лучше просто возьмите какой-нибудь готовый плагин вывода датапикера, так правильнее.
    Ответ написан
    Комментировать
  • Iframe или js API что предпочтительней?

    zkrvndm
    @zkrvndm
    Архитектор решений
    Фреймы предпочтительнее, потому что неизвестно какие стили накручены на целевом сайте, а они легко могут сломать отображение уже вашего контента.
    Ответ написан
    Комментировать
  • Почему не отображаются картинки по http?

    zkrvndm
    @zkrvndm
    Архитектор решений
    Проксируй запрос через свой сервер, чтобы он (сервер) скачивал картинку и отдавал ее в браузер.

    У тебя движок на php?
    Ответ написан
    3 комментария
  • Можно ли в айфрейме добавлять к урлу какой то кусок по типу "/?iframe"?

    zkrvndm
    @zkrvndm
    Архитектор решений
    Можно конечно, для начала выполняете проверку на фрейм, а далее если проверка положительная обходите все ссылки на странице обычным циклом и добавляете нужный хвост.
    Ответ написан
    Комментировать
  • Как сбросить только 1 input file?

    zkrvndm
    @zkrvndm
    Архитектор решений
    $('.image-upload').val(''); замени на $(input).val('');
    Ответ написан
    Комментировать
  • Как обновлять данные без перезагрузки страницы?

    zkrvndm
    @zkrvndm
    Архитектор решений
    Пример функции для выборочного обновления контента:
    async function elementUpdate(selector) {
    	try {
    		var html = await (await fetch(location.href)).text();
    		var newdoc = new DOMParser().parseFromString(html, 'text/html');
    		document.querySelector(selector).outerHTML = newdoc.querySelector(selector).outerHTML;
    		console.log('Элемент '+selector+' был успешно обновлен');
    		return true;
    	} catch(err) {
    		console.log('При обновлении элемента '+selector+' произошла ошибка:');
    		console.error(err);
    		return false;
    	}
    }

    Вызывайте функцию elementUpdate() передав внутрь него CSS-селектор того элемента, который вы хотите обновить.

    Например, если хотите обновить div-блок который имеет класс test, то достаточно выполнить:
    elementUpdate('.test');

    Если хотите выполнять обновление каждую секунду, можно использовать цикл:
    // Запускаем функцию autoUpdate по готовности страницы:
    
    document.addEventListener('DOMContentLoaded', autoUpdate);
    
    // Функция для запуска цикла:
    
    async function autoUpdate() {
    	
    	// Бесконечный цикл:
    	
    	while (true) {
    		
    		// Обновляем блок .test:
    		await elementUpdate('.test');
    		
    		// Выжидаем 1000 миллисекунд перед повторением цикла:
    		await new Promise(function(s) { setTimeout(s, 1000); });
    		
    	}
    	
    }
    
    // Функция для обновления контента:
    
    async function elementUpdate(selector) {
    	try {
    		var html = await (await fetch(location.href)).text();
    		var newdoc = new DOMParser().parseFromString(html, 'text/html');
    		document.querySelector(selector).outerHTML = newdoc.querySelector(selector).outerHTML;
    		console.log('Элемент '+selector+' был успешно обновлен.');
    		return true;
    	} catch(err) {
    		console.error('При обновлении элемента '+selector+' произошла ошибка:', err);
    		return false;
    	}
    }
    Ответ написан
    2 комментария
  • Какие есть атрибуты и теги в html, что могут исполнить js?

    zkrvndm
    @zkrvndm
    Архитектор решений
    Если атрибут у элемента начинается с букв on... то там может быть JavaScript.

    Например:
    https://spravka.seodon.ru/html/sobytiya/onload.php

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

    zkrvndm
    @zkrvndm
    Архитектор решений
    Вот так записываешь данные:
    localStorage.testovik = 'Здесь данные, которые ты хочешь сохранить...';

    Где testovik это ключ по которому ты позже будешь получать доступ, он может быть почти любой.

    А вот так потом извлекаешь на другой странице:
    infa = localStorage.testovik;
    console.log(infa); // Выводим в консоли

    Только предупреждаю, что так можно хранить только строки, т. е. только текст.
    Объекты и массивы надо сначала перегнать в текст, прежде чем пихать в хранилище localStorage.
    Ответ написан
    Комментировать
  • Как получить путь к файлу из input type="file"?

    zkrvndm
    @zkrvndm
    Архитектор решений
    Пути получить можно, но только если выбирается папка.

    Например, введите в консоли:
    var input = document.createElement('input');
    input.setAttribute('type', 'file');
    input.setAttribute('webkitdirectory', 'true');
    
    input.addEventListener('change', function() {
        
        console.log('Выбраны файлы', input.files);
    
        console.log('Пути файлов относительно выбранной папки:');
    
        for (var n = 0; n < input.files.length; n++) {
            console.log(input.files[n].webkitRelativePath);
        }
        
    });
    
    input.click();

    И выберите какую-нибудь папку, где будет хотя бы несколько файлов (любых).

    Также при большом желании можно получить путь в виде Data URL - это такой формат адреса, когда файл сам весь целиком помещается непосредственно в адрес (в ссылку). Ниже пример Data URL, попробуйте его открыть:
    data:image/png;base64,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

    Просто скопируйте и вставьте в адресную строку.
    Ответ написан
    Комментировать
  • Как сделать переход между страницами без перезагрузки?

    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();

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

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

    zkrvndm
    @zkrvndm
    Архитектор решений
    По факту ты делаешь веб-приложение, одностраничное.

    Рекомендую использовать jQuery UI, чтобы не изобретать велосипеды:
    https://antonshevchuk.gitbooks.io/jquery-for-begin...
    Ответ написан
    Комментировать
  • Как загружать другой html файл при маленьких разрешений экрана?

    zkrvndm
    @zkrvndm
    Архитектор решений
    Допустим так:
    <script>
        if (window.innerWidth <= 500) {
            location.href = '/mobile.php';
        }
    </script>

    Если ширина окна равна или меньше 500 пикселей, то будет переадресация на страницу /mobile.php
    Ответ написан
    Комментировать
  • Как сделать чтоб код sms определялся браузером?

    zkrvndm
    @zkrvndm
    Архитектор решений
    Это невозможно, браузер не имеет доступа к смс и даже запросить такое разрешение НЕ может, нет у него такого права. Будь иначе, мошенники на фишинговых сайтах без спроса сдирали бы все бабло с карт.
    Ответ написан
    Комментировать
  • Как в input file добавит значение из внешнего источника?

    zkrvndm
    @zkrvndm
    Архитектор решений
    Если картинка лежит внутри вашего сайта, то вы можете вставить его в поле input следующим образом:
    async function pasteFile(file_link, input_selector) {
    	
    	var blob = { type: 'html' };
    	
    	do {
    		
    		try {
    			
    			blob = await (await fetch(file_link)).blob();
    			
    			if (blob.type.includes('html')) {
    				
    				console.log('Не удалось скачать файл с сервера, вместо файла получена html-страница', blob);
    				await new Promise(function(s) { setTimeout(s, 1000); });
    				
    			}
    			
    		}
    		
    		catch (err) {
    			
    			console.log('Не удалось скачать файл с сервера', err);
    			await new Promise(function(s) { setTimeout(s, 1000); });
    			
    		}
    		
    	} while (blob.type.includes('html'));
    	
    	var dt  = new DataTransfer();
    	dt.items.add(new File([blob], file_link.split('/').pop(), { type: blob.type }));
    	document.querySelector(input_selector).files = dt.files;
    	
    	console.log('Файл успешно вставлен в поле', dt.files);
    	
    }

    Вам необходимо вызвать функцию pasteFile(file_link, input_selector) передав первым параметром ссылку на картинку, а вторым параметром CSS-селектор указывающий на поле input в которое требуется воткнуть картинку.

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

    zkrvndm
    @zkrvndm
    Архитектор решений
    Используй атрибут oninput:
    <input type="number" placeholder="Ваш возраст" oninput="age = this.value">

    Код внутри oninput будет выполнятся всякий раз при вводе данных в поле - в переменной age будет лежать возраст.

    Подробности можно найти здесь
    Ответ написан
    Комментировать