前提・実現したいこと
新規登録フォームを作っています。
PHPとjQueryによるバリデーションチェックをパスしたら、投稿ボタンを押せるようにしたいのですが、知識も浅いためうまくいきません。
該当のソースコード
PHP
1<?php 2 3const ERROR_NAME = '10文字以内で入力'; 4const ERROR_EMPTY = '入力してください'; 5const ERROR_MAIL = '正しい形式で入力'; 6const ERROR_COMMENT = '4文字以上で入力'; 7 8if (!empty($_POST)) { 9 $error = array(); 10 11 $username = $_POST['username']; 12 $usermail = $_POST['usermail']; 13 $userpass = $_POST['userpass']; 14 15 if(empty($username)) { 16 $error['error_name'] = ERROR_EMPTY; 17 } 18 if(!empty($username)) { 19 if(strlen($username) > 10) { 20 $error['error_name2'] = ERROR_NAME; 21 } 22 } 23 24 if(empty($usermail)) { 25 $error['error_mail'] = ERROR_EMPTY; 26 } 27 if(!empty($usermail)) { 28 $reg_str = '/^([a-zA-Z0-9])+([a-zA-Z0-9._-])*@([a-zA-Z0-9_-])+([a-zA-Z0-9._-]+)+$/'; 29 30 if (!preg_match($reg_str, $usermail)) { 31 $error['error_mail2'] = ERROR_MAIL; 32 } 33 } 34 35 if(empty($userpass)) { 36 $error['error_pass'] = ERROR_EMPTY; 37 } 38 if(!empty($userpass)) { 39 if(strlen($userpass) < 4) { 40 $error['error_pass'] = ERROR_COMMENT; 41 } 42 } 43 44 if(empty($error)) { 45 header('Location: index.html'); 46 exit(); 47 } 48} 49 50 51?> 52<!DOCTYPE html> 53<html lang="en"> 54<head> 55 <meta charset="UTF-8"> 56 <meta name="viewport" content="width=device-width, initial-scale=1.0"> 57 <title>Document</title> 58 <link rel="stylesheet" href="style.css"> 59</head> 60<body> 61<form action="" method="post"> 62 <div class="form_g <?php if(!empty($error['error_name'] || $error['error_name2'])) echo 'has-error' ?>"> 63 <label><span class="help-block"> 64 <?php if(!empty($error['error_name'])) echo $error['error_name'] ?> 65 <?php if(!empty($error['error_name2'])) echo $error['error_name2'] ?> 66 </span> 67 <input type="text" name="username" class="username" placeholder="ユーザー名" value="<?php if(!empty($username)) echo $username ?>"> 68 </label> 69 </div> 70 <div class="form_g <?php if(!empty($error['error_mail'] || $error['error_mail2'])) echo 'has-error' ?>"> 71 <label><span class="help-block"> 72 <?php if(!empty($error['error_mail'])) echo $error['error_mail'] ?> 73 <?php if(!empty($error['error_mail2'])) echo $error['error_mail2'] ?> 74 </span> 75 <input type="text" name="usermail" class="usermail" placeholder="メールアドレス" value="<?php if(!empty($usermail)) echo $usermail ?>"> 76 </label> 77 </div> 78 <div class="form_g <?php if(!empty($error['error_pass'] || $error['error_pass2'])) echo 'has-error' ?>"> 79 <label><span class="help-block"> 80 <?php if(!empty($error['error_pass'])) echo $error['error_pass'] ?> 81 <?php if(!empty($error['error_pass2'])) echo $error['error_pass2'] ?> 82 </span> 83 <input type="password" name="userpass" class="serpassu" placeholder="パスワード" value="<?php if(!empty($userpass)) echo $userpass ?>"> 84 </label> 85 </div> 86 <button type="submit" value="signup" class="send">新規登録</button> 87</form> 88 89<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.4.1/jquery.min.js"></script> 90<script src="style.js"></script> 91</body> 92</html>
JavaScript
1const ERROR_EMPTY = '入力してください'; 2const ERROR_NAME = '10文字以内で入力'; 3const ERROR_MAIL = '正しい形式で入力'; 4const ERROR_COMMENT = '4文字以上で入力'; 5 6$('.send').prop("disabled", true); 7 8$('.username').keyup(function() { 9let form_g = $(this).closest('.form_g'); 10if($(this).val().length === 0) { 11 form_g.find('.help-block').text(ERROR_EMPTY); 12 form_g.addClass('has-error').removeClass('has-success'); 13} else if($(this).val().length > 10) { 14 form_g.find('.help-block').text(ERROR_NAME); 15 form_g.addClass('has-error').removeClass('has-success'); 16} else { 17 form_g.find('.help-block').text(''); 18 form_g.addClass('has-success').removeClass('has-error'); 19} 20}); 21 22$('.usermail').keyup(function() { 23let form_g = $(this).closest('.form_g'); 24 25if($(this).val().length === 0) { 26 form_g.find('.help-block').text(ERROR_EMPTY); 27 form_g.addClass('has-error').removeClass('has-success'); 28} else if ($(this).val().length > 50 || !$(this).val().match(/^[-a-z0-9~!$%^&*_=+}{\'?]+(.[-a-z0-9~!$%^&*_=+}{\'?]+)*@([a-z0-9_][-a-z0-9_]*(.[-a-z0-9_]+)*.(aero|arpa|biz|com|coop|edu|gov|info|int|mil|museum|name|net|org|pro|travel|mobi|[a-z][a-z])|([0-9]{1,3}.[0-9]{1,3}.[0-9]{1,3}.[0-9]{1,3}))(:[0-9]{1,5})?$/i)) { 29 form_g.find('.help-block').text(ERROR_MAIL); 30 form_g.addClass('has-error').removeClass('has-success'); 31} else { 32 form_g.find('.help-block').text(''); 33 form_g.addClass('has-success').removeClass('has-error'); 34} 35}); 36 37$('.userpass').keyup(function() { 38let form_g = $(this).closest('.form_g'); 39 40if($(this).val().length === 0) { 41 form_g.find('.help-block').text(ERROR_EMPTY); 42 form_g.addClass('has-error').removeClass('has-success'); 43} else if ($(this).val().length < 4) { 44 form_g.find('.help-block').text(ERROR_COMMENT); 45 form_g.addClass('has-error').removeClass('has-success'); 46} else { 47 form_g.find('.help-block').text(''); 48 form_g.addClass('has-success').removeClass('has-error'); 49} 50}); 51 52$('input').change(function() { 53 let form_g = $(this).closest('.form_g'); 54 if($('.has-success').length){ 55 $('.send').prop("disabled", false); 56 } else { 57 $('.send').prop("disabled", true); 58 } 59})
CSS
1.send[disabled] { 2 background-color: #aaa; 3 cursor: not-allowed; 4} 5 6.has-error { 7 color: red; 8} 9 10.has-error span { 11 display: block; 12 padding-bottom: 10px; 13 color: #ff0000; 14}
試したこと
3項目の入力する箇所があり、それぞれエラーメッセージを表示するようにしています。
さらに、エラーの場合にhas-errorというクラスを与えて、エラーでない場合にhas-successというクラスを与えています。
最後にhas-successがあった場合、登録ボタンのdisabledをfalseにすればできるんではないか?と思いましたが、最後の構文の構成がわからず、inputからカーソルを外すとボタンが押せるようになってしまいます。
他の方法としては、グローバル変数を定義して、それぞれのfunction内でエラーが表示されるif文内で、
グローバル変数にfalseを代入、エラーじゃないelseの中でtrueを代入。
3つのfunctionが終わった後に、if文でfalseならボタンは非表示、trueなら表示としましたが、こちらはdisabeledのままで押せるようになりません。
この関数使えばいいよ、などヒントあったら教えていただきたいです。
補足情報(20/3/11追記)
https://logic-a.com/2013/05/22/submit_false_on_textbox_text_none/
ただ検索すると、入力される、という条件で投稿ボタンを出すものばかりなので、
それ以外の条件を入れることはできないのでしょうか。
回答2件
あなたの回答
tips
プレビュー