84669인 학습
152542인 학습
20005인 학습
5487인 학습
7821인 학습
359900인 학습
3350인 학습
180660인 학습
48569인 학습
18603인 학습
40936인 학습
1549인 학습
1183인 학습
32909인 학습
05-24 10:49:46作者:php中文网
抽时间写了一个带有自动校验功能的Html5用户注册Demo。使用到Handlebars模板技术和手机验证码校验。
以下是效果截图:
1.页面代码:usersRegister.hbs
>
<htmllang="en">
<head>
<metahttp-equiv="Content-Type"content="text/html; charset=utf-8">
<metahttp-equiv="X-UA-Compatible"content="IE=edge"/>
<title>用户注册 title>
<divclass="main">
<divstyle="height:5px;text-align:center;font-size:25px">欢迎您注册! div>
<formid="my-form"class="myform">
<div>
<label>用户名: label><inputid="username"name="username"type="text"/>
div>
<label>密码: label><inputid="pass"name="password"type="text"/>
<label>邮箱: label><inputid="email"name="email"
data-ideal="required email"type="email"/>
<label>电话: label><inputid="telephone"type="text"name="phone"data-ideal="phone"/>
<label>供应商V码: label><inputid="vCode"type="text"name="vCode"data-ideal="vCode"/>
<label>真实姓名: label><inputid="trueName"type="text"name="trueName"data-ideal="trueName"/>
<label>手机验证码: label><inputid="telCode"type="text"name="telCode"data-ideal="telCode"/>
<divstyle="margin-bottom:5px;">
<buttonid="getTelCode"type="button"style="margin-left:160px;margin-right:auto;">获取手机校验码 button>
<hrstyle="margin-top:5px; margin-bottom:5px;"/>
<scripttype="text/javascript">
varoptions= {
onFail : function() {
alert($myform.getInvalid().length + ' invalid fields.')
},
inputs : {
'password' : {
filters : 'required pass'
'username' : {
filters : 'required username'
'email' : {
filters : 'required email'
'phone' : {
filters : 'required phone'
'trueName' : {
filters : 'required'
'vCode' : {
'telCode' : {
}
/*
'age' : {
filters : 'required digits',
data : {
min : 16,
max : 70
'file' : {
filters : 'extension',
extension : [ 'jpg' ]
'comments' : {
filters : 'min max',
min : 50,
max : 200
'states' : {
filters : 'exclude',
exclude : [ 'default' ]
errors: {
exclude : '选择国籍.'
'langs[]' : {
min : 2,
max : 3
errors : {
min : 'Check at least<strong>2 strong>options.',
max : 'No more than<strong>3 strong>optionsallowed.'
*/
};
$('#getTelCode').click(function() {
vartelephone=document.getElementById("telephone").value; //手机号码
if (telephone==null||telephone== ""){
alert("手机号码不能为空!");
else{
$.ajax({
type : "GET",
dataType : "json",
url : "../api/getTelCode?telephone="+ telephone,
success : function(msg) {
error : function(e) {
alert("获取手机校验码失败!" + e);
});
var $myform= $('#my-form').idealforms(options).data('idealforms');
$('#submit').click(function() {
varusername=document.getElementById("username").value; //用户名
varpassword=document.getElementById("pass").value; //密码
varemail=document.getElementById("email").value; //邮箱
varvCode=document.getElementById("vCode").value; //公司V码
vartelCode=document.getElementById("telCode").value; //手机校验码
vartrueName=document.getElementById("trueName").value; //真实姓名
url : "../api/usersRegister?username="+ username +"password="+ password +"email="+ email +"telephone="+ telephone +"vCode="+ vCode +"telCode="+ telCode +"trueName="+ trueName,
//获取当前网址,如: http://localhost:8083/uimcardprj/share/meun.jsp
varcurWwwPath=window.document.location.href;
//获取主机地址之后的目录,如: uimcardprj/share/meun.jsp
varpathName=window.document.location.pathname;
varpos=curWwwPath.indexOf(pathName);
//获取主机地址,如: http://localhost:8083
varlocalhostPaht=curWwwPath.substring(0, pos);
//获取带"/"的项目名,如:/uimcardprj
varprojectName=pathName.substring(0, pathName.substr(1).indexOf('/') + 1);
window.location.href=projectName+ "/login";
alert("注册成功!");
alert("注册失败!" + e);
$('#reset').click(function() {
$myform.reset().fresh().focusFirst();
script>
body>
html>
2.jq输入校验:jquery.idealforms.js
该js校验初始版本来自Cedric Ruiz,我略有修改。
部分校验的规则如下:
required: '此处是必填的.'
number: '必须是数字.',
digits: '必须是唯一的数字.'
name: '必须至少有3个字符长,并且只能包含字母.'
username: '用户名最短5位,最长30位,请使用英文字母、数字、中文和下划线. 用户名首字符必须为字母、数字、中文,不能为全数字.中文最长21个字.'
pass: '密码的位数必须的在6-15位之间,并且至少包含一个数字,一个大写字母和一个小写字母.'
strongpass: '必须至少为8个字符长,至少包含一个大写字母和一个小写字母和一个数字或特殊字符.'
email: '必须是一个有效的email地址.(例:user@gmail.com)'
phone: '必须是一个有效的手机号码.(例: 18723101212)'
以下是整个代码文件:
/*--------------------------------------------------------------------------
jq-idealforms 2.1
* Author: Cedric Ruiz
* License: GPL or MIT
* Demo: http://elclanrs.github.com/jq-idealforms/
*
--------------------------------------------------------------------------*/
;(function ( $, window, document, undefined ) {
'use strict';
// Global Ideal Forms namespace
$.idealforms= {}
$.idealforms.filters= {}
$.idealforms.errors= {}
$.idealforms.flags= {}
$.idealforms.ajaxRequests= {}
/*--------------------------------------------------------------------------*/
/**
* @namespace A chest for various Utils
varUtils= {
* Get width of widest element in the collection.
* @memberOf Utils
* @param {jQueryobject} $elms
* @returns {number}
getMaxWidth: function( $elms ) {
varmaxWidth=0
$elms.each(function() {
varwidth= $(this).outerWidth()
if ( width>maxWidth ) {
maxWidth=width
})
return maxWidth
* Hacky way of getting LESS variables
* @param {string} name The name of the LESS class.
* @param {string} prop The css property where the data is stored.
* @returns {number, string}
getLessVar: function( name, prop ) {
varvalue= $('<pclass="' + name + '"> p>').hide().appendTo('body').css( prop )
$('.' + name).remove()
return ( /^\d+/.test( value ) ? parseInt( value, 10 ) : value )
* Like ES5 Object.keys
getKeys: function( obj ) {
varkeys= []
for(var key in obj) {
if ( obj.hasOwnProperty( key ) ) {
keys.push( key )
return keys
// Get lenght of an object
getObjSize: function( obj ) {
varsize=0, key;
for ( key in obj ) {
size++;
return size;
isFunction: function( obj ) {
return typeofobj=== nbsp;'function'
isRegex: function( obj ) {
return obj instanceof RegExp
isString: function( obj ) {
return typeofobj=== 'string'
getByNameOrId: function( str ) {
var $el= $('[name="'+ str +'"]').length
? $('[name="'+ str +'"]') // by name
: $('#'+ str) // by id
return $el.length
? $el
: $.error('The field "'+ str + '" doesn\'t exist.')
getFieldsFromArray: function( fields ) {
varf= []
for ( vari=0,l=fields.length; i<l; i++ ) {
f.push( Utils.getByNameOrId( fields[i] ).get(0) )
return $( f )
convertToArray: function( obj ) {
return Object.prototype.toString.call( obj ) === '[object Array]'
? obj : [ obj ]
* Determine type of any Ideal Forms element
* @param $input jQuery $input object
getIdealType: function( $el ) {
vartype= $el.attr('type') || $el[0].tagName.toLowerCase()
return (
/(text|password|email|number|search|url|tel|textarea)/.test( type ) && 'text' ||
/file/.test( type ) && 'file' ||
/select/.test( type ) && 'select' ||
/(radio|checkbox)/.test( type ) && 'radiocheck' ||
/(button|submit|reset)/.test( type ) && 'button' ||
/h\d/.test( type ) && 'heading' ||
/hr/.test( type ) && 'separator' ||
/hidden/.test( type ) && 'hidden'
)
* Generates an input
* @param name `name` attribute of the input
* @param type `type` or `tagName` of the input
makeInput: function( name, value, type, list, placeholder ) {
var markup,items= [], item, i, len
function splitValue( str ) {
var item, value, arr
if ( /::/.test( str ) ) {
arr=str.split('::')
item=arr[ 0 ]
value=arr[ 1 ]
} else {
item=value= str
return { item: item, value: value }
// Text & file
if ( /^(text|password|email|number|search|url|tel|file|hidden)$/.test(type) )
markup='+
'type="'+ type +'"'+
'id="'+ name +'"'+
'name="'+ name +'"'+
'value="'+ value +'"'+
(placeholder && 'placeholder="'+ placeholder +'"') +
'/>'
// Textarea
if ( /textarea/.test( type ) ) {
markup='name="'+ name +'"value="'+ value +'"> textarea>'
// Select
if ( /select/.test( type ) ) {
items= []
for (i=0,len=list.length; i<len; i++ ) {
item=splitValue( list[ i ] ).item
value=splitValue( list[ i ] ).value
items.push('<optionvalue="'+ value +'">'+ item +' option>')
markup=
'name="'+ name +'">'+items.join('') +' select>'}// Radiocheckif ( /(radio|checkbox)/.test( type ) ) {items= []for (i=0,len=list.length; i'+''+item +' label>')}markup=items.join('')}return markup}}/*** Custom tabs for Ideal Forms*/$.fn.idealTabs=function(container) {var// Elements$contents=this,$containercontainer= container,$wrapper= $(''),$tabs= (function () {vartabs= []$contents.each(function () {varname= $(this).attr('name')varhtml=''+'' + name + ' span>'+'0 i>'+' li>'tabs.push(html)})return $(tabs.join(''))}()),Actions= {getCurIdx: function () {return $tabs.filter('.ideal-tabs-tab-active').index()},getTabIdxByName: function (name) {varre=newRegExp(name, 'i')var $tab= $tabs.filter(function () {return re.test($(this).text())})return $tab.index()}},/*** Public methods*/Methods= {/***Switchtab*/switchTab: function (nameOrIdx) {varidx=Utils.isString(nameOrIdx)? Actions.getTabIdxByName(nameOrIdx): nameOrIdx$tabs.removeClass('ideal-tabs-tab-active')$tabs.eq(idx).addClass('ideal-tabs-tab-active')$contents.hide().eq(idx).show()},nextTab: function () {varidx=Actions.getCurIdx() + 1idx>$tabs.length - 1? Methods.firstTab(): Methods.switchTab(idx)},prevTab: function () {Methods.switchTab(Actions.getCurIdx() - 1)},firstTab: function () {Methods.switchTab(0)},lastTab: function () {Methods.switchTab($tabs.length - 1)},updateCounter: function (nameOrIdx, text) {varidx= !isNaN(nameOrIdx) ? nameOrIdx : Actions.getTabIdxByName(name),$counter= $tabs.eq(idx).find('.ideal-tabs-tab-counter')$counter.removeClass('ideal-tabs-tab-counter-zero')if (!text) {$counter.addClass('ideal-tabs-tab-counter-zero')}$counter.html(text)}}// Attach methodsfor (var m in Methods)$contents[m] = Methods[m]// Init$tabs.first().addClass('ideal-tabs-tab-active').end().click(function () {varname= $(this).text()$contents.switchTab(name)})// Insert in DOM & Events$wrapper.append($tabs).appendTo($container)$contents.addClass('ideal-tabs-content')$contents.each(function () {var $this= $(this),name= $(this).attr('name')$this.data('ideal-tabs-content-name', name).removeAttr('name')})$contents.hide().first().show() // Start freshreturn $contents}/*** A custommenu jQuery plugin* @example `$('select').idealSelect()`*/$.fn.idealSelect=function() {return this.each(function () {var$select= $(this),$options&nbnbsp;= $select.find('option')/*** Generate markup and return elements of custom select* @memberOf $.fn.toCustomSelect* @returns {object} All elements of the new select replacement*/varidealSelect= (function () {var$wrap= $(''),$menu= $('' +$options.filter(':selected').text() +' span> li>'),items= (function () {varitems= []$options.each(function () {var $this= $(this)items.push('' + $this.text() + ' li>')})return items}())$menu.append('' + items.join('') + ' ul>')$wrap.append($menu)return {select: $wrap,title: $menu.find('.ideal-select-title'),sub: $menu.find('.ideal-select-sub'),items: $menu.find('.ideal-select-item')}}())/*** @namespace Methods of custom select* @memberOf $.fn.toCustomSelect*/varActions= {getSelectedIdx: function () {return idealSelect.items.filter('.ideal-select-item-selected').index()},/*** @private*/init: (function () {$select.css({position: 'absolute',left: '-9999px'})idealSelect.sub.hide()idealSelect.select.insertAfter($select)idealSelect.select.css('min-width',Utils.getMaxWidth(idealSelect.items))idealSelect.items.eq($options.filter(':selected').index()).addClass('ideal-select-item-selected')}()),noWindowScroll: function (e) {if (e.which=== 40 ||e.which=== 38 ||e.which=== 13) {e.preventDefault()}},// Fix loosing focus when scrolling// and selecting item with keyboardfocusHack: function () {setTimeout(function () {$select.trigger('focus')}, 1)},focus: function () {idealSelect.select.addClass('ideal-select-focus')$(document).on('keydown.noscroll', Actions.noWindowScroll)},blur: function () {idealSelect.select.removeClass('ideal-select-open ideal-select-focus')$(document).off('.noscroll')},scrollIntoView: function (dir) {var$selected=idealSelect.items.filter('.ideal-select-item-selected'),itemHeight=idealSelect.items.outerHeight(),menuHeight=idealSelect.sub.outerHeight(),isInView= (function () {// relative position to the submenuvarelPos= $selected.position().top + itemHeightreturndir=== 'down'? elPos<= menuHeight: elPos>0}())if (!isInView) {itemHeight= (dir=== 'down')? itemHeight // go down: -itemHeight // go upidealSelect.sub.scrollTop(idealSelect.sub.scrollTop() + itemHeight)}},scrollToItem: function () {varidx=Actions.getSelectedIdx(),height=idealSelect.items.outerHeight(),nItems=idealSelect.items.length,allHeight=height* nItems,curHeight=height* (nItems - idx)idealSelect.sub.scrollTop(allHeight - curHeight)},showMenu: function () {idealSelect.sub.fadeIn('fast')idealSelect.select.addClass('ideal-select-open')Actions.select(Actions.getSelectedIdx())Actions.scrollToItem()},hideMenu: function () {idealSelect.sub.hide()idealSelect.select.removeClass('ideal-select-open')},select: function (idx) {idealSelect.items.removeClass('ideal-select-item-selected')idealSelect.items.eq(idx).addClass('ideal-select-item-selected')},change: function (idx) {vartext=idealSelect.items.eq(idx).text()Actions.select(idx)idealSelect.title.text(text)$options.eq(idx).prop('selected', true)$select.trigger('change')},keydown: function (key) {varidx=Actions.getSelectedIdx(),isMenu=idealSelect.select.is('.ideal-select-menu'),isOpen=idealSelect.select.is('.ideal-select-open')/*** @namespace Key pressed*/varkeys= {9: function () { // TABif (isMenu) {Actions.blur()Actions.hideMenu()}},13: function () { // ENTERif (isMenu)isOpen? Actions.hideMenu(): Actions.showMenu()Actions.change(idx)},27: function () { // ESCif (isMenu) Actions.hideMenu()},40: function () { // DOWNif (idx<$options.length - 1) {isOpen? Actions.select(idx + 1): Actions.change(idx + 1)}Actions.scrollIntoView('down')},38: function () { // UPif (idx>0) {isOpen? Actions.select(idx - 1): Actions.change(idx - 1)}Actions.scrollIntoView('up')},'default': function () { // Lettervarletter=String.fromCharCode(key),$matches=idealSelect.items.filter(function () {return /^\w+$/i.test( letter ) && // not allow modifier keys ( ctrl, cmd, meta,super... )new RegExp('^' + letter, 'i').test( $(this).text() ) // find first match}),nMatches= $matches.length,counter=idealSelect.select.data('counter') + 1 || 0,curKey=idealSelect.select.data('key') || key,newIdx= $matches.eq(counter).index()if (!nMatches) // No matchesreturn false// If more matches with same letterif (curKey=== key) {if (counter')$span.addClass( 'ideal-'+ ( $this.is(':checkbox') ? 'check' : 'radio' ) )$this.is(':checked') && $span.addClass('checked') // init$span.insertAfter( $this )$this.parent('label').addClass('ideal-radiocheck-label').attr('onclick', '') // Fix clicking label in iOS$this.css({ position: 'absolute', left: '-9999px' }) // hide by shifting left// Events$this.on({change: function() {var $this= $(this)if ( $this.is('input[type="radio"]') ) {$this.parent().siblings('label').find('.ideal-radio').removeClass('checked')}$span.toggleClass( 'checked', $this.is(':checked') )},focus: function() { $span.addClass('focus') },blur: function() { $span.removeClass('focus') },click: function() { $(this).trigger('focus') }})})};(function( $ ) {// Browser supports HTML5 multiple file?varmultipleSupport=typeof$('')[0].multiple !== 'undefined',isIE= /msie/i.test( navigator.userAgent )$.fn.idealFile=function() {return this.each(function() {var $file= $(this).addClass('ideal-file'), // the original file input// label that will be used for IE hack$wrap= $(''),$input= $(''),// Button that will be used in non-IE browsers$button= $('Open button>'),// Hack for IE$label= $('Open label>')// Hide by shifting to the left so we// can still trigger events$file.css({position: 'absolute',left: '-9999px'})$wrap.append( $input, ( isIE ? $label : $button ) ).insertAfter( $file )// Prevent focus$file.attr('tabIndex', -1)$button.attr('tabIndex', -1)$button.click(function () {$file.focus().click() // Open dialog})$file.change(function() {varfiles= [], fileArr, filename// If multiple is supported thenextract// all filenames from the file arrayif ( multipleSupport ) {fileArr= $file[0].filesfor ( vari=0,len=fileArr.length; i(例: user@gmail.com) em>',phone: '必须是一个有效的手机号码.(例: 18723101212) em>',zip: 'Must be a valid US zip code.(e.g. 33245 or 33245-0003) em>',url: 'Must be a valid URL.(e.g. www.google.com) em>',minChar: 'Must be at least{0} strong>characters long.',minOption: 'Check at least{0} strong>options.',maxChar: 'No more than{0} strong>characters long.',maxOption: 'No more than{0} strong>options allowed.',range: 'Must be a number between {0} and {1}.',date: 'Must be a valid date.(e.g. {0}) em>',dob: 'Must be a valid date of birth.',exclude: '"{0}" is not available.',excludeOption: '{0}',equalto: 'Must be the same value as"{0}" strong>',extension: 'File(s) must have a valid extension.(e.g. "{0}") em>',ajaxSuccess: '{0} strong>is not available.',ajaxError: 'Server error...'}/*** Get all default filters* @returns object*/vargetFilters=function() {varfilters= {required: {regex: /.+/,error: $.idealforms.errors.required},number: {regex: function( i, v ) { return !isNaN(v) },error: $.idealforms.errors.number},digits: {regex: /^\d+$/,error: $.idealforms.errors.digits},name: {regex: /^[A-Za-z]{3,}$/,error: $.idealforms.errors.name},username: {regex: /^[a-z](?=[\w.]{4,30}$)\w*\.?\w*$/i,error: $.idealforms.errors.username},pass: {regex: /(?=.*\d)(?=.*[a-z])(?=.*[A-Z]).{6,}/,error: $.idealforms.errors.pass},strongpass: {regex: /(?=^.{8,}$)((?=.*\d)|(?=.*\W+))(?![.\n])(?=.*[A-Z])(?=.*[a-z]).*$/,error: $.idealforms.errors.strongpass},email: {regex: /^([a-zA-Z0-9]*[-_.]?[a-zA-Z0-9]+)*@([a-zA-Z0-9]*[-_]?[a-zA-Z0-9]+)+[\\.][A-Za-z]{2,3}([\\.][A-Za-z]{2})?$/,error: $.idealforms.errors.email},phone: {//regex: /^((13[0-9])|(15[0-9])|(17[0-9])|(18[0-9]))\\d{8}$/,regex: /^(0|86|17951)?(13[0-9]|15[012356789]|17[678]|18[0-9]|14[57])[0-9]{8}$/,error: $.idealforms.errors.phone},zip: {regex: /^\d{5}$|^\d{5}-\d{4}$/,error: $.idealforms.errors.zip},url: {regex: /^(?:(ftp|http|https):\/\/)?(?:[\w\-]+\.)+[a-z]{2,6}([\:\/?#].*)?$/i,error: $.idealforms.errors.url},min: {regex: function( input, value ) {var $inputinput= input.input,min=input.userOptions.data.min,isRadioCheck= $input.is('[type="checkbox"], [type="radio"]')if ( isRadioCheck ) {this.error= $.idealforms.errors.minOption.replace( '{0}', min )return $input.filter(':checked').length>= min}this.error= $.idealforms.errors.minChar.replace( '{0}', min )return value.length>= min}},max: {regex: function( input, value ) {var $inputinput= input.input,max=input.userOptions.data.max,isRadioCheck= $input.is('[type="checkbox"], [type="radio"]')if ( isRadioCheck ) {this.error= $.idealforms.errors.maxOption.replace( '{0}', max )return $input.filter(':checked').length<= max}this.error= $.idealforms.errors.maxChar.replace( '{0}', max )return value.length<= max}},range: {regex: function( input, value ) {varrange=input.userOptions.data.range,val= +valuethis.error= $.idealforms.errors.range.replace( '{0}', range[0] ).replace( '{1}', range[1] )return val>= range[0] && val<= range[1]}},date: {regex: function( input, value ) {varuserFormat=input.userOptions.data && input.userOptions.data.date? input.userOptions.data.date: 'mm/dd/yyyy', // default formatdelimiter= /[^mdy]/.exec( userFormat )[0],theFormat=userFormat.split(delimiter),theDate=value.split(delimiter),isDate=function( date, format ) {var m, d, yfor ( vari=0,len=format.length; i0 && m<13&&y &&y.length=== 4 &&d>0 && d<= ( new Date( y, m, 0 ) ).getDate())}this.error= $.idealforms.errors.date.replace( '{0}', userFormat )return isDate( theDate, theFormat )}},dob: {regex: function( input, value ) {varuserFormat=input.userOptions.data && input.userOptions.data.dob? input.userOptions.data.dob: 'mm/dd/yyyy', // default format// Simulate a date inputdateInput= {input: input.input,userOptions: {data: { date: userFormat }}},// Use internal date filter to validatethe dateisDate=filters.date.regex( dateInput, value ),// DOBtheYear= /\d{4}/.exec( value ),maxYear=newDate().getFullYear(), //CurrentyearminYear=maxYear- 100this.error= $.idealforms.errors.dobreturn isDate && theYear>= minYear && theYear<= maxYear}},exclude: {regex: function( input, value ) {var $inputinput= input.input,exclude=input.userOptions.data.exclude,isOption= $input.is('[type="checkbox"], [type="radio"], select')this.error=isOption? $.idealforms.errors.excludeOption.replace( '{0}', value ):this.error= $.idealforms.errors.exclude.replace( '{0}', value )return $.inArray( value, exclude ) === -1}},equalto: {regex: function( input, value ) {var $equals= $( input.userOptions.data.equalto ),$inputinput= input.input,name= $equals.attr('name') || $equals.attr('id'),isValid= $equals.parents('.ideal-field').filter(function(){ return $(this).data('ideal-isvalid') === true }).lengthif ( !isValid ) { return false }this.error= $.idealforms.errors.equalto.replace( '{0}', name )return $input.val() === $equals.val()}},extension: {regex: function( input, value ) {nbsp;varfiles=input.input[0].files || [{ name: value }],extensions=input.userOptions.data.extension,re=newRegExp( '\\.'+ extensions.join('|') +'$', 'i' ),valid=falsefor ( vari=0,len=files.length; i')self.$form.prepend( $tabContainer )self.$tabs.idealTabs( $tabContainer )}// Always show datepicker below the inputif ( jQuery.ui ) {$.datepicker._checkOffset=function( a,b,c ) { return b }}// Add inputs specified by data-ideal// to the list of user inputsself.$form.find('[data-ideal]').each(function() {varuserInput=o.inputs[ this.name ]o.inputs[ this.name ] = userInput || { filters: $(this).data('ideal') }})// Responsiveif ( o.responsiveAt ) {$(window).resize(function(){ self._responsive() })self._responsive()}// Form eventsself.$form.on({keydown: function( e ) {// Prevent submit when pressing enter// but exclude textareasif (e.which=== 13 && e.target.nodeName !== 'TEXTAREA' ) {e.preventDefault()}},submit: function( e ) {if ( !self.isValid() ) {e.preventDefault()o.onFail()self.focusFirstInvalid()} else {o.onSuccess( e )}}})self._adjust()self._attachEvents()self.fresh() // Start fresh},_getFormElements: function() {return {inputs: this.$form.find('input, select, textarea, :button'),labels: this.$form.find('div>label:first-child'),text: this.$form.find('input:not([type="checkbox"], [type="radio"], [type="submit"]), textarea'),select: this.$form.find('select'),radiocheck: this.$form.find('input[type="radio"], input[type="checkbox"]'),buttons: this.$form.find(':button'),file: this.$form.find('input[type="file"]'),headings: this.$form.find('h1, h2, h3, h4, h5, h6'),separators: this.$form.find('hr'),hidden: this.$form.find('input:hidden')}},_getUserInputs: function() {return this.$form.find('[name="'+ Utils.getKeys( this.opts.inputs ).join('"], [name="') +'"]')},_getTab: function( nameOrIdx ) {varself=thisvarisNumber= !isNaN( nameOrIdx )if ( isNumber ) {return self.$tabs.eq( nameOrIdx )}return self.$tabs.filter(function() {varre=newRegExp( nameOrIdx, 'i' )return re.test( nbsp;$(this).data('ideal-tabs-content-name') )})},_getCurrentTabIdx: function() {return this.$tabs.index( this.$form.find('.ideal-tabs-content:visible') )},_updateTabsCounter: function() {varself=thisself.$tabs.each(function( i ) {varinvalid=self.getInvalidInTab( i ).lengthself.$tabs.updateCounter( i, invalid )})},_adjust: function() {varself=thisvaro=self.optsvarformElements=self._getFormElements()varcurTab=self._getCurrentTabIdx()// Autocomplete causes some problems...formElements.inputs.attr('autocomplete', 'off')// Show tabs to calculate dimensionsif ( self.$tabs.length ) { self.$tabs.show() }// Adjust labelsvarlabels=formElements.labelslabels.removeAttr('style').width( Utils.getMaxWidth( labels ) )// Adjust headings and separatorsif ( self.$tabs.length ) {this.$tabs.each(function(){$( this ).find('.ideal-heading:first').addClass('first-child')})} else {self.$form.find('.ideal-heading:first').addClass('first-child')}self._setDatepicker()// Done calculating hide tabsif ( self.$tabs.length ) {self.$tabs.hide()self.switchTab( curTab )}},_setDatepicker: function() {varo=this.optsvar $datepicker=this.$form.find('input.datepicker')if ( jQuery.ui && $datepicker.length ) {$datepicker.each(function() {varuserInput=o.inputs[ this.name ]vardata=userInput&& userInput.data && userInput.data.datevarformat=data? data.replace( 'yyyy', 'yy' ) : 'mm/dd/yy'$(this).datepicker({dateFormat: format,beforeShow: function( input ) {$( input ).addClass('open')},onChangeMonthYear: function() {// Hack to fix IE9 not resizingvar $this= $(this)varw= $this.outerWidth() //cachefirst!setTimeout(function() {$this.datepicker('widget').css( 'width', w )}, 1)},onClose: function() { $(this).removeClass('open') }})})// Adjust width$datepicker.on('focus keyup', function() {vart= $(this),w=t.outerWidth()t.datepicker('widget').css( 'width', w )})$datepicker.parent().siblings('.ideal-error').addClass('hidden')}},_doMarkup: function( $element ) {varo=this.optsvarelementType=Utils.getIdealType( $element )// Validation elementsvar $field= $('')var $error= $('')var $valid= $('')var $invalid= $('').click(function(){$(this).parent().find('input:first, textarea, select').focus()})// Basic markup$element.closest('div').addClass('ideal-wrap').children('label:first-child').addClass('ideal-label')varidealElements= {_defaultInput: function() {$element.wrapAll( $field ).after( $valid, $invalid ).parent().after( $error )},text: function() { idealElements._defaultInput() },radiocheck: function() {// Check if input is already wrapped so we don't// wrap radios and checks more than oncevarisWrapped= $element.parents('.ideal-field').lengthif ( !isWrapped ) {$element.parent().nextAll().andSelf().wrapAll( $field.addClass('ideal-radiocheck') )$element.parents('.ideal-field').append( $valid, $invalid ).after( $error )}if ( !/radiocheck/.test( o.disableCustom ) ) {$element.idealRadioCheck()}},select: function() {idealElements._defaultInput()if ( !/select/.test( o.disableCustom ) ) {$element.idealSelect()}},file: function() {idealElements._defaultInput()if ( !/file/.test( o.disableCustom ) ) {$element.idealFile()}},button: function() {if ( !/button/.test( o.disableCustom ) ) {$element.addClass('ideal-button')}},hidden: function() {$element.closest('div').addClass('ideal-hidden')},heading: function() {$element.closest('div').addClass('ideal-full-width')$element.parent().children().wrapAll('')},separator: function() {$element.closest('div').addClass('ideal-full-width')$element.wrapAll('')}}// Generate markup for current element typeidealElements[ elementType ] ? idealElements[ elementType ]() : $.noop()$error.add( $valid ).add( $invalid ).hide() // Start fresh},/** Validates an input and shows or hides error and icon* @memberOf Actions* @param {object} $input jQuery object* @param {string} e The JavaScript event*/_validate: function( $input, e ) {varself=thisvaro=this.optsvaruserOptions= o.inputs[ $input.attr('name') ]varuserFilters=userOptions.filters && userOptions.filters.split(/\s/)varname= $input.attr('name')varvalue= $input.val()varajaxRequest= $.idealforms.ajaxRequests[ name ]varisRadioCheck= $input.is('[type="checkbox"], [type="radio"]')varinputData= {// If is radio or check validate all inputs related by nameinput: isRadioCheck ? self.$form.find('[name="' + name + '"]') : $input,userOptions: userOptions}// Validation elementsvar $field= $input.parents('.ideal-field')var $error= $field.siblings('.ideal-error')var $invalid=isRadioCheck? $input.parent().siblings('.ideal-icon-invalid'): $input.siblings('.ideal-icon-invalid')var $valid=isRadioCheck? $input.parent().siblings('.ideal-icon-valid'): $input.siblings('.ideal-icon-valid')function resetError() {$field.removeClass('valid invalid').removeData('ideal-isvalid')$error.add( $invalid ).add( $valid ).hide()}function showOrHideError( error, valid ) {resetError()valid ? $valid.show() : $invalid.show()$field.addClass( valid ? 'valid' : 'invalid' )$field.data( 'ideal-isvalid', valid )if ( !valid ) {$error.html( error ).toggle( $field.is('.ideal-field-focus') )}}// Prevent validation when typing but not introducing any new characters// This is mainly to prevent multiple AJAX requestsvaroldValue= $input.data('ideal-value') || 0$input.data( 'ideal-value', value )if (e.type=== 'keyup' &&value=== oldValue ) { return false }// Validateif ( userFilters ) {$.each( userFilters, function( i, filter ) {vartheFilter= $.idealforms.filters[ filter ]varcustomError=userOptions.errors && userOptions.errors[ filter ]varerror=''// If field is empty and not requiredif ( !value && filter !== 'required' ) {resetError()return false}if ( theFilter ) {// Abort and reset ajax if there's a request pendingif (e.type=== 'keyup' && ajaxRequest ) {ajaxRequest.abort()$field.removeClass('ajax')}// AJAXif (filter=== 'ajax' ) {nbsp; showOrHideError( error, false ) // set invalid till response comes back$error.hide()if (e.type=== 'keyup' ) {theFilter.regex( inputData, value, showOrHideError ) // runs the ajax callback} else {varajaxError= $input.data('ideal-ajax-error')if ( ajaxError ) {showOrHideError( ajaxError, $input.data('ideal-ajax-resp') || false )}}}// All other filterselse {varvalid=Utils.isRegex( theFilter.regex ) && theFilter.regex.test( value ) ||Utils.isFunction( theFilter.regex ) && theFilter.regex( inputData, value )error=customError|| theFilter.error // assign error after calling regex()showOrHideError( error, valid )if ( !valid ) { return false }}}})}// Reset if there are no filterselse {resetError()}// Flagsvarflags= (function(){varf=userOptions.flags && userOptions.flags.split(' ') || []if ( o.globalFlags ) {$.each( o.globalFlags.split(' '), function( i,v ) { f.push(v) })}return f}())if ( flags.length ) {$.each(flags, function( i,f ) {vartheFlag= $.idealforms.flags[f]if ( theFlag ) { theFlag( $input, e.type ) }})}// Update counterif ( self.$tabs.length ) {self._updateTabsCounter( self._getCurrentTabIdx() )}},_attachEvents: function() {varself=thisself._getUserInputs().on('keyup change focus blur', function(e) {var $this= $(this)var $field= $this.parents('.ideal-field')varisFile= $this.is('input[type=file]')// Trigger on change iftype=filecuz custom file// disables focus on original file input (tabIndex= -1)if (e.type=== 'focus' || isFile &&e.type=== 'change' ) {$field.addClass('ideal-field-focus')}if (e.type=== 'blur' ) {$field.removeClass('ideal-field-focus')}self._validate( $this, e )})},_responsive: function() {varformElements=this._getFormElements()varmaxWidth=LessVars.fieldWidth + formElements.labels.outerWidth()var $emptyLabel=formElements.labels.filter(function() {return $(this).html() === ' '})var $customSelect=this.$form.find('.ideal-select')this.opts.responsiveAt=== 'auto'? this.$form.toggleClass( 'stack', this.$form.width()'+''+ label +': label>'+Utils.makeInput( name, value, type, list, placeholder ) +' div>')var $input= $field.find('input, select, textarea, :button')// Add inputs with filters to the list// of user inputs to validateif ( userOptions.filters ) { self.opts.inputs[ name ] = userOptions }self._doMarkup( $input )// Insert in DOMif ( ops.addAfter ) {$field.insertAfter($( Utils.getByNameOrId( ops.addAfter ) ).parents('.ideal-wrap'))} else if ( ops.addBefore ) {$field.insertBefore($(Utils.getByNameOrId( ops.addBefore )).parents('.ideal-wrap'))} else if ( ops.appendToTab ) {$field.insertAfter(self._getTab( ops.appendToTab ).find('.ideal-wrap:last-child'))} else {$field.insertAfter( self.$form.find('.ideal-wrap').last() )}// Add current field name to list of namesallNames.push( name )}// Run through each input$.each( fields, function( i, ops ) { add( ops ) })self.reload()self.freshFields( allNames )self._responsive()return this},removeFields: function( fields ) {fields=Utils.convertToArray( fields )var $fields=Utils.getFieldsFromArray( fields )$fields.parents('.ideal-wrap').remove()this.reload()return this}})}( jQuery, window, document ))【相关推荐】1.Html5免费视频教程2.HTML5本地数据库实例详解3.教你如何实现一个H5微场景4.详解H5的自定义属性data-*5.h5实现文本框提示语的代码实例위 내용은 H5完成用户注册自动校验的实例详解의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!관련 라벨:html5,用户注册원천:php.cn이전 기사:h5实现文本框提示语的代码实例다음 기사:用H5实现手机摇一摇的实例详解본 웹사이트의 성명본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.저자별 최신 기사通过H5实现拍照功能的实例详解1970-01-01 08:00:00pycharm连通mysql的图文教程1970-01-01 08:00:00.NET Core创建一个控制台(Console)程序1970-01-01 08:00:00python绘图库的基本操作方法介绍1970-01-01 08:00:00微信开发的扫码登录处理的步骤详解1970-01-01 08:00:00做一个微信H5页面的过程详解1970-01-01 08:00:00MyBatis出现数据库字段和实体bean中属性不一致时处理方法1970-01-01 08:00:00微信开发之onShareAppMessage分享参数的用法1970-01-01 08:00:00H5和CSS3制作一个相册的代码实例1970-01-01 08:00:00用tp框架实现微信支付的代码实例1970-01-01 08:00:00최신 이슈Laravel 9.x: 등록 후 성공 메시지를 보도록 사용자를 리디렉션합니다.로그인 페이지 링크를 사용하여 사용자를 등록한 후 성공 메시지와 함께 뷰를 반환하려고 하는데 세션 메시지가 뷰와 함께 전달되지 않습니다. 이것은 내 등록된() 메...에서 2023-11-12 22:55:2101336WordPress 6.0(add_editor_style)은 Gutenberg 편집기에서 style.css를 로드하지 않습니다.저는 맞춤형 WordPress 블록 테마를 만들기 위해 UdemyWordPress 과정을 수강하고 있습니다. function.php에 블록 유형을 성공적으로 등록...에서 2023-11-12 20:37:5002261Laravel Breeze를 설치하는 동안 Laravel Mix 오류가 발생했습니다.새로운 Laravel 애플리케이션에 LaravelBreeze를 설치하려고 합니다. 모든 것이 잘 작동하지만 콘솔에 npmrundev를 입력하면 다음 오류가 계속 ...에서 2023-11-07 23:05:0201299자동 등록 서비스 오류: ORM 엔터티에 따라 다름저는 Symfony3 애플리케이션을 개발 중입니다. Symfonyprofiler 로그에 따르면 서비스 자동 등록 유형 "App\Entity\SubDir\...에서 2023-11-05 20:56:0501375다시 작성된 제목은 PhpStorm Docker를 사용하여 PHPUnit 데이터베이스 구성입니다.Docker: PHP, PHPUnit을 사용하여 PhpStorm을 설정했으며 PhpStorm/Database Viewer에서 스키마를 확인하고 내 애플리케이션에서...에서 2023-11-01 20:53:1701294관련 주제더>HTML5 애니메이션 제작의 제작 방식은 무엇인가요?HTML과 HTML5의 차이점CSS 위치를 지정하는 방법에는 여러 가지가 있습니다.공매도란 무엇인가요?자바스크립트 이스케이프 문자화웨이 휴대폰에서 기존 휴대폰을 새 휴대폰으로 가져오는 방법사용자 전환 단축키는 무엇인가요?win10 오른쪽 하단에 아이콘이 모두 나타나는 이유는 무엇입니까?인기 추천h5是什么不懂代码怎么制作h5页面?H5页面制作平台推荐html5의 새로운 기능은 무엇입니까h5 페이지 제작이란 무엇입니까?h5와 미니프로그램의 차이점은 무엇인가요?인기 튜토리얼더>관련 튜토리얼인기 추천최신 강좌최신 ThinkPHP 5.1 세계 최초 비디오 튜토리얼(PHP 전문가 온라인 교육 과정이 되기까지 60일)1394798PHP 입문 튜토리얼 1: 일주일 안에 PHP 배우기4206508JAVA 초보자용 비디오 튜토리얼2348018Little Turtle의 Python 학습에 대한 제로 기반 소개 비디오 튜토리얼493104PHP 제로 기반 입문 튜토리얼826258최신 ThinkPHP 5.1 세계 최초 비디오 튜토리얼(PHP 전문가 온라인 교육 과정이 되기까지 60일)1394798 학습 시간JAVA 초보자용 비디오 튜토리얼2348018 학습 시간Little Turtle의 Python 학습에 대한 제로 기반 소개 비디오 튜토리얼493104 학습 시간웹 프론트 엔드 개발에 대한 빠른 소개213403 학습 시간PS 비디오 튜토리얼을 처음부터 마스터하세요842637 학습 시간[웹 프런트엔드] Node.js 빠른 시작3115 학습 시간해외 웹 개발 풀스택 강좌 총집합2483 학습 시간Go 언어 실습 GraphQL1974 학습 시간550W 팬 마스터가 JavaScript를 처음부터 차근차근 학습합니다464 학습 시간기초 지식이 전혀 없는 초보자도 6시간 만에 시작할 수 있는 파이썬 마스터 모쉬10769 학습 시간최신 다운로드더>웹 효과웹사이트 소스 코드웹사이트 자료프론트엔드 템플릿[양식 버튼] jQuery 기업 메시지 양식 연락처 코드[플레이어 특수 효과] HTML5 MP3 뮤직 박스 재생 효과[메뉴 탐색] HTML5 멋진 입자 애니메이션 탐색 메뉴 특수 효과[양식 버튼] jQuery 시각적 양식 드래그 앤 드롭 편집 코드[플레이어 특수 효과] VUE.JS 모방 Kugou 음악 플레이어 코드[HTML5 특수 효과] 클래식 HTML5 푸시 박스 게임[그림 특수 효과] 이미지 효과를 추가하거나 줄이기 위해 jQuery 스크롤[사진 앨범 효과] CSS3 개인 앨범 커버 호버 확대/축소 효과[프런트엔드 템플릿] 가정 장식 청소 및 수리 서비스 회사 웹사이트 템플릿[프런트엔드 템플릿] 신선한 색상의 개인 이력서 가이드 페이지 템플릿[프런트엔드 템플릿] 디자이너 크리에이티브 작업 이력서 웹 템플릿[프런트엔드 템플릿] 현대 엔지니어링 건설 회사 웹사이트 템플릿[프런트엔드 템플릿] 교육 서비스 기관을 위한 반응형 HTML5 템플릿[프런트엔드 템플릿] 온라인 전자책 쇼핑몰 웹사이트 템플릿[프런트엔드 템플릿] IT 기술로 인터넷 회사 웹 사이트 템플릿을 해결합니다.[프런트엔드 템플릿] 보라색 스타일 외환 거래 서비스 웹 사이트 템플릿[PNG 소재] 귀여운 여름 요소 벡터 자료(EPS+PNG)[PNG 소재] 4개의 빨간색 2023 졸업 배지 벡터 자료(AI+EPS+PNG)[배너 그림] 노래하는 새와 꽃 디자인 봄 배너 벡터 자료로 가득 찬 카트(AI+EPS)[PNG 소재] 황금 졸업 모자 벡터 자료(EPS+PNG)[PNG 소재] 흑백 스타일 산 아이콘 벡터 자료(EPS+PNG)[PNG 소재] 다양한 색상의 망토와 포즈를 갖춘 슈퍼히어로 실루엣 벡터 자료(EPS+PNG)[배너 그림] 플랫 스타일 식목일 배너 벡터 자료(AI+EPS)[PNG 소재] 9개의 만화 스타일의 폭발적인 채팅 거품 벡터 자료(EPS+PNG)[프런트엔드 템플릿] 가정 장식 청소 및 수리 서비스 회사 웹사이트 템플릿[프런트엔드 템플릿] 신선한 색상의 개인 이력서 가이드 페이지 템플릿[프런트엔드 템플릿] 디자이너 크리에이티브 작업 이력서 웹 템플릿[프런트엔드 템플릿] 현대 엔지니어링 건설 회사 웹사이트 템플릿[프런트엔드 템플릿] 교육 서비스 기관을 위한 반응형 HTML5 템플릿[프런트엔드 템플릿] 온라인 전자책 쇼핑몰 웹사이트 템플릿[프런트엔드 템플릿] IT 기술로 인터넷 회사 웹 사이트 템플릿을 해결합니다.[프런트엔드 템플릿] 보라색 스타일 외환 거래 서비스 웹 사이트 템플릿회사 소개부인 성명SitemapPHP 중국어 웹사이트:공공복지 온라인 PHP 교육,PHP 학습자의 빠른 성장을 도와주세요!