Атрибут `Required` не работает с тегом <form> - PullRequest
1 голос
/ 04 февраля 2020

Мой required атрибут не указывает, что поле ввода должно быть заполнено перед отправкой формы.

HTML:

<!-- Modal Content -->
            <form class="modal-content2">
                <div class="container3">
                    <h1>Sign Up</h1>
                    <p>Please fill in this form to create an account.</p>
                    <hr>
                    <label for="firstName"><b>First Name</b></label>
                    <input type="text" id="firstName" placeholder="Enter First Name" name="firstName" required>

                    <label for="lastName"><b>Last Name</b></label>
                    <input type="text" id="lastName" placeholder="Enter Last Name" name="lastName" required>

                    <label for="username"><b>Username</b></label>
                    <input type="text" id="username" placeholder="Enter Username" name="username" required>

                    <label for="email"><b>Email</b></label>
                    <input type="text" id="email" placeholder="Enter Email" name="email" required>

                    <label for="psw"><b>Password</b></label>
                    <input type="password" id="password" placeholder="Enter Password" name="psw" onfocus="this.value=''"
                        required>

                    <label for="psw-confirm"><b>Confirm Password</b></label>
                    <input type="password" id="cfmpassword" placeholder="Confirm Password" name="psw-confirm" onfocus="this.value=''"
                        required>

                    <br>
                    <br>
                    <p>By creating an account you agree to our <a href="aboutus.html" style="color:dodgerblue">Terms &
                            Privacy</a>.</p>

                    <div class="clearfix">
                        <button type="button" onclick="document.getElementById('id02').style.display='none'" class="cancelbtn2">Cancel</button>
                        <button type="button" class="signupbtn" onclick="signUp()">Sign Up</button>
                    </div>
                </div>
            </form>

JavaScript:

function signUp() {
    if (document.getElementById("password").value == document.getElementById("cfmpassword").value) {
        var users = new Object();
        users.firstName = document.getElementById("firstName").value;
        users.lastName = document.getElementById("lastName").value;
        users.username = document.getElementById("username").value;
        users.email = document.getElementById("email").value;
        users.password = document.getElementById("password").value;


        var postUser = new XMLHttpRequest(); // new HttpRequest instance to send user details

        postUser.open("POST", "/users", true); 

        postUser.setRequestHeader("Content-Type", "application/json");

        postUser.send(JSON.stringify(users));

        //go to the logged in page
        window.location = "main.html";
    }
    else {
        alert("Password column and Confirm Password column doesn't match!")
    }
}

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

У меня нет <button type="submit"> в форма как это мешает мне использовать windows.location.

Я новичок в программировании, кто-то может дать несколько советов (с объяснениями), что делать, чтобы это исправить? Любая помощь будет оценена! Большое спасибо! (Я использую ваниль JavaScript для этого)

Ответы [ 4 ]

2 голосов
/ 08 февраля 2020

Атрибут required не работает, поскольку ваша форма не отправлена. Вам нужно указать кнопку с type="submit" или <input type="submit"> для отправки form.

. Я предлагаю вам переместить функцию signUp внутри тега form, например, с помощью onsubmit событие:

<form onsubmit="signUp(event)">.

Затем добавьте к вам Javascript функцию:

function signUp(event) { event.preventDefault(); ... your old code }

2 голосов
/ 08 февраля 2020

Для меня я вижу ряд возможных проблем. Я попытался удалить их с помощью следующего примера кода. Я предполагаю, что /users вернет что-то , полезное для проверки и оповещения члена, если есть ошибка с доступом к /users или обработкой данных.

Использование атрибута required <input> не сделает ничего очевидного в вашем коде, поскольку <button> имеет вызов onclick=signUp(), который сработает до проверки браузера. С вашим текущим кодом значения формы (присутствующие или нет) будут по-прежнему отправляться на /users, поскольку эти значения не проверяются.

Вам необходимо переместить вызов signUp() на <form>, если вы хотите, чтобы проверка браузера была запущена.

Чтобы проверить это, удаление onclick=signUp() в <button> покажет вам окно с подсказкой браузера, в котором указано значение.

настаивают на использовании AJAX для публикации данных формы, перенос чека на отправку <form> - идея, и лично я все равно буду проверять значения - просто хорошая практика.

Следующая проблема - это вы не ждем возврата успешного или неудачного ответа от /users. На самом деле, вы слепо перенаправляете на main.html. Если будет ошибка, пользователь никогда не узнает. Это очень плохой пользовательский опыт.

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

