自動検証機能を備えたHtml5ユーザー登録のデモを書きました。認証には Handlebarsテンプレートテクノロジーと携帯電話認証コードを使用します。
以下はエフェクトのスクリーンショットです:
1. ページコード: usersRegister.hbs
>
< ;html lang="ja">
<頭 >
<meta http-equiv="Content-Type" content="text/html; charset=utf-8 「>」 ;
<meta http-equiv="X-UA互換" content="IE=edge" />
< ;title>用户注册title>
<div style="身長:5px;text-align:center;font-size:25px"> 欢迎您注册!div>
<フォーム id="私のフォーム" クラス=「マイフォーム」>
<div>
<ラベル>用户名:ラベル>< input id="username" name="username" type="text" />
div>
<div>
ラベル>密码:ラベル>< ;input id=「パス」 名前=「パスワード」 type=「テキスト」 />
div>
div >
=「メールアドレスが必要」 " type="email" />
div>
<div>
<ラベル&g t;電话:label><input id="電話" type="text" name="電話" data-ideal="電話" />
< /div>
<div>
<label>供应商V码: label><input id="vCode" type="text" name="vCode" data-ideal= 「vコード」 />
div>
<div>
<ラベル> ;真实姓名:label><input id="trueName" type="text" name =「本当の名前」 data-ideal="trueName" />
div>
<div>
<label>手机验证码:label><input id=「電話コード」 type= "text" name="telCode" data-ideal="telCode" />
"margin-bottom:5px;">
<>携帯電話認証コードを取得ボタン> margin-top:5px; :5px ;「/> --<div > <ラベル>性別: ラベル
id=「性別」 名前=「性別」 > オプション>
select &gt;&lt;/
div<label>昵称:label><input id="ニックネーム" タイプ=" text" name="nickName" data-ideal="nickName" />
div >
div>
nbsp; <label>年龄:label><input id="age" type =「テキスト」 名前=「年齢」 data-ideal=「年齢」 />
div> ;-->
div>
<script type="text/javascript">
オプション = {
},
'メール' : {
フィルター : '必須のメールアドレス'
フィルター : 「必須の digit」、
データ : {
最小: 16、
最大: 70
}
}、
「ファイル」 : {
データ : {
最小: 2,
最大: 3
},
エラー : {
min : 「少なくとも <strong」をチェックしてください>2strong> オプション。」、
最大 : 「以下」 強い>3強い> オプション すべてを負っています。」
}
}
*/
}
};
$('#getTelCode').click(function() {
var telephone = document.getElementById("telephone").value; / /手机番号番号
if (電話 == null || 電話 == ""){
alert("携帯番号番号は空ではありません!");
}
else{
$.ajax({
json",
api/getTelCode?電話 ="+ 電話、
var $('#my-form') .idealforms(オプション).data( 'idealforms');
$('#submit').click( function() {
ユーザー名
var password =
document= do;キュメント .getElementById(" email ") (vcode ") "+ ユーザー名 +" パスワード
=メール="+メール +"電話
=vCode="+vCode +" telCode
=trueName="+ trueName,
成功: function(msg) {:8083/uimcardprj/share/meun jsp / ディレクトリを取得します。ホスト アドレスの後に次のように追加します。uimcardprj/share/meun.jsp
pathName = window.document.location.pathname;
localhostPaht
.sub
string。 substring(0, pathName.substr(1).indexOf('/') + 1); アラート("登録が成功しました!");
$('#reset').click(function() {
>
/*------------------------------------------ ----------------------------
jq-idealforms 2.1
* 著者: Cedric Ruiz
* ライセンス: GPL または MIT
* デモ: http://elclanrs.github.com/jq-idealforms/
*
------------- -------------------------------------------------- -----------*/
;(function ( $, window, document, unknown ) {
'use strict';
// Global Ideal Forms namespace
$.idealforms = {}
$.idealforms.filters = {}
$.idealforms.errors = { }
$.idealforms.flags = {}
$.idealforms.ajaxRequests = {}
/*--------------------------- -----------------------------------------------*/
/**
* @namespace さまざまな ユーティリティのためのチェスト
*/
var Utils = {
object} $elms
returns {number}
maxWidth = 0
= $(this).outerWidth()
maxWidth ) {
= width
var value = $('<p class="' + name + '">p&gて;')。 Hide().appendTo('body').css( prop )
$('.' + name).remove()
return ( /^d+/.test( value ) ? parseInt( value , 10 ) : 値 )
},
/**
* ES5 オブジェクトのようなkeys
*/
getKeys: function( obj ) {
var keys = []
for(var key in obj) {
if ( obj.hasOwnProperty( key ) ) {
keys.push( key )
}
}
リターンキー
},
// オブジェクトの長さの取得
getObjSize: function( obj ) {
var size = 0, キー;
for ( key in obj ) {
if ( obj.hasOwnProperty( key ) ) {
size++;
}
}
サイズを返す。
},
isFunction: function( obj ) {
return typeof obj === nbsp;'function'
},
isRegex: function( obj ) {
return obj instanceof RegExp
},
isString: function( obj ) {
return typeof obj === 'string'
},
getByNameOrId: function( str ) {
el = $('[name="'+ str +'"]').length
name="'+ str +'"]') // 名前別
},
getFieldsFromArray: function( fields ) {
var f = []
for ( var i = 0, l = フィールド.length; i < l; i++ ) {
f.push( Utils.getByNameOrId( fields[i] ).get(0) )
}
戻る$( f )
},
convertToArray: function( obj ) {
type = $el.attr('タイプ') || $el[0].tagName.toLowerCase()
items
= [], item, i, lenvar item, value, arr
arr = str.split('::')
item = arr[ 0 ]
値 = arr[ 1 ]
} else {
item = value = str
}
return { item: item, value: value }
}
// テキスト & ファイル
if ( /^(text|password|email|number|search|url|tel|file|hidden)$/.test(type) )
マークアップ = '+
'type="'+ type +'" '+
'id="'+ name +'" '+
'名前= "'+ 名前 +'" '+
'値="'+ 値 +'" '+
(プレースホルダー && 'プレースホルダー) =「'+ プレースホルダー +'」 ') +
'/>'
// Textarea
マークアップ = '< textarea id="'+ name +'" name="'+ name +'" value="'+ value +'">textarea >'
アイテム = []
i = 0, len = list.length; 私は レン; i++ ) {
item = splitValue( list[ i ] ).item
= splitValue( list[ i ] ).value
items.push('<オプション value="'+ value +'">'+ item +'オプション& GT;」 )
}
マークアップ =
'="'+ 名前 +'"> '+
items.join('') +
'select>'
}
// ラジオチェック
if ( /(radio|checkbox)/.test( type ) ) {
items = []
for ( i = 0, len = list.length; 私は < len; i++ ) {
item = splitValue( list[ i ] ).item
value = splitValue( list[ i ] ).value
label>'+
'input type="'+ type +'" name="'+ name +'" value="'+ value +'" />'+ item +
'
ラベル>'
)アイテム.join('')
}関数 (コンテナ) {
var$contents = this,
コンテナコンテナ = コンテナ,
= $('<ul クラス= "ideal-tabs-wrap"/>'),
= (function () {
= []
= $(this).attr('name')
var
'
スパン>' + 名前 + 'スパン>'+
'i class="ideal-tabs-tab-counter ideal-tabs-tab-counter-zero">0i>'+
'li>' tabs.push(html)
var
return re.test($(this).text())
})
return $ tab.index()
}
},
/**
* パブリック メソッド
*/
メソッド
/**
* Switch tab
*/
idx = Utils.isString(nameOrIdx)
= Actions.getCurIdx() + 1
$tabs.length - 1
$
$counter.removeClass('理想的な-tabs-tab-counter-zero')
}
$counter.html(text)
}
}
// メソッドを添付
for (var m inメソッド)
$contents[m] = メソッド[m]
// Init
name
= $(this).text()$contents.switchTab(name)
})
// DOM & イベントに挿入
this = $(this), name = $(this).attr ('name')
<select> menu jQuery plugin
.fn.idealSelect = function () {
select = $(this),
オプション&nbnbsp;= $select.find('option')
idealSelect = (function () {
ラップ = $ ('<ul class="ideal-select '+ $select.attr('name') +'"/>'),
menu = $(
<li><スパン class="ideal-select-title"> ' +
span>li>'
items = (function () {
items = []
var $this = $(this)
items.push('<li class=" 「>」 + $this .text() + 'li>')
})
返品商品
}())
$menu.append(' <ul class="ideal-select-sub">' + items.join('') + 'ul>')
$wrap.append($menu)
return {
/**
* @namespace カスタム選択のメソッド
* @memberOf $.fn.toCustomSelect
*/
var
ActionsgetSelectedIdx: function () {
return idealSelect.items
.filter('. Ideal-select-item-selected').index()
},
/**
* @private
*/
init: (function () {
$select.css ({
位置
最小幅
',.eq($options.filter(':selected').index())
.addClass('ideal-select-item-selected')
}()),
noWindowScroll: function (e) {
e.that === 40 || e.that === 38 || e.that === 13) {
dir) {
selected = idealSelect.items.filter('.ideal-select-item-selected') ,
itemHeight = idealSelect.items.outerHeight(),
menuHeight = idealSelect.sub.out erHeight(),
isInView = (function () {
elPos = $selected.position().top + itemHeight
dir === 'down'
<= menuHeight
: elPos > 0
}())
if (!isInView) {
itemHeight = (dir === 'down')
? itemHeight // 下がる
: -itemHeight // 上がる
= Actions.getSelectedIdx(),
= idealSelect.items.outerHeight(),
= idealSelect.items.length,
= height * nItems,
= height * (nItems - idx)
select: function (idx) {
idealSelect.items
.removeClass('ideal-select-item-selected')
idealSelect.items
var text = idealSelect.items.eq(idx).text()
Actions.select(idx)
idealSelect.title.text(テキスト)
$options .eq(idx).prop('selected', true)
$select.trigger('change')
= Actions.getSelectedIdx(),
idealSelect.select.is('.ideal-select-メニュー')、
IdealSelect.select.is('.ideal-select-open')
/**9: 関数 () { // TAB
Actions.change(idx)
},
27: function () { // ESC
if ( isMenu) Actions.hideMenu()
40: function () { // DOWN
if (idx
<: Actions.change(idx + 1)
}
Actions.scrollIntoView('down ')
},
38: function () { // UP
if (idx > 0) {
は開いています
?? Actions.select(idx - 1)
: Actions.change(idx - 1)
}
Actions.scrollIntoView('up')
},
'デフォルト': function () { // Letter
var
letter = String.fromCharCode(key),
$matches = idealSelect.items
。 filter(function () {
return /^w+$/i.test( letter ) && // 修飾キー ( ctrl, cmd, meta, super... )
新しい RegExp( '^' + letter, 'i').test( $(this).text() ) // 最初の一致を見つける
nMatches = $matches.length,
counter = idealSelect.select.data('counter') + 1 || 0,
curKey = idealSelect.select.data('key') || key,
newIdx = $matches.eq(counter).index()
curKey === key) {
if (counter < nMatches) {
idealSelect.select.data('counter', counter)
}
else {
idealSelect.select。 data('counter', 0)
newIdx = $matches.eq(0).index()
= $matches.eq(0).index()
}
keys[キー]
? キー[キー]()
: キー['デフォルト']()
}
}
/**
* @namespace 「メニューモード」および「リストモード」のカスタム選択のすべてのイベントを保持します
* @memberOf $.fn.toCustomSelect
*/
var
イベントfocus: Actions.focus,
'blur.menu': function () {
Actions.blur()
Actions.hideMenu()
},
'blur.list': function () {
Actions.blur()
},
})
},
'mousedown.list': function () {
Actions.focusHack()
}
}
// イベントをリセット
var
disableEvents() { idealSelect.select.removeClass('ideal-select-menu ideal- select-list')
$select.off('.menu .list')
idealSelect.items.off('.menu .list')
idealSelect。 select.off('. menu .list')
idealSelect.title.off('.menu .list')
}
// メニューモード
idealSelect.select.on('menu', function () {
disableEvents()
idealSelect.select.addClass('ideal-select-menu')
Actions.hideMenu()
$select.on({
'blur.menu': events['blur .menu'],
'focus.menu': events.focus,
'keydown.menu': events.keydown
})
idealSelect.select.on('mousedown .menu', events['hideOutside.menu'])
idealSelect.items.on('click.menu', events['clickItem.menu'])
idealSelect.title.on('click .menu', events['clickTitle.menu'])
})
// リストモード
idealSelect.select.on('list', function () {
disableEvents ()
idealSelect.select.addClass('ideal-select-list')
Actions.showMenu()
$select.on({
'blur.list': イベント['blur.list'],
Actions.change(0)
})
idealSelect.select.trigger('menu') // デフォルトは「メニューモード」
})
=
checkbox=
radiofunction
() {return this.each(function() { var $this = $(this)
var $span = $('<span/>')
= $(this)
="radio"]') {
= typeof $('<input/>')[0].multiple !== '未定義',
= / msie/i.test( navigator.userAgent )
= function() {
)
= $(this).addClass('ideal-file'), // 元のファイル入力
= $('div class="ideal-file-wrap">'),
$input = $('<input type="text" class="理想的なファイル名" /> ')、
// IE 以外のブラウザで使用されるボタン
$ボタン = $('<ボタン type= 「ボタン」 クラス=「理想-ファイルアップロード">開くボタン>'),
ラベル = $('< label class="ideal-file-upload" for="'+ $file[0].id +'">Openlabel> ;')
// 複数がサポートされている場合は、
for ( var
0, len = fileArr.length; 私は< レン; i++ ) {
files.push( fileArr[i].name )
}
ファイル名 = ファイルs.join(', ')
// サポートされていない場合は、値
// パスを削除すると、ファイル名だけが表示されます
} else {
ファイル名 = $file.val().split('\').pop()
}
$input.val( filename ) // 値を設定する
.attr( 'title', filename ) // ファイル名を表示タイトル トゥーリップ
})
$ input.on({
focus: function () { $file.trigger('change') },
blur: function () { $file.trigger('blur') },
e.which=== 8 ||e。wich=== 46){// Backspace&del
//
// 元の イベントがすべて添付された クリーンな クローン
= $file.val('' ).clone( true ) )
$file.trigger('change')
e.that === 9 ) { // TAB
}
})
}
}( jQuery ))
/**
* @namespace エラー
* @locale en
*/
$ .idealforms.errors = {
が必要です: 'これは必須です。'、
番号: '数字である必要があります。'、
数字: '一意の番号である必要があります。'、
名前: '少なくとも 3 文字である必要がありますは長く、「
ユーザー名:」の文字のみを含めることができます。ユーザー名は最短で 5 桁、最長で 30 ビットです。英語の文字、数字、中国語、および下位行を使用してください。完全な数字。中国語は最大 21 単語。'、
pass:' パスワードの数は 6 ~ 15 ビットで、少なくとも 1 つの数字、大文字、および小文字を使用する必要があります。'、
Strongpass: '長さは 8 文字以上で、少なくとも 1 つの大文字、1 つの小文字、および 1 つの数字または特殊文字が含まれている必要があります。'、
email: '有効なメール アドレスである必要があります <。 em>(例: user@gmail.com)em>'、
電話: '<em >(例: 18723101212)em>',
zip: '<em > (例: 33245 または 33245-0003)em>',
url: '有効な URL である必要があります & lt;em> ;(例:www .google.com)em>',
minChar: '少なくとも 0} strong> 文字の長さである必要があります。', minOption: '少なくとも strong
> ;maxChar: '<strong>{0} ',
<strong>{0}strong> オプション以上は許可されません。 '、
range : '{0} から {1} までの数値である必要があります。'、 date: '有効な日付である必要があります >'、
dob: 「有効な生年月日である必要があります。」、
<em>(例: "{0}")em>',
< 強い> {0}strong> は利用できません。',
} /** * すべてのデフォルト フィルタを取得
getFilters
=filters
= {正規表現: /.+/,
エラー: $.idealforms.errors.required},
strongpass: {
正規表現: /(?=^.{8,}$)(( ?=.*d)|(?=.*W+))(?![.n])(?=.*[A-Z])(?=.*[a-z]).*$/,
エラー: $.idealforms.errors.strongpass
}、
メール: {
正規表現: /^([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})?$/ 、
エラー: $.idealforms.errors.email
}、
inputinput = input.input,
min = input.userOptions.data.min,
isRadioCheck = $input.is('[type="チェックボックス"], [type="radio"]')
= $.idealforms.errors.minOption.replace( '{0}', min )
return $input.filter(':checked').length}
戻り値.length
}
input = input.input,
input.userOptions.data.max,
type="チェックボックス"], [type="ラジオ" ]')
if ( isRadioCheck ) {
this.error = $.idealforms.errors.maxOption.replace( '{0}', max )
return $input.filter(':checked' ).length <= max
}
this.error = $.idealforms.errors.maxChar.replace( '{0}', max )
<= 最大
= input。 userOptions.data.range,
= +value
= $.idealforms.errors.range
= range[0] && val <= range[ 1]
=
.userOptions.data && input.userOptions.data.date
= /[^mdy]/.exec( userFormat ) [0]、
= userFormat.split(区切り文字),
= value.split(区切り文字),
= function( 日付, 形式 ) {
= 0, len = format.length; i << レン; i++ ) {
if ( /m/.test( format[i]) ) m = date[i]
if ( /d/.test( format[i]) ) d = date[i]
if ( /y/.test( format[i]) ) y = date[i]
}
戻る (
m > 0 && m < 13 &&
y &&y.length === 4 &&
> 0 && d <= ( 新しい 日付( y, m, 0 ) ).getDate()
return isDate( theDate, theFormat )
dob: {
? input.userOptions.data.dob
input: input .input,
filters.date.regex( dateInput, value ),
// 生年月日the Year = /d{4}/.exec( value ),
max Year = new Date().getFull Year(), // Current 年
分年 = maxyear - 100
this.error = $.idealforms.errors.dob
Return isDate && the Year >= min年 && the年 <= max年
}
},
exclude: {
regex: function( input, value ) {
var $inputinput = input.input,
exclude = input.userOptions.data.exclude,
isOption = $input.is('[type="チェックボックス"], [type= 「ラジオ」]、 select')
this.error = isOption
?? $.idealforms.errors.excludeOption.replace( '{0}', value )
: this.error = $.idealforms.errors.exclude.replace( '{0}', value )
$ $ .inarray(value、exclude)===-1
}}}、
equalto:{
regex:function(input、value){
var $
equals$input
名前
= $equals.attr('名前') || $equals.attr('id'),isValid
= $equals.parents('.ideal-field').filter(){ return $(this).data(' Ideal-isvalid') === true })
this.error = $.idealforms.errors.equalto.replace( '{0}', name )
return $input.val() === $equals.val()
}
files = input.input[0].files | | [{ name: value }],
extensions = input.userOptions.data.extension,
re = new RegExp( '\.'+ extensions.join('| ') +'$', 'i' ),
有効 = false
i = ) 0, len = files.length; 私は < len; i++ ) {
= re.test( files[i].name );
= $.idealforms.errors.extension.replace( '{0}', extensions.join('", "') )
= this
input = input.input
= input.userOptions
varvar $
var
false
varuserOptions .errors && userOptions.errors.ajax
customErrors && customErrors.success
? CustomErrors.success
: $.idealforms.errors.ajaxSuccess.replace( '{0}', value )
self.error.fail = customError s && customErrors.error
data = {}
trim( value )
userAjaxOps = input。 userOptions.data.ajax
ajaxOps = {
$input.data( 'ideal-ajax-error', self.error.fail )
$field.removeClass('ajax')
// カスタムエラーコールバックを実行
if (userajaxops._error){
userajaxops._error(xhr、text、error)
}
}
}
}
$ .extend(ajaxops、(ajaxops、 userAjaxOps )
// Init
$input.removeData('ideal-ajax-error')
$input .removeData('ideal-ajax-resp')
$field。 addClass('ajax')
// リクエストを実行して保存すると、中止できるようになります
// リクエストがバブルにならないようにします
$.idealforms.ajaxRequests[ name ] = $。 ajax( ajaxOps )
}
}
}
フィルタを返す
}
$.idealforms.flags = {
noerror: function (i) {
i.parent().siblings('.ideal-error').hide()
},
noicons: function (i) {
私。兄弟('.ideal-icon-valid, .ideal-icon-invalid').hide()
},
novalidicon: function (i) {
var _defaults = {
入力: {},
customFilters: {}, customFlags: {}、
globalFlags: '',
onSuccess : function(e) { alert('Thank you...') },
onFail: function() { alert('無効!') },
ResponseAt: 'auto',
自分
=form
= $( element )self.opts = $.extend( {}, _defaults, options )
tabs = 自分.$form .find('section')
$.extend( $.idealforms.filters, getFilters() )
self._init()
// プラグイン
.fn.idealforms
=})
LessVars
= {*/
自分
=o
=formElements
=self.$form.css( 'visibility
'、 '可視' )。 addClass('ideal-form')
.attr( 'novalidate', 'novalidate' ) // HTML5 検証を無効にする// マークアップを行う
formElements.inputs.each(function(){ self._doMarkup( $(this) ) })
// タブを生成
if ( self.$tabs.length ) {
var $ tabContainer = $('<div class="ideal-wrap ideal-tabs ideal-full-width"/>')
self.$form.prep終了( $tabContainer )
self.$tabs.idealTabs( $tabContainer )
}
// 常に 下に datepicker を表示入力
if ( jQuery.ui ) {
$ .datepicker._checkOffset = function( a,b,c ) { return b }
}
// data-ideal で指定された入力を追加
// ユーザーのリストにinputs
self.$form.find('[data-ideal]').each(function() {
var userInput = o.inputs[ this.name ]
o.inputs[ this.name ] = userInput || { filters: $(this).data('ideal') }
})
// レスポンシブ
if ( o.sensitiveAt ) {}
submit: function( e ) {
if ( !self.isValid() ) {
e.preventDefault()
o.onFail()
self.focusFirstInvalid()
} else {
o.onSuccess( e )
}
}
})
self._adjust()
self._attachEvents()
self.fresh() // 新しく開始
},
_getFormElements: function() {
return {
inputs: this.$form.find('input, select, textarea, :button'),
ラベル: this.$form.find ('div > label:first-child'),
text: this.$form.find('input:not([type="checkbox"], [type ="ラジオ"], [type="送信"]), textarea'),
select: this.$form.find('select'),
ラジオチェック: this.$form.find('input[type="ラジオ"], input[type="チェックボックス"]'),
ボタン: this.$form.find(' :button'),
file: this.$form.find('input[type="file"]'),
Headings: this.$form.find('h1, h2, h3, h4, h5, h6')、
区切り文字: 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 ) {
var 自分 = this
var isNumber = !isNaN( nameOrIdx )
if ( isNumber ) {
return self.$tabs.eq( nameOrIdx )
}
return self.$tabs.filter(function() {
re = new RegExp( nameOrIdx, 'i' )
_updateTabsCounter: function() {
var self = this
self.$tabs.each(function( i ) {
var 無効 = self。 getInvalidInTab( i ).length
self.$tabs.updateCounter( i, invalid )
self = this
o = self.opts
formElements = self._getFor mElements()
curTab = self._getCurrentTabIdx( )
labels = formElements.labels
// 計算完了 タブを非表示
if ( self.$tabs.length ) {
self.$tabs.hide()
self.switchTab( curTab )
}
},
_setDatepicker: function() {
o
=var $datepicker
=if ( jQuery.ui && $datepicker.length ) {
var userInput = o.inputs[ this.name ]
data = userInput && userInput.data && userInput.data.date
format = データ ? data.replace( 'yyyy', 'yy' ) : 'mm/dd/yy'
onChangeMonth Year: function() {
this = $(this)
w = $this.outerWidth() // cache first!
w = t.outerWidth()
t.datepicker('widget').css( 'width', w )this.opts
varUtils.getIdealType( $element ) // 検証要素
var $フィールド = $('<span class="理想フィールド"/>')
var $エラー = $(' <span class="ideal-error" />')
var $valid = $('i クラス= "ideal-icon ideal-icon-valid" />')
invalid = $('<i class="理想のアイコン-invalid"/>')
idealElements = {
if ( !isWrapped ) {
}
},
if ( !/select/.test( o.disableCustom ) ) {
$element.idealSelect()
}
},
="ideal-Heading"/>') },
="ideal-separator"/>') }
this
var o = this
.optsvar userOptions = o.inputs[ $input.attr('name') ]
var userFilters = userOptions.filters && userOptions.filters.split( /s/)
var name = $input.attr('name')
var value = $input.val()
var ajaxRequest = $ .idealforms.ajaxRequests[ 名前 ]
var isRadioCheck = $input.is('[type="チェックボックス"], [type="radio"]')
var inputData = {
// ラジオまたはチェックの場合、名前に関連するすべての入力を検証します
input: isRadioCheck ? self.$form.find('[name="' + name + '"]') : $input,
= $input.parents('.ideal-field')
= $field.siblings('.ideal-error')
= isRadioCheck
isRadioチェック
? $input.parent().siblings('.ideal-icon-valid')function resetError() {
$field.removeClass('valid invalid').removeData('ideal-isvalid')
$error.add( $invalid ).add( $valid ).hide()
// 入力時に検証を防ぎますが、新しい文字は導入しません
// これは主に 複数の AJAX リクエスト
var oldValue = $input.data('理想値') | | 0
$input.data( 'ideal-value', value )
if ( e.type === 'keyup' && value === oldValue ) { return false }
// 検証
if ( userFilters ) {
theFilter = $.idealforms.filters[ filter ]
customError = userOptions.errors && userOptions.errors[ filter ]
error = ''
return false
}
if ( theFilter ) {
// 中止して ajaxをリセットする保留中のリクエストがある場合
if (
e.typeajaxRequest.abort()
=== 'ajax' ) {
nbsp; showOrHideError( error, false ) // 応答が返されるまで 無効に設定します
=== 'keyup' ) {
} else {
if ( ajaxError ) {
showOrHideError( ajaxError, $input.data('ideal-ajax-resp') || false )
}
}
valid = Utils。 isRegex( theFilter.regex ) && theFilter.regex.test( value ) ||
= カスタムエラー || theFilter.error // regex() の呼び出し後にエラーを割り当てる
showOrHideError( error, valid )if ( !valid ) { return false }
}
}
} )
}
// フィルタがない場合はリセット
else {
resetError()
}
// フラグ
var
flagsvar
f.flags && userOptions.flags.split(' ') || [] if ( o.globalFlags ) {
$.each( o.globalFlags.split(' '), function( i,v ) { f.push(v) })
}
return f
}())
if ( flags.length ) {
theFlag
= $.idealforms。 flags[f]if ( theFlag ) { theFlag( $input, e.type ) }
self._updateTabsCounter( self._getCurrentTabIdx() )
}
self = this
this = $(this)
field = $this .parents(' .ideal-field')
isFile = $this.is('input[type=file]')
タイプ=ファイル cuz カスタム ファイル
tabIndex = -1)
e.type === 'focus' || isFile && e.type = == 'change' ) {
e.type === 「ぼかし」 ) {
formElements = this._getFormElements()
maxWidth = LessVars.fieldWidth + formElements.labels.outerWidth()
emptyLabel = formElements.labels.filter(function() {
= this.$form.find('.ideal-select')
=== 'auto'
maxWidth )
this.opts.ownedAt )
= this.$form.is('.stack')
$customSelect.trigger( isStack ? 'list' : 'menu' )
// datePickerを隠す
var $datePicker = this.$form.find('input.hasDatepicker' )
if ( $datePicker.length ) { $datePicker.datepicker('hide') }
}
})
/*
* パブリック メソッド
*/
$.extend( IdealForms.prototype, {
getInvalid: function() {
return this.$form.find('.ideal-field ').filter(関数( ) {
return $(this).data('ideal-isvalid') === false
})
},
getInvalidInTab: function( nameOrIdx ) {
return this._getTab( nameOrIdx ).find('.ideal-field').filter(function() {
return $(this).data('ideal-isvalid') === false
})
},
isValid: function() {
input = Utils.getByNameOrId( field )
first
=var tabName
= $first .parents('.ideal-tabs-content').data('ideal-tabs-content-name')if ( this.$tabs.length ) {
switchTab: function( nameOrIdx ) {
this.$tabs.switchTab( nameOrIdx )
return this
},
nextTab: function() {
this .$tabs.nextTab()
return this
},
prevTab: function() {
= Utils .convertToArray( fields )
Utils.getByNameOrId( fields[ i ] )
$input.change( ).parents('.ideal-field').removeClass('valid invalid')},
reload: function() {
this._adjust()
this._attachEvents()
return this
}、
reset: function() {
var
formElements。 _getFormElements() formElements.text.val('') // テキスト入力
formElements.radiocheck.removeAttr('checked') // ラジオ&チェック
// 選択と カスタム選択
formElements.select.find('option').first().prop( 'selected', true )
this.$form.find('.ideal-select').trigger('reset' )
if ( this.$tabs.length ) { this.firstTab() }
this.focusFirst().fresh()
return this
}、
resetFields: function( fields ) {
fields = Utils.convertToArray( fields )
var formElements = this._getFormElements()
$.each( fields, function( i, v ) {
var $input = Utils.getByNameOrId( v )
var type = Utils.getIdealType( $input )
if ( type === 'text' | | type === 'file' ) {
=== 'radiocheck' ) {
$input.find('オプション')。 first().prop( 'selected', true )
Utils .convertToArray( fields )
varthis
var $Utils.getFieldsFromArray(フィールド )
$fields.each(function() {var
var
self.opts.inputs[ name ]
varinput && input.filters
var$this.data( 'ideal-filters', filters )
return this
},
setOptions: function( options ) {
= Utils.convertToArray(フィールド )
= this
= []
= ops.name
= {
= ops.label || ''
= ops.type
= ops.list || []
= ops.placeholder || ''
= ops.value || ''
= $('<div>'+
ラベル>'+ ラベル +': label>'+
'div>')
var $input = $field.find('input, select, textarea, :button ')
//フィルタ付きの入力をリストに追加します
// 検証するユーザー入力
if ( userOptions.filters ) { self.opts.inputs[ name ] = userOptions }
self._doMarkup( $input )
// DOM に挿入
if ( ops.addAfter ) {
$field.insertAfter(
$( Utils.getByNameOrId( ops.addAfter ) ).parents('. Ideal-wrap')
)
fields
.convertToArray( fields ) var $
fields.getFieldsFromArray( fields ) $fields.parents('.ideal-wrap').remove()
this.reload()
}( jQuery, window, document ))
【関連する推奨事項】
4. 5.以上がH5によるユーザー登録の自動認証を完了する例を詳しく解説の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。