Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 08.09.2019, 08:14
Кандидат Javascript-наук
Отправить личное сообщение для Lefseq Посмотреть профиль Найти все сообщения от Lefseq
 
Регистрация: 19.04.2019
Сообщений: 124

Ссылка onclick="location.href" не поддерживает required. Чем заменить required?
Всем привет. Хотел реализовать переход с формы на другую страницу с помощью onclick="location.href", с обязательной проверкой полей формы на заполненность, но как оказалось required тут не работает. Подскажите, чем можно заменить required?
action с submin не вариант, с ними данные из формы не передаются и не происходит переход на страницу.

<section id="user-greeting">
	<form>
		<label>
			Имя
			<input type="text" autocomplete="name" name="name" required>
		</label>
		<label>
			Фамилия
			<input type="text" autocomplete="family-name" name="family-name" required>
		</label>
		<button onclick="location.href='https://site.ru/next.html'">Перейти</button>
	</form>
	<section>
		Привет, <span class="name"></span>, добро пожаловать на сайт!
	</section>
</section>


(function main() {
		var form = document.querySelector("#user-greeting > form");
		var section = document.querySelector("#user-greeting > section");
		
		function changeView() {
			if ("name" in localStorage) {
				form.style.display = "none";
				section.style.display = "";
				document.querySelector("#user-greeting .name").textContent = localStorage.name;
			} else {
				section.style.display = "none";
				form.style.display = "";
			}
		}
		
		form.addEventListener("submit", function(event) {
			event.preventDefault();
			var data = new FormData(form);
			localStorage.name = [data.get("name"), data.get("family")].join(" ");
			changeView();
		});
		
		document.getElementById("user-greeting-forget-button").addEventListener("click", function() {
			delete localStorage.name;
			changeView();
		});
		
		changeView();
	})();

Последний раз редактировалось Lefseq, 08.09.2019 в 08:51.
Ответить с цитированием
  #2 (permalink)  
Старый 08.09.2019, 08:26
Профессор
Отправить личное сообщение для laimas Посмотреть профиль Найти все сообщения от laimas
 
Регистрация: 14.01.2015
Сообщений: 12,990

Сообщение от Lefseq
Хотел реализовать переход с формы на другую страницу с помощью onclick="location.href"
Для этого есть атрибут action и событие submit у формы.
Ответить с цитированием
  #3 (permalink)  
Старый 08.09.2019, 08:47
Кандидат Javascript-наук
Отправить личное сообщение для Lefseq Посмотреть профиль Найти все сообщения от Lefseq
 
Регистрация: 19.04.2019
Сообщений: 124

Сообщение от laimas Посмотреть сообщение
Для этого есть атрибут action и событие submit у формы.
Да, но в таком случае не передаются данные из формы.

(function main() {
		var form = document.querySelector("#user-greeting > form");
		var section = document.querySelector("#user-greeting > section");
		
		function changeView() {
			if ("name" in localStorage) {
				form.style.display = "none";
				section.style.display = "";
				document.querySelector("#user-greeting .name").textContent = localStorage.name;
			} else {
				section.style.display = "none";
				form.style.display = "";
			}
		}
		
		form.addEventListener("submit", function(event) {
			event.preventDefault();
			var data = new FormData(form);
			localStorage.name = [data.get("name"), data.get("family")].join(" ");
			changeView();
		});
		
		document.getElementById("user-greeting-forget-button").addEventListener("click", function() {
			delete localStorage.name;
			changeView();
		});
		
		changeView();
	})();
Ответить с цитированием
  #4 (permalink)  
Старый 08.09.2019, 08:49
Профессор
Отправить личное сообщение для laimas Посмотреть профиль Найти все сообщения от laimas
 
Регистрация: 14.01.2015
Сообщений: 12,990

Сообщение от Lefseq
в таком случае не запоминаются данные из формы
С чего вдруг? Зачем вам вообще форма, если вы ее не используете?
Ответить с цитированием
  #5 (permalink)  
Старый 08.09.2019, 10:30
Кандидат Javascript-наук
Отправить личное сообщение для Lefseq Посмотреть профиль Найти все сообщения от Lefseq
 
Регистрация: 19.04.2019
Сообщений: 124

Сообщение от laimas Посмотреть сообщение
С чего вдруг? Зачем вам вообще форма, если вы ее не используете?
Почему же не использую?
Рассказываю, посетитель пишет в форме свои Имя и Фамилию, эти данные запоминаются в localStorage, посетитель нажимает на кнопку "Перейти". Его перенаправляет на другую страницу где выводятся данные из localStorage. Все работает. Но проблема в том, что использую данный код, не работает required и пользователь может отправить пустые данные. Вот я и спрашиваю, чем проверять поля используя данный код?
Ответить с цитированием
  #6 (permalink)  
Старый 08.09.2019, 11:02
Профессор
Отправить личное сообщение для laimas Посмотреть профиль Найти все сообщения от laimas
 
Регистрация: 14.01.2015
Сообщений: 12,990