var users = {};

function ajaxPost(url,postData,callFunc) {
  var http = new XMLHttpRequest();
  if(! http){
   return false;
  }
  http.onreadystatechange=function(){
    if((http.readyState == 4) && (http.status == 200)) {
      if(callFunc){
        callFunc(http.responseText);
      }
    }
  }
  http.open('POST',url,true);
  http.send(postData);
}

function validResult(str) {
  if (str == "valid") {
    // go to the logged in page
    window.location = "main.html";
  } else {
    console.log("invalid result, let the user know");
  }
}

function signUp(e) {
  if(e){e.stopPropagation();e.preventDefault();}
  
  var d = document.getElementById("signupForm").querySelectorAll("input");
  var i, max = d.length;
  // Quick check for values only. No check for the format of the values.
  // This is good practice as a browser may still ignore the `required`
  // attribute.
  for(i=0;i<max;i++) {
    d[i].value = d[i].value.trim();
    if (d[i].value) {
      users[d[i].name] = d[i].value;
    } else {
      // An alert would be better for the user here.
      console.log("Missing value for ["+ d[i].name +"]");
      // Go no further if there is a missing value.
      return;
    }
  }
  // at this point, all values added to the users object.
  console.log("users:["+ JSON.stringify(users) +"]");
  // Send the data and wait for a return value from /users
  // --- remove comment on the following line to post ----
  //ajaxPost("/users",JSON.stringify(users),validResult);
}

window.onload = function(){
  var c = document.getElementById("signupForm");
  if (c) {
    c.addEventListener("submit",signUp,false);
  }
}
<form id="signupForm">
<label for="firstName"><b>First Name</b></label>
<input type="text" id="firstName" placeholder="Enter First Name" name="firstName" required>
<p>
<label for="email"><b>Email</b></label>
<input type="email" id="email" placeholder="Enter Email" name="email" required>
<p>
<button id="submit" type="submit">Check and submit</button>
</form>
2 голосов
/ 04 февраля 2020

Basi c из HTML5 проверки. У вас есть это по нажатию кнопки, и она запускается до проверки. Это показывает, что onclick работает, а onsubmit - нет. Используйте правильное событие.

function loginSubmit () {
  console.log('loginSubmit')
}

function loginClick () {
  console.log('loginClick')
}
<form onsubmit="loginSubmit()">
  <input name="foo" required />
  <button onclick="loginClick()">click</button>
</form>
0 голосов
/ 10 февраля 2020

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

Вот пример с JavaScript и как проверка полей ввода может работать внутри него.

const form   = document.querySelector('form[action="signup.php"]'); // Form
const inputs = form.querySelectorAll('input');                      // All input elements inside the form
const submit = form.querySelector('button[type="submit"]');         // Submit button inside the form

// Add onclick event to the form button
submit.addEventListener('click', function(event) {
	event.preventDefault(); // This prevents the button from submitting the form the traditional way
	submit_form();          // but instead our way
});

function submit_form()
{
	// We iterate through the form input elements
	for (var i = 0; i < inputs.length; i++)
	{
		// We check if the current element has
		// the attribute required and if so
		// we proceed with checks
		if (inputs[i].hasAttribute('required') && inputs[i].value.length == 0)
		{
			inputs[i].focus();                            // We focus on the required element
			alert(inputs[i].placeholder+' is required!'); // Alert the user that the element is required
			break;                                        // Break from the loop
		}
		else
		{
			if (i == (inputs.length - 1)) form.submit();  // If the loop's i variable counter hits the same value as the
			                                              // input elements length then it means all fields are filled
		}
	}
}
form {
	width:300px;
	margin:auto
}

form button,
form input {
	width:100%;
	height:48px;
	padding:0 15px;
	font-size:18px;
	box-sizing:border-box;
}

form input:focus {
	background-color:#f2dfb7;
}
<form action="signup.php" method="POST">
	<input type="text" name="first_name" placeholder="First Name" required>
	<input type="text" name="last_name" placeholder="Last Name" required>
	<input type="email" name="email" placeholder="Email Address" required>
	<input type="email" name="email_repeat" placeholder="Email Address (Repeat)" required>
	<input type="password" name="password" placeholder="Password" required>
	<input type="text" name="phone" placeholder="Phone Number" required>
	<input type="text" name="birthday" placeholder="Birthday (MM/DD/YYYY)" required>
	<button type="submit">Sign Up</button>
</form>
...