개요: 이 기사에서는 주로 양식 확인 및 제출 솔루션을 구현하기 위해 jquery.form과 결합된 jquery.validate에 대해 설명합니다.
방법 1: jquery.validate의 submitHandler 옵션을 통해, 즉 폼이 검증을 통과하면 콜백 함수가 실행됩니다. 이 콜백 함수에서 jquery.form을 통해 양식을 제출하세요.
방법 2: 양식을 제출하기 전에 실행되는 콜백 함수인 jquery.form의 beforeSubmit을 사용합니다. 이 함수가 true를 반환하면 양식이 제출되고, 양식 제출이 종료됩니다. jquery.validate 플러그인의 valid() 메소드에 따라 jquery.form을 통해 폼을 제출하면 폼을 검증할 수 있다.
방법 3: jquery.validate를 통해 양식의 유효성을 검사합니다. 이 방법의 장점은 양식 유효성 검사를 더 효과적으로 제어할 수 있다는 것입니다
예시: 위의 3가지 방법을 3가지 예시를 통해 아래에서 설명합니다
CSS 스타일 파일 로드
CSS 스타일 파일 콘텐츠
input{ height:25px; line-height:25px; padding-left:4px; } span.checked{ padding: 0px 5px 0px 25px; margin-left: 10px; margin-top: 0px; margin-bottom: 3px; height: 25px; line-height:25px; font-size: 12px; white-space: nowrap; text-align: left; color: #E6594E; background: url("images/acion2.png") no-repeat 3px; /* #FCEAE8 */ } span.unchecked{ padding: 0px 5px 0px 25px; margin-left: 10px; margin-top: 0px; margin-bottom: 3px; height: 23px; line-height:23px; font-size: 12px; border: 1px solid #E6594E; white-space: nowrap; text-align: left; color: #E6594E; background: #FCEAE8 url("images/acion.png") no-repeat 3px; }
자바스크립트 파일 로드
<script language="JavaScript" type="text/JavaScript" src="js/jQuery1.6.2.js"></script> <script language="JavaScript" type="text/JavaScript" src="js/jquery.form.js"></script> <script language="JavaScript" type="text/JavaScript" src="js/jquery.validate.js"></script> <script language="JavaScript" type="text/JavaScript" src="js/localization/messages_tw.js"></script>
HTML 콘텐츠
<body><span id="result"></span> <form id='commentForm'> <fieldset> <legend>jquery.validate+jquery.form提交的三种方式</legend> <p> <label for='cusername'>姓名</label><em>*</em> <input id='cusername' name='username' size='25' /> </p> <p> <label for='cemail'>电子邮件</label><em>*</em> <input id='cemail' name='email' size='25' /> </p> <p> <input class='submit' type='submit' value='提交'> </p> </fieldset> </form> </body>
jquery.validate+jquery.form은 메소드 1의 자바스크립트 콘텐츠를 제출합니다
<script language="javascript"> function showResponse(responseText,statusText) { if(statusText=='success'){ $("#result").html(responseText); } } $(document).ready(function(){ $('#commentForm').validate({ focusCleanup:true,focusInvalid:false, errorClass: "unchecked", validClass: "checked", errorElement: "span", submitHandler:function(form){ $(form).ajaxSubmit({ type:"post", url:"test_save.php?time="+ (new Date()).getTime(), //beforeSubmit: showRequest, success: showResponse }); }, errorPlacement:function(error,element){ var s=element.parent().find("span[htmlFor='" + element.attr("id") + "']"); if(s!=null){ s.remove(); } error.appendTo(element.parent()); }, success: function(label) { //label.addClass("valid").text("Ok!") label.removeClass("unchecked").addClass("checked"); }, rules:{ username:{required:true,minlength:3}, email:{ required:true } } }); }); </script>
jquery.validate+jquery.form은 메소드 2의 자바스크립트 콘텐츠를 제출합니다
<script language="javascript"> function showResponse(responseText,statusText) { if(statusText=='success'){ $("#result").html(responseText); } } function showRequest(formData,jqForm,options){ return $("#commentForm").valid(); } $(document).ready(function(){ $('#commentForm').submit(function(){ $(this).ajaxSubmit({ type:"post", url:"test_save.php?time="+ (new Date()).getTime(), beforeSubmit:showRequest, success:showResponse }); return false; //此处必须返回false,阻止常规的form提交 }); $('#commentForm').validate({ focusCleanup:true,focusInvalid:false, errorClass: "unchecked", validClass: "checked", errorElement: "span", errorPlacement:function(error,element){ var s=element.parent().find("span[htmlFor='" + element.attr("id") + "']"); if(s!=null){ s.remove(); } error.appendTo(element.parent()); }, success: function(label) { //label.addClass("valid").text("Ok!") label.removeClass("unchecked").addClass("checked"); }, rules:{ username:{required:true,minlength:3}, email:{ required:true } } }); }); </script>
jquery.validate+jquery.form은 메소드 3의 자바스크립트 콘텐츠를 제출합니다
<script language="javascript"> var options={ focusCleanup:true,focusInvalid:false, errorClass: "unchecked", validClass: "checked", errorElement: "span", errorPlacement:function(error,element){ var s=element.parent().find("span[htmlFor='" + element.attr("id") + "']"); if(s!=null){ s.remove(); } error.appendTo(element.parent()); }, success: function(label) { //label.addClass("valid").text("Ok!") label.removeClass("unchecked").addClass("checked"); }, rules:{ username:{required:true,minlength:3}, email:{ required:true } } }; function showResponse(responseText,statusText) { if(statusText=='success'){ $("#result").html(responseText); } } function showRequest(formData,jqForm,options){ return $("#commentForm").valid(); } $(document).ready(function(){ validator=$('#commentForm').validate(options); $("#reset").click(function(){ validator.resetForm(); }); $("button").click(function(){ validator.form(); }); $('#commentForm').submit(function(){ $(this).ajaxSubmit({ type:"post", url:"test_save.php?time="+ (new Date()).getTime(), beforeSubmit:showRequest, success:showResponse }); return false; //此处必须返回false,阻止常规的form提交 }); }); </script>
데모 소스 코드: 다운로드
몇 가지 질문
1. 사실 이 문제는 제가 어젯밤에 이 글을 작성하면서 발견되었습니다. HTML 파일 헤더에 8b05045a5be5764f313ed5b9168a17e6을 사용했을 때 입력란 스타일에 문제가 있는 것 같았습니다. 메시지. 그러나 오늘 나는 문제가 그렇게 간단하지 않다는 것을 발견했습니다. 8b05045a5be5764f313ed5b9168a17e6을 사용할 때 "이름" 입력 상자에 대해 3자만 도달하면 확인을 통과한 것으로 간주됩니다. 두 번째 문자를 입력하면 오류 표시가 정상입니다. 세 번째 문자를 입력하면 오류 표시가 사라지고 확인이 통과되었음을 나타내는 "쉼표" 그림이 표시됩니다. 지금까지는 모든 것이 잘 작동하는 것 같지만, 계속해서 4번째, 5번째 문자 등의 문자를 입력하면... 문제가 발생합니다. 아래와 같이:
100db36a723c770d327fc0aef2ce13b1을 사용하는 대신 8b05045a5be5764f313ed5b9168a17e6을 사용하면 문제가 없습니다. 모든 것이 잘 작동합니다. 그러나 이제 질문은 8b05045a5be5764f313ed5b9168a17e6을 추가하면 이러한 문제가 발생하는 이유는 무엇입니까?
이 문제는 처리하기 매우 복잡합니다. 프로세스 목록은 다음과 같습니다. 그리고 마지막에 해결책을 제시하세요
우선 어제 오류 메시지를 확인하다가 오류 메시지를 삽입한 코드에 주목했기 때문입니다. errorPlacement에 문장을 추가했습니다: Alert(element.parent().html());
errorPlacement:function(error,element){ alert(element.parent().html()); var s=element.parent().find("span[htmlFor='" + element.attr("id") + "']"); if(s!=null){ s.remove(); } error.appendTo(element.parent()); },
첫 번째 문자를 입력하면 아래 그림과 같은 내용이 나옵니다
인증에 성공하면 다음 그림이 나타납니다.
계속해서 더 많은 문자를 입력하면 아래와 같은 결과가 나타납니다
이는 다음 문제를 보여줍니다.
1. 확인 실패 또는 성공 여부에 관계없이 errorPlacement:function(...)
이 호출됩니다.2. s.remove()가 작동하지 않습니다.
이 글을 작성할 때 8b05045a5be5764f313ed5b9168a17e6 대신 100db36a723c770d327fc0aef2ce13b1을 사용했기 때문에 팝업 내용은 다음 그림과 같이 for="cusername" 대신 htmlFor="cusername"입니다. 🎜>
따라서 위의 코드는 다음과 같이 작성됩니다
var s=element.parent().find("span[htmlFor='" + element.attr("id") + "']"); if(s!=null){ s.remove(); }
errorPlacement:function(error,element){ alert(element.parent().html()); var s=element.parent().find("span[for='" + element.attr("id") + "']"); if(s!=null){ s.remove(); } error.appendTo(element.parent()); },
问题似乎解决了。但上面提到,不管验证成功或失败,都会调用errorPlacement:function(...),那可以在这里判断有没有错误,如果有错误,则显示。防止已经验证成功的情况下仍会调用。这样就不会寻找span的for属性值是否为当前控件的name名称了(例子中是for="cusername")。改进的代码如下:
errorPlacement:function(error,element){ if(error.html()!=''){ error.appendTo(element.parent()); } },
虽然解决问题,但是在chrome、firefox下仍有问题。了解这个问题的现象,可以用firefox或chrome测试一下——焦点离开输入框后,无法验证,只有点击“提交”按钮后才可以验证——这个问题的解决方案目前还没有深入下去。但是有解决的办法是,将上面的jquery1.6.2换成jquery1.3.2或jquery1.4(其它的jquery版本未测试,可能是低于jquery1.6.2的版本都可以)即可解决这个问题。
建议:
1、使用jquery1.3.2版本,这样可以节省很多时间来解决兼容方面的问题。
更多:
本例子中的jquery.validate,解决了remote远程验证只返回true or false的局限。可以返回代码及出错的提示信息,更好的人性化需求。使用方法就在这介绍一下
增加以下函数
function GetRemoteInfo(postUrl,data){ var remote = { type: "POST", async: false, url: postUrl, dataType: "xml", data: data, dataFilter: function(dataXML) { var result = new Object(); result.Result = jQuery(dataXML).find("Result").text(); result.Msg = jQuery(dataXML).find("Msg").text(); //alert(result.Result); if (result.Result == "-1") { result.Result = false; return result; }else{ result.Result = result.Result == "1" ? true : false; return result; } } }; return remote; }
$(document).ready(function(){ var dataInfo ={email:function(){return $("#cemail").val();}}; var remoteInfo = GetRemoteInfo('check-email.php?time='+(new Date()).getTime(),dataInfo); $('#commentForm').validate({ rules:{ username:{ required:true, minlength:3 }, email:{ required:true, remote:remoteInfo } } }); .... });
check-email.php返回的内容为xml格式,格式如下
<?php header("Content-Type:text/xml"); echo '<?'.'xml version="1.0" encoding="utf-8"'.' ?>'; ?> <AjaxClass> <Msg>用户名格式不正确,用户名必须包含testa,请重新输入!</Msg> <Result>0</Result> </AjaxClass>
result值为0,返回的是false,表示验证失败;result值为1,返回的是true,表示验证成功