Сообщение от Lefseq
Почему же не использую?
Потому, что в вашем коде серверу ваша форма нафиг не нужна, не отправляете ее вы. Следовательно вам нужны только два поля и две кнопки без формы. На эти кнопки нужно повесить обработчик события, в котором для кнопки запоминания и перенаправления нужно проверять ввод и если ОК, то перенаправить, а для кнопки удаления очищать локальное хранилище. Можете и два отдельных обработчика, это уже как душе угодно.

Для этого достаточно:

<section id="user-greeting">
        <label>
            Имя
            <input type="text" autocomplete="name" required>
        </label>
        <label>
            Фамилия
            <input type="text" autocomplete="family" required>
        </label>
        <button name="mem">Запомнить</button>
    <section>
        Привет, <span class="name"></span> <span class="family"></span>, добро пожаловать на сайт!
        <button name="del">Забудь обо мне!</button>
    </section>
</section>


и суть обработчика:

document.querySelectorAll("button").forEach((b) => {
    b.addEventListener("click", (b) => {
        if(b.target.name=='mem') {
            var err = false, mem = [];
            document.querySelectorAll("#user-greeting [required]").forEach(function(f) {
                if(!f.value.trim()) {
                    //поле не заполнено, вывод ошибки и запрет перенаправления err = true
                } else mem.push(f.value); //запомнить ввод
            });
            if(!err) { //поля заполнены
                localStorage.name = mem.join(' '); //запомнить ввод в хранилище
                location.href = URL; //перенаправление на URL
            }
        } else delete localStorage.name;  //удалить запомненное
    });
});


А вот проверка полей, тут можно издеваться до бессовестного.

Последний раз редактировалось laimas, 08.09.2019 в 11:09.
Ответить с цитированием
  #7 (permalink)  
Старый 08.09.2019, 14:23
Кандидат Javascript-наук
Отправить личное сообщение для Lefseq Посмотреть профиль Найти все сообщения от Lefseq
 
Регистрация: 19.04.2019
Сообщений: 124

laimas, Не работает ваш код, совсем. Поля не проверяет, данные не запоминает.
Ответить с цитированием
  #8 (permalink)  
Старый 08.09.2019, 14:52
Профессор
Отправить личное сообщение для laimas Посмотреть профиль Найти все сообщения от laimas
 
Регистрация: 14.01.2015
Сообщений: 12,990

Это ваш не работает, а это будет работать
<html>
<body>
<section id="user-greeting">
        <label>
            Имя
            <input type="text" autocomplete="name" required>
        </label>
        <label>
            Фамилия
            <input type="text" autocomplete="family" required>
        </label>
        <button name="mem">Запомнить</button>
    <section>
        Привет, <span class="name"></span> <span class="family"></span>, добро пожаловать на сайт!
        <button name="del">Забудь обо мне!</button>
    </section>
</section>

<script>
document.querySelectorAll("button").forEach((b) => {
    b.addEventListener("click", (b) => {
        if(b.target.name=='set') {
            var err = false, mem = [];
            document.querySelectorAll("#user-greeting [required]").forEach(function(f) {
                if(!f.value.trim()) {
                    err = true;
                    alert('Не заполнено!');
                } else mem.push(f.value); //запомнить ввод
            });
            if(!err) { //поля заполнены
                alert('Запомнить '+mem.join(' '))
            }
        } else delete localStorage.name;  //удалить запомненное
    });
})
</script>
</body>
</html>


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

Последний раз редактировалось laimas, 08.09.2019 в 15:02.
Ответить с цитированием
  #9 (permalink)  
Старый 08.09.2019, 15:28
Кандидат Javascript-наук
Отправить личное сообщение для Lefseq Посмотреть профиль Найти все сообщения от Lefseq
 
Регистрация: 19.04.2019
Сообщений: 124

Сообщение от laimas
Что-то в песочнице не работает, но запустите это отдельной страницей
И на отдельной странице не работает. Кнопки вообще ни на что не реагируют.
И еще, а куда в вашем коде ссылку на страницу для перенаправления вставить?
Ответить с цитированием
  #10 (permalink)  
Старый 08.09.2019, 15:35
Профессор
Отправить личное сообщение для laimas Посмотреть профиль Найти все сообщения от laimas
 
Регистрация: 14.01.2015
Сообщений: 12,990

Сообщение от Lefseq
И на отдельной странице не работает. Кнопки вообще ни на что не реагируют.
У вас что эксклюзивный браузер? Под каким проверяете?
Ответить с цитированием
Ответ



Опции темы Искать в теме
Искать в теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Раскрыть аккордеон при переходе на другую страницу Роман1479 jQuery 10 23.12.2018 15:30
Как сделать, чтобы скрипт работал с jQuery последней версии? Tass jQuery 2 19.01.2015 12:22
чем заменить onChange? Viral Элементы интерфейса 13 04.12.2011 11:32
Чем можно заменить свойство contentEditable=true ? iMichaeli7 Javascript под браузер 5 20.10.2010 11:27
Подскажите по CSS меню Александр_1988 Элементы интерфейса 1 17.05.2010 11:58