Ссылка 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(); })(); |
Цитата:
|
Цитата:
(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(); })(); |
Цитата:
|
Цитата:
Рассказываю, посетитель пишет в форме свои Имя и Фамилию, эти данные запоминаются в localStorage, посетитель нажимает на кнопку "Перейти". Его перенаправляет на другую страницу где выводятся данные из localStorage. Все работает. Но проблема в том, что использую данный код, не работает required и пользователь может отправить пустые данные. Вот я и спрашиваю, чем проверять поля используя данный код? |
Цитата:
Для этого достаточно: <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, Не работает ваш код, совсем. Поля не проверяет, данные не запоминает.
|
Это ваш не работает, а это будет работать
<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> Что-то в песочнице не работает, но запустите это отдельной страницей, и будут сообщения если поля будут пусты или содержать одни пробелы. А уж по каким правилам проверять, это уже не мне решать, тем более, что по логике все это похоже на бред. |
Цитата:
И еще, а куда в вашем коде ссылку на страницу для перенаправления вставить? |
Цитата:
|
Цитата:
|
Цитата:
Цитата:
|
Lefseq, я ответил на ваш вопрос...
Цитата:
<section id="user-greeting"> <form action="next.html"> <label> Имя <input autocomplete="name" name="name" required> </label> <label> Фамилия <input autocomplete="family-name" name="familyName" required> </label> <button>Запомнить</button> </form> </section> <script> (function main() { var form = document.querySelector("#user-greeting > form"); form.addEventListener("submit", function(event) { event.preventDefault(); var data = new FormData(form); localStorage.name = JSON.stringify(Object.fromEntries(data)); form.submit(); }); })(); </script> Т. е. форму по любому нужно отправить, только перед отправкой надо сохранить данные формы в локальном хранилище. Адрес на который нужно перейти, указывается в атрибуте action. На странице next.html вы можете работать со значениями из локального хранилища. Тогда страница next.html может выглядеть так... <h3>Привет, <span data-field="name"></span>, добро пожаловать на сайт! </h3> <p>Привет, <span data-field="name"></span> <span data-field="familyName"></span>. Мы вас ждали.</p> <p>Как видите, <span data-field="name"></span>, страница называет вас по имени. Ваше имя (<i data-field="name"></i>) и фамилия (<i data-field="familyName"></i>) были сохранены в локальном хранилище, поэтому теперь их можно было использовать. </p> <button onclick="delete localStorage.name; location.reload();">Забыть меня</button> <script> document.addEventListener("DOMContentLoaded", function() { if("name" in localStorage === false) return location.replace("./"); const data = JSON.parse(localStorage.name || "{}"); for(const [key, value] of Object.entries(data)) { for(const node of document.querySelectorAll(`[data-field="${key}"]`)) { node.textContent = value; } } }); </script>В <span data-field="name"></span> подставляется значение из отправленной формы. Значению data-field соответствует имя поля из формы. Рабочий пример на основе этого кода вы можете посмотреть тут... https://charm-launch.glitch.me/localstorage Цитата:
Цитата:
Форма нужна для проверки. Форма нужна для связности, чтобы пользователь мог по порядку заполнить поля без необходимости поиска следующего поля. Это громадное улучшение UX. Цитата:
Цитата:
|
Вот в Опере
|
Цитата:
Я знаю вы любитель мусолить, но это ваше мнение и мне оно пофигу, я лишь высказываю свое. |
Цитата:
|
laimas,
Успокойтесь, Malleys хоть поделился действительно рабочим решением, без упоминания дурь мое ТЗ или не дурь. |
Цитата:
|
Часовой пояс GMT +3, время: 04:58. |