Maison >interface Web >Tutoriel H5 >Exemple détaillé de H5 effectuant la vérification automatique de l'enregistrement de l'utilisateur

Exemple détaillé de H5 effectuant la vérification automatique de l'enregistrement de l'utilisateur

Y2J
Y2Joriginal
2017-05-24 13:27:072568parcourir

Html5ImplémentationEnregistrement de l'utilisateurExemple de code de fonction de vérification automatique

24-05 10:49:46 Auteur : site Web chinois php

J'ai pris le temps d'écrire une démo d'enregistrement d'utilisateur Html5 avec fonction de vérification automatique. Handlebarstechnologie de modèle et téléphone portablecode de vérification sont utilisés pour la vérification.

Ce qui suit est une capture d'écran de l'effet :

1. Code de la page : usersRegister.hbs

XML /HTMLCodeCopier le contenu dans le presse-papier
  1. >     

  2.      

  3.      

  4.      

  5. <html lang="fr">     

  6.      

  7. <tête>     

  8.     <meta http-equiv="Content-Type" content="text/html; charset =utf-8">     

  9.     <meta http-equiv="Compatible X-UA" content="IE=edge" />     

  10.     <titre>用户注册titre >     

  11.          

  12.     <div class="main" >     

  13.         <div style="hauteur:5px;text-align:center ;font-size:25px"> 欢迎您注册!div>     

  14.              

  15.          <formulaire  id="my-form" class="myform">      

  16.             <div>     

  17.                 <étiquette>用户名 :étiquette><input id="username" name="username" type ="texte" />     

  18.            div >     

  19.             <div>     

  20.                     

  21.                 <étiquette>密码 :étiquette><entrée id="pass" nom="mot de passe" type="texte" />     

  22.             div>     

  23.              <div>     

  24.                <label>邮箱:étiquette><entrée id="e-mail" nom="e-mail"     

  25.                                           idéal pour les données="exigerd email" type="email" />     

  26.             div>     

  27.             <div>     

  28.                 <étiquette>电话 :étiquette><entrée id="téléphone" type="texte" nom= "téléphone" data-ideal="téléphone" />     

  29.              div>     

  30.             <div >     

  31.                 <étiquette>供应商V码 :étiquette><entrée id="vCode " type="text" name="vCode" data-ideal="vCode" />     

  32.             div>     

  33.             <div>     

  34.                 <étiquette>真实姓名 :étiquette><input id="trueName" type="text" name="trueName" data-ideal="trueName" />     

  35.             div>     

  36.              <div>     

  37.                 <label>手机验证码 :label><input id= "telCode" type="text" name="telCode" data-ideal="telCode" />     

    <
  38. div

     style="marge-bas:5px;"

    >
  39.      
  40.                 <bouton id="getTelCode" type=

    "bouton"
  41.  
  42. style

    ="marge-gauche:160px; marge-droite:auto;"  >获取手机校验码bouton>                     & lt ;hr style="margin-top:5px; margin-bottom:5px;" 

    /> ;
  43.      
  44.             div>      & lt;! -

    & lt;
  45. div

    & gt;

    & lt;
  46. étiquette

    >性别 :étiquette

    >

  47.      
  48.                <sélectionner identifiant="sexe" nom=

    "sexe"
  49. >

                            <option valeur="男">

  50. option

    >                           <option valeur="女">

  51. option

    >                     sélectionner>             

  52. div

    >                  <

  53. div

    >     

  54.                 <étiquette>昵称 :étiquette ><input id="nickName" type="text" nom="nickName" data-ideal="nickName" />     

  55.             div>     

  56. <div>     

  57.            nbsp;     <étiquette>年龄 :étiquette><entrée id="age" type="text" name="age" data-ideal="age" />     

  58.             div>-->     

  59.             

  60.      
  61.     div

    >

  62.      
  63. < ;
  64. script

     type="text/javascript">     

  65. var options = {             onFail : function() {                  alert($myform.getInvalid().length + ' champs invalides.')     

  66.         },     

  67.         entrées : {     
  68.             'mot de passe ' : {     
  69.                 filtres : 'passe-obligatoire'     
  70.             },     
  71.             'nom d'utilisateur' : {     
  72.                 filtres :  'nom d'utilisateur obligatoire '     
  73.             },     
  74.             'e-mail'  : {     
  75.                 filtres : 'e-mail obligatoire '     
  76.              },     
  77.             'téléphone'  : {
  78.                 filtres : 'téléphone obligatoire"     
  79.              },     
  80.             'trueName'  : {     
  81.                 filtres : 'obligatoires'     
  82.             },     
  83.             'vCode'  : {     
  84.                 filtres : 'obligatoires'     
  85.             },     
  86.             'telCode ' : {     
  87.                 filtres  : 'obligatoires'     
  88.             }     
  89.             /*     
  90.             'âge'  : {     
  91.                 filtres  : 'required digits',     

  92.                  données : {     

  93.                    min : 16,     

  94.                   max : 70     

  95.                 }    

  96.             },     

  97.             'fichier'  : {     

  98.                 filtres :  'extension',     

  99.                 données  : {     

  100.                     extension : [ 'jpg' ]     

  101.                 }     

  102.             },     

  103.             'commentaires'  : {     

  104.                 filtres :  'min max',     

  105.                 données  : {     

  106.                     min : 50,     

  107.                    max : 200     

  108.                 }     

  109. },     

  110.             'états' : {     

  111.                 filtres :  'exclure',     

  112.                 données : {     

  113.                    exclure : [ 'par défaut' ]     

  114.                 },     

  115.                  erreurs : {     

  116.                    exclure : '选择国籍.'     

  117.                 }     

  118.              'langs[]' : {     

  119.                 filtres  :  'min max',     

  120.                 données : {     

  121.                    min : 2,     

  122.                     max : 3     

  123.                 },     

  124.                erreurs : {     

  125.                     min  : 'Vérifiez au moins <fort>2fort> options.',     

  126.                     max : 'Pas plus que <fort>3fort > options autoriséesdues.'     

  127.                 }     

  128.             }     

  129.             */         

  130.         }     

  131.     } ;     

  132.     $('#getTelCode').click(function() {     

  133.         var téléphone =  document.getElementById("telephone").value;    //手机号码     

  134.         if (téléphone ==  null ||  téléphone == ""){     

  135.             alerte("手 机号码不能为空!");     

  136.         }     

  137.         else{     

  138.             $.ajax({     

  139.                 type : "GET",     

  140.                dataType : "json",     

  141.                 url : " ../api/getTelCode?telephone="+ telephone,     

  142.                 succès : function(msg) {     

  143.                 },     

  144.                erreur : fonction(e) {     

  145.                      alert("获取手机校验码失败!" + e);     

  146.                                                                            🎜>

  147. }); 

  148.  var $

    monformulaire

    = $('#mon -form').idealforms(options).data('idealforms'); 
  149. $('#submit').click(function() {
  150. var nom d'utilisateur

    =
  151. document
  152. .getElementById("username").value; //Nom d'utilisateur

  153. var

    mot de passe = document.getElementById("pass") .value; //Mot de passe

  154. var

    email = document .getElementById("email").value; //Adresse email

  155. var

    téléphone = document.getElementById("téléphone ").value; //Numéro de téléphone portable

  156. var

    vCode = document.getElementById("vCode").value; // Code V de l'entreprise

  157. var

    telCode = document.getElementById("telCode").value; //Code de vérification du téléphone portable

  158. var

    trueName = document.getElementById("trueName").value; //Vrai nom

  159. $.ajax({ GET", 

                                                                                                                                                                 >="+ mot de passe +"

  160. e-mail
  161. =

    "+ e-mail +. "

  162. téléphone
  163. =

    "+ téléphone +"

  164. vCode
  165. =

    "+ vCode +"telCode= "+ telCode +"trueName="+ trueName , SUCCÈS : Fonction (msg) { // Obtenez l'URL actuelle, par exemple : http: // localhost: 8083/uIMCARDPRJ/ share/meun.jsp                                                                                                                       🎜>                                                                                                                                                                                                    // Récupère le répertoire après le adresse de l'hôte, telle que : uimcardprj/share/meun.jsp                                           🎜> fenêtre.document.location.pathname

  166. var pos = curWwwPath.indexOf(pathName);

  167. // Récupère l'adresse de l'hôte, Par exemple:: http://localhost:8083

  168. var localhostPaht = curWwwPath.substring(0, pos) ;                                                       // Obtenez le nom du projet avec "/", tel que : /uimcardprj                                                                      > =

    pathName
  169. .
  170. substr

    ing(0, pathName.substr(1).indexOf(' /') + 1); window.location.href

    =
  171. projectName
  172. + "/login";

    🎜> },                                                                            ert( "L'enregistrement a échoué!" > $('#reset').click(function() {

  173. $myform.reset().fresh().focusFirst();

    });                                           🎜>

  174. < ;/
  175. corps

  176. >
  177.  

  178. html
  179. >

     
  180. Vérification des entrées 2.jq : jquery .idealforms.js
  181. La version initiale de cette vérification js vient de Cédric Ruiz, je l'ai légèrement modifiée.
  182. Les règles de vérification partielle sont les suivantes :

    obligatoire : 'Ceci est obligatoire.'
  183. numéro : 'Doit être un nombre.',

    chiffres : 'Doit être un numéro unique.'
  184. name: 'Doit comporter au moins 3 caractères et ne peut contenir que des lettres.'

    username: 'Le nom d'utilisateur doit comporter au moins 5 chiffres, La longueur maximale est de 30 caractères, veuillez utiliser des lettres anglaises, des chiffres, des caractères chinois et des traits de soulignement. Le premier caractère du nom d'utilisateur doit être composé de lettres, de chiffres, de caractères chinois, et non de chiffres. La longueur maximale des caractères chinois est de 21 caractères. 🎜>
  185. pass : 'Le mot de passe doit comporter entre 6 et 15 caractères et contenir au moins un chiffre, une lettre majuscule et une lettre minuscule. '
  186. strongpass : 'Doit comporter au moins 8 caractères. et contenir au moins une lettre majuscule et une lettre minuscule et un chiffre ou un caractère spécial.'e-mail : 'doit être une adresse e-mail valide (Exemple : <.>'">user @gmail.com)'

    téléphone : 'Doit être un numéro de téléphone portable valide. (Exemple : 18723101212)
  187. Ce qui suit est l'intégralité du fichier de code :

    Code XML/HTMLCopiez le contenu dans le presse-papiers

    1. /*------------------------------------ --------------------------------------    

    2. jq-idealforms 2.1    

    3.   * Auteur : Cédric Ruiz    

    4.   * Licence : GPL ou MIT    

    5.   * Démo : http://elclanrs.github.com/jq-idealforms/    

    6.   *    

    7. ------- -------------------------------------------------- -----------------*/     

    8. ;(fonction ( $, fenêtre, document, undéfini ) {     

    9.   'utiliser strict';     

    10.   // Espace de noms Global Ideal Forms     

    11.   $.idealforms = {}     

    12.   $.idealforms.filters = {}     

    13.   $.idealforms.errors = {}     

    14.   $.idealforms.flags = {}     

    15.   $.idealforms. ajaxRequests = {}     

    16. /*----------------------------- ---------------------------------------------*/     

    17. /**    

    18.  * @namespace Un coffre pour divers utilitaires    

    19.  */     

    20. var Utils = {     

    21.   /**    

    22.    * Obtenir la largeur de l'élément le plus large de la collection.    

    23.    * @memberOf Utils    

    24.    * @param {jQuery object} $elms    

    25.    * @retours {numéro}    

    26.    */     

    27.   getMaxWidth: function( $elms ) {     

    28.     var maxWidth = 0     

    29.     $elms.each(function() {     

    30.       var  width = $(this).outerWidth()     

    31.       if ( width > maxWidth ) {     

    32. > >    return maxWidth      

    33.   },     
    34.   /**    
    35.    * Une manière piratée d'obtenir MOINS de variables    
    36.    * @memberOf Utils    
    37.    * @param {string} name Le nom de la classe LESS .    
    38.    * @param {string} prop La propriété css où les données sont stockées.    
    39.    * @returns {number, string}    
    40.    */     
    41.   getLessVar: function( name, prop ) {     
    42.     var value = $('<p class="' + nom + '">p>').hide().appendTo('body ').css( prop )     

    43.     $('.' + name).remove()     

    44.     return ( /^d+/. test( value ) ?  parseInt( value, 10 ) : value )     

    45.   },     

    46.   /**    

    47.    * J'aime l'objet ES5.

      cléss    

    48.    */     

    49.   getKeys : function( obj ) {     

    50.     var 

      keys = []     

    51.     for(var key in obj) {     

    52.       if ( obj.hasOwnProperty( key ) ) {     

    53.         keys.push( key )

    54.       }     

    55.     }     

    56.     retour des clés      

    57.   },     

    58.   // Obtenir la longueur d'un objet     

    59.   getObjSize: function( obj ) {     

    60.     var 

      taille = 0, clé ;     

    61.     pour ( clé dans obj ) {     

    62.       if ( obj.hasOwnProperty( key ) ) {     

    63.         taille++ ;     

    64.       }     

    65.     }     

    66.     taille de retour ;     

    67.   },     

    68.   isFunction : function( obj ) {     

    69.     retour typede 

      obj === nbsp;'function'     

    70.   },     

    71.   isRegex: function( obj ) {     

    72.     retourner obj instance de RegExp      

    73.   },     

    74.   isString : function( obj ) {     

    75.     return typeof 

      obj === 'string'     

    76.   },     

    77.   getByNameOrId: function ( str ) {     

    78.     var $

      el = $('[nom="'+ str +'"]').longueur     

    79.       ? $('[

      nom="'+ str +'"]') // par nom     

    80.       : $('#' + str) // par id     

    81.     return $el.length     

    82.       ? $el     

    83.       : $.error('Le champ "'+ str + '" n'existe pas.')     

    84.   },     

    85.   getFieldsFromArray : function( fields ) {     

    86.     var f = []     

    87.     pour ( var i = 0l = fields.length;  i < l;  i++ ) {     

    88.       f.push( Utils.getByNameOrId( fields [i] ).get(0) )     

    89.     }     

    90.     retour $( f )     

    91.   },     

    92.   convertToArray: function( obj ) {     

    93.     return Object.prototype.toString.call( obj ) === ' [object Array]'     

    94.       ? obj : [ obj ]     

    95.   },     

    96.   /**    

    97.    * Déterminer le type de tout élément Ideal Forms     

    98.    * @param $input jQuery $input object    

    99.    */     

    100.   getIdealType : function( $el ) {     

    101.     var type = $el.attr('type') || $el[0].tagName.toLowerCase()     

    102.     return (     

    103.       /(texte|mot de passe|email|numéro|recherche|url |tel|textarea)/.test( type ) && 'text' ||     

    104.       /file/ type ) && 'file' ||     

    105.       /select/.test( type ) && 'select' ||     

    106.       /(radio|checkbox)/.test( type ) && 'radiocheck' ||     

    107.       /(bouton|soumettre|réinitialiser)/.test( type ) && 'bouton' ||     

    108.       /hd/.test( type ) && 'titre' ||     

    109.       /hr/.test( type ) && 'séparateur' ||     

    110.       /hidden/.test ( type ) && 'masqué'     

    111.     )     

    112.   },     

    113.   /**    

    114.    * Génère une entrée    

    115.    * @param name `name` attribut de l'entrée    

    116.    * @param type `type` ou `tagName` de l'entrée    

    117.    */     

    118.   makeInput: function( nom, valeur, type, liste, placeholder ) {     

    119.     var balisage, éléments  = [], item, i, len     

    120.     function splitValue( str ) {     

    121.       var item, value, arr     

    122.       si ( /::/.test( str ) ) {     

    123.         arr = str.split('::')     

    124.         item = arr[ 0 ]     

    125.         valeur = arr[ 1 ]     

    126.       } else {     

    127.         élément = valeur = str     

    128.       }    

    129.       return { item: item, value: value }     

    130.     }     

    131.     // Texte & file     

    132.     if ( /^(texte|mot de passe|email|numéro|recherche|url|tel|fichier|caché)$/.test(type) )     

    133.       balisage = '+     

    134.         'type= "'+ type +'" '+     

    135.         'id="'+ nom +'" '+     

    136.         'nom="'+ nom +'" '+     

    137.         ' valeur="'+ value +'" '+     

    138.         (placeholder && 'placeholder="'+ espace réservé +'"') +     

    139.         '/>'     

    140.     // Textarea     

    141.     if ( /textarea/.test( type ) ) {     

    142.       markup = '+ nom +'" nom="'+ nom +'" valeur="'+ valeur +'" >textarea>'     

    143.     }     

    144.     // Sélectionner     

    145.     si ( /select/.test( type ) ) {     

    146. articles = []     

    147.       pour ( i = 0len = liste.length; je < len; i++ ) {     

    148.         item = splitValue( list[  i ] ).item     

    149. value = splitValue( list[ i ] ).value     

    150.         items.push('<option value="'+ value +'" >'+ élément +'option>')     

    151.       }     

    152.       balisage =     

    153.         '+ name +'" nom="'+ nom +'">'+     

    154.            items.join( '') +     

    155.         'sélectionner>'     

    156.     }     

    157.     // Radiocheck     

    158.     si ( /(radio|checkbox)/.test( type ) ) {     

    159.       articles = []     

    160.       pour ( i = 0, len = list.length; i < len;  i++ ) {     

    161. item = splitValue( list[ i ] ).item     

    162.         value = splitValue ( list[ i ] ).value     

    163.         items.push(     

    164.           '<label>'+     

    165.            '<entrée type="'+ type +'" nom="'+ nom +'" valeur="'+ valeur +'"  />'+     

    166.             article +     

    167.           ' étiquette>'     

    168.         )     

    169.       }     

    170.       markup = items.join('')     

    171.     }     

    172. return markup     

    173.   }     

    174. }     

    175. /**    

    176.  * Onglets personnalisés pour Ideal Forms    

    177.  */     

    178. $.fn.idealTabs = fonction (conteneur) {     

    179.   var     

    180.   // Éléments      

    181.   $contents = ce,     

    182.   $conteneurconteneur  = conteneur,     

    183.   $wrapper = $('<ul class="idéal-onglets-wrap"/>'),     

    184.   $onglets = ( function () {     

    185.     var tabs = []     

    186.     $contents.each(function () {     

    187.       var nom = $(this).attr('name')     

    188.       var html =     

    189.         ''+     

    190.           '<span>' + nom + 'span>'+     

    191.           '<i class="idéal-onglets-onglet-counter ideal-tabs-tab-counter-zero">0i> '+     

    192.         'li>'     

    193.       tabs.push(html)     

    194.     })     

    195.     return $(tabs.join(''))     

    196.   }()),     

    197.   Actionss = {     

    198.     getCurIdx: function () {     

    199.       return $tabs     

    200.          .filter('.ideal-tabs-tab-active ')     

    201.         .index()     

    202.     },     

    203.     getTabIdxByName : fonction (nom) {     

    204.       var re = nouveau RegExp(name, 'i')     

    205.       var $tab = $tabs.filter(function () {     

    206.         return re.test ($(this).text())

    207.       })     

    208.       return $tab.index()     

    209.     }     

    210.   },     

    211.   /**    

    212.    * Méthodes publiques    

    213.    */     

    214.   Méthodes = {     

    215.     /**    

    216.      * Onglet Switch    

    217.      */     

    218.     switchTab : function (nameOrIdx) {     

    219.       var idx = Utils.isString(nameOrIdx)     

    220.         ? ACTIONS.GETTABIDXBYNAME (NOMORIDX)

    221. : NameORIDX

    222. $ tabs.removeclass ('idéal-tabs-tab-active')

    223.       $tabs.eq(idx).addClass('ideal-tabs-tab-active')     

    224.       $contents.hide().eq( idx).show()     

    225.     },     

    226.     suivantOnglet : function () {     

    227.       var idx = Actions.getCurIdx() + 1     

    228.       idx > $tabs.length - 1     

    229.         ? Methods.firstTab()     

    230.         : Methods.switchTab(idx)     

    231.     },     

    232. prevOnglet : function () {     

    233.       Methods.switchTab(Actions.getCurIdx() - 1)     

    234.     } ,     

    235.     firstTab: function () {     

    236.       Methods.switchTab(0)     

    237.     } ,     

    238.     lastTab: function () {     

    239.       Methods.switchTab($tabs.length - 1)     

    240.     },     

    241.     updateCounter : function (nameOrIdx, text) {     

    242.       var idx = !isNaN (nomOuIdx) ? nameOrIdx : Actions.getTabIdxByName(name),     

    243.           $counter = $tabs.eq(idx).find('.ideal-tabs-tab-counter' )     

    244.       $counter.removeClass('ideal-tabs-tab-counter-zero')     

    245.       if (!text) {     

    246.         $counter.addClass('ideal-tabs-tab-counter-zero')     

    247.       }      

    248.       $counter.html(text)     

    249.     }     

    250.   }    

    251.   // Joindre méthodes     

    252.   pour (var m dans Méthodes)     

    253.     $contents[m] = Méthodes[m]     

    254.   // Init      

    255.   $tabs.first()     

    256.     .addClass('ideal-tabs-tab-active')

    257.     .end()     

    258.     .click(function () {     

    259.       var nom = $(this).text()     

    260.       $contents.switchTab(name)     

    261.     })     

    262.   // Insérer dans DOM et événements      

    263.   $wrapper.append($tabs).appendTo($container)     

    264.   $contents.addClass('ideal-tabs-content')

    265.   $contents.each(function () {     

    266.     var $this = $(this), name = $(this).attr('name')     

    267.     $this.data('ideal-tabs-content-name', name)     

    268.       .removeAttr('name')     

    269.   })     

    270.   $contents.hide().first( .show() // Start fresh     

    271.   return $contents     

    272. }     

    273. / **    

    274.  * Un menu <sélectionnez> menu plugin jQuery    

    275.  * @example `$('select').idealSelect()`    

    276.  */     

    277. $.fn.idealSelect = fonction () {     

    278.   return this.each(function () {     

    279.     var     

    280.     $select = $(this) ,     

    281.     $options&nbnbsp;= $select.find('option')     

    282.     /**    

    283.      * Générer un balisage et retourner des éléments de la sélection personnalisée    

    284.      * @memberOf $.fn.toCustomSelect    

    285.      * @returns {object} Tous les éléments du nouveau remplacement sélectionné   

    286.      */     

    287.     var idealSelect = (function () {     

    288.       var     

    289.       $wrap = $('<ul class="ideal-select '+ $select .attr('name') +'"/>'),     

    290.       $menu = $(     

    291.         '<li><span class="idéal-select-title">' +     

    292.           $options.filter(':selected ').text() +     

    293.         'span>li>'     

    294.       ),     

    295.       articles = (function () {     

    296.         var items = []     

    297.         $options.each(function ( ) {     

    298.           var $this = $(this)     

    299.           items.push('<li class="ideal-select-item">' + $this.text() + 'li>')     

    300.         })     

    301.         retourner les articles     

    302.       }())     

    303.       $menu.append('<ul  class="ideal-select-sub">' + items.join('') + 'ul >')     

    304.       $wrap.append($menu)     

    305.       retour {     

    306.         sélectionner : $wrap,     

    307.         titre : $menu.find('.ideal-select-title'),     

    308.         sub : $menu.find('.ideal-select-sub'),     

    309.         éléments : $menu.find('.ideal-select-item')

    310.       }     

    311.     }())     

    312.     /**    

    313.      * @namespace Méthodes de sélection personnalisée    

    314.      * @memberOf $.fn.toCustomSelect    

    315.      */     

    316.     var Actions = {     

    317.       getSelectedIdx: function () {     

    318.         retour idealSelect.items      

    319.           .filter('.ideal-select-item-selected').index()     

    320.       },     

    321.       /**    

    322.        * @private    

    323.        */     

    324.       init : (function () {     

    325. $select.css({     

    326.           position : 'absolue',     

    327.            gauche : '-9999px'     

    328.         })     

    329.         idealSelect.sub.hide()     

    330.         idealSelect.select.insertAfter($ select)     

    331.         idealSelect.select.css(     

    332.           'min-width',      

    333.           .eq($options.filter(':selected').index())     

    334.           .addClass('ideal-select-item-selected ')     

    335.       }()),     

    336.       noWindowScroll : function (e) {     

    337. if (e.which === 40 || e.which === 38 || e.which === 13) {     

    338.           e.preventDefault()     

    339.         }     

    340.       },      

    341.       // Correction de la perte de mise au point lors du défilement     

    342.       // et de la sélection d'un élément avec le clavier     

    343.       focusHack : fonction () {     

    344.         set

      Timeout(function () {     

    345.           $select.trigger('focus')     

    346.         }, 1)     

    347.       },     

    348.       focus : fonction () {     

    349.         idealSelect.select.addClass('ideal-select-focus')     

    350.         $(document).on('keydown.noscroll', Actions.noWindowScroll)      

    351.       },     

    352.       flou : fonction () {     

    353.          idealSelect.select     

    354.           .removeClass('ideal-select-open ideal-select-focus')     

    355.         $(document).off('.noscroll')     

    356.       },     

    357.       scrollIntoView : fonction (

      dir) {     

    358.         var     

    359.         $

      selected = idealSelect.items.filter('.ideal-select-item-selected'),     

    360. itemHeight = idéalSelect .items.outerHeight (),

    361. menuHeight = idealSelect.sub.outerHeight(),     

    362.         

      isInView = (function () {     

    363.            /// position relative au sous-menu     

    364.           var 

      elPos = $selected.position().top + itemHeight     

    365.           return 

      dir === 'down'     

    366.              ? elPos 

      <= menuHauteur     

    367.             : elPos > 0     

    368.          }())     

    369.         si ( !isInView) {     

    370.           itemHeight = (dir === 'down')     

    371.             ? itemHeight // descendre      

    372.             : -itemHeight // go up      

    373.           idealSelect.sub     

    374.             .scrollTop(idealSelect.sub.scrollTop() + itemHeight)     

    375.         }     

    376.       },     

    377.       scrollToItem: function () {     

    378.         var 

      idx = Actions.getSelectedIdx(),     

    379.             

      hauteur = idealSelect.items.outerHeight(),     

    380.             

      nItems = idéalSélectionner .items.length,     

    381.             

      allHeight = hauteur * nItems,     

    382. curHeight = hauteur * (nItems-- idx)     

    383.         idealSelect.sub.scrollTop(allHeight - curHeight)     

    384.       },     

    385.       showMenu : function () {     

    386.         idealSelect.sub.fadeIn('fast')     

    387.         idealSelect.select.addClass('ideal-select-open')     

    388.         Actions.select(Actions.getSelectedIdx())     

    389.         Actions.scrollToItem()     

    390.       },     

    391.       hideMenu : function () {     

    392.         idealSelect.sub.hide()     

    393.         idealSelect.select.removeClass('ideal-select-open')     

    394.       },     

    395.       sélectionner : fonction (idx) {     

    396.         idealSelect.items     

    397.           . removeClass('ideal-select-item-selected')     

    398.         idealSelect.items     

    399.            .eq(idx).addClass('ideal- select-item-selected')     

    400.       },     

    401.       changer : fonction (idx) {     

    402.         var text = idealSelect.items.eq(idx).text()     

    403.         Actions. select(idx)     

    404.         idealSelect.title.text(text)     

    405.         $options.eq(idx).prop('selected', true)     

    406.         $select.trigger('change')     

    407.       },     

    408.       keydown : function (touche) {     

    409.         var     

    410.         idx = Actions.getSelectedIdx() ,     

    411.        isMenu = idealSelect.select.is('.ideal-select-menu'),     

    412.         isOpen = idealSelect.select.is('.ideal-select-open')     

    413.           /**    

    414.          * @namespace Touche appuyée    

    415.           * /

    416. var touches = {

    417. 9: function () {// tab

    418.             if (isMenu) {     

    419.               Actions.blur()      

    420.                Actions.hideMenu()     

    421.             }     

    422.           },     

    423.           13 : fonction () { // ENTER     

    424.             if (isMenu)     

    425.               isOpen     

    426.                   ? Actions.hideMenu()     

    427.                 : Actions.showMenu()     

    428.             Actions.change(idx)     

    429.           },     

    430.           27 : fonction () { //ESC     

    431.            if (isMenu) Actions.hideMenu()     

    432.           },     

    433.           40 : fonction () { // DOWN     

    434.             if (idx  < $options.length - 1) {     

    435.               isOpen     

    436.                  ? Actions.select(idx + 1)     

    437.                 : Actions.change(idx + 1)     

    438.             }     

    439.             Actions.scrollIntoView('vers le bas' )     

    440.           },     

    441.           38 : fonction () { // UP     

    442.             si ( idx > 0) {     

    443.               isOpen     

    444.                  ? Actions.select(idx - 1)     

    445.                 : Actions.change(idx - 1)     

    446.             }     

    447.             Actions.scrollIntoView('up')     

    448.              

    449.           'default' : fonction () { // Lettre     

    450.             var     

    451.             lettre = String.fromCharCode(key),     

    452.             $matches = idealSelect.items     

    453.               .filter(function () {     

    454.                   new RegExp('^' + letter, 'i').test( $(this).text() ) // trouver la première match      

    455.               }),

    456. nmatches
    457. = $ matches.length,
    458. compteur
    459. =
    460. IdealSelect

      .select.data('counter') + 1 || 0,                 

      curKey
    461.  = 
    462. idealSelect

      .select.data('key') || clé,                 

      newIdx
    463.  = $matches.eq(counter).index()     
    464.             if (!nMatches) // Aucune correspondance     

    465.               retourner false     

    466.             // Si plus de correspondances avec la même lettre    

    467. if (

      curKey
    468.  === key) {     
    469. < euh' , compteur)     
    470.               }     

                   autre {     
    471.                 idealSelect.select.data('counter ', 0)     
    472.                 
    473. newIdx
    474.  = $matches.eq(0).index()     

    475.               }    

    476.             }     

                  // Si nouvelle lettre     
    477.             sinon {     
    478.              &nnbsp;idealSelect.select.data('counter', 0)     
    479.              
    480. newIdx
    481.  = $matches.eq(0).index()     

    482.             }     

    483.             if (estOuvert)     

                    Actions.select( newIdx)     
    484.             else     
    485.               Actions.change(newIdx)     
    486.             idealSelect. select.data('clé', clé )     
    487.             Actions.scrollToItem()     
    488.            Actions.focusHack()     
    489.           }     
    490.         }     
    491.         touches[clé]     
    492.            ? touches[clé]()     
    493.            : clés['default']()     
    494.       }     
    495.     }     
    496.     /**    
    497.      * @namespace Contient tous les événements de sélection personnalisée pour le "mode menu" et le "mode liste"    
    498.      * @memberOf $.fn. toCustomSelect    
    499.      */     
    500.     var 
    501. événements
    502.  = {     

    503.       focus : Actions.focus,     

    504.       'blur.menu' : function () {     

              Actions.blur ()     
    505.         Actions.hideMenu()     
    506.       },     
    507.       'blur.list' : fonction () {     
    508.         Actions.blur()     

    509.       },     

    510.       keydown : function (e) {     

    511.         Actions.keydown(e.which)     

    512.       },     

    513.       'clickItem.menu' : function () {     

    514.         Actions.change($(this).index())     

    515.         Actions.hideMenu()     

    516.       },     

    517.      'clickItem.list': function () {     

    518.         Actions.change($(this ).index())     

    519.       },     

    520.       'clickTitle.menu' : function () {     

    521.         Actions.focus()     

    522.         Actions.showMenu()     

    523.         $select.trigger('focus')     

    524.       },     

    525.       'hideOutside.menu' : function () {     

    526.         $select.off( 'blur.menu')     

    527.         $(document).on('mousedown.ideal', function (evt) {     

    528.           if ( !$(evt.target).closest(idealSelect.select).length) {     

    529.             $(document).off('mousedown.ideal')     

    530.             $select.on('blur.menu', events['blur.menu'])     

    531.           } else {     

    532.             Actions.focusHack()     

    533.           }     

    534.         })     

    535.       },     

    536.       'mousedown.list' : function () {     

    537.         Actions.focusHack()     

    538.       }

    539.     }     

    540.     // Réinitialiser les événements      

    541.     var disableEvents = fonction () {     

    542.       idealSelect.select.removeClass('ideal-select-menu ideal-select-list')      

    543.       $select.off('.menu .list')     

    544.       idealSelect.items.off('.menu .list')      

    545.       idealSelect.select.off('.menu .list')     

    546.       idealSelect.title.off('.menu .list')     

    547.     }     

    548.     // Mode Menu     

    549.     idealSelect.select.on('menu', function () {     

    550.       disableEvents()     

    551.       idealSelect.select.addClass('ideal-select-menu')     

    552.       Actions.hideMenu()     

    553.       $select.on({     

    554.         'blur.menu' : events['blur.menu'],     

    555.         'focus. menu' : events.focus,     

    556.        ''keydown.menu': events.keydown     

    557.       })     

    558.       idealSelect.select.on('mousedown.menu', events['hideOutside.menu'])     

    559.       idealSelect.items.on('click.menu', events ['clickItem.menu'])     

    560.       idealSelect.title.on('click.menu', events['clickTitle.menu'])     

    561.     })     

    562.     // Mode liste     

    563.     idealSelect.select.on('list', function () {     

    564.       disableEvents()     

    565.       idealSelect.select.addClass('ideal-select-list')     

    566. Actions.showMenu()     

    567.       $select.on({     

    568.         'blur.list': events['blur.list'],

    569.         'focus.list' : events.focus,     

    570.         'keydown.list' : events.keydown     

    571.       })     

    572.       idealSelect.select.on('mousedown.list', events['mousedown.list'])     

    573.       idealSelect.items.on('mousedown.list', events['clickItem.list'])     

    574.     })      

    575.     $ select.keydown(function (e) {     

    576.       // Empêcher l'événement keydown par défaut     

    577.       // pour éviter les bugs avec les événements Ideal Select      

    578.       if (e.which !== 9) e.preventDefault()     

    579.     })     

    580.     // Réinitialiser     

    581.     idealSelect.select.on('reset', function(){     

    582.       Actions.change(0)     

    583.     })     

    584.     idealSelect.select.trigger('menu') // Par défaut sur "mode menu"     

    585.   })     

    586. }     

    587. /*    

    588.  * idealRadioCheck : jQuery plguin pour la case à cocher et le remplacement de la radio    

    589.  * Utilisation : $('input[type=checkbox], input[type=radio]').idealRadioCheck()    

    590.  */     

    591. $.fn.idealRadioCheck  = fonction() {     

    592.   return this.each(function() {     

    593.     var $ce = $(ce)     

    594.     var $span = $('<span/>')     

    595.     $span.addClass( 'ideal-'+ ( $this.is(':checkbox') ? 'check' : 'radio' ) )     

    596.     $this.is(':checked') && $span.addClass('checked') // init     

    597.     $span.insertAfter( $this )     

    598.     $this.parent('label').addClass('ideal-radiocheck-label')     

    599.       .attr('onclick', '') // Correction du clic sur l'étiquette dans iOS     

    600.     $this.css({ position : 'absolute', gauche : '-9999px' }) // masquer en déplacement gauche     

    601.     // Événements     

    602.     $this.on({     

    603.       change : function( ) {     

    604.         var $this = $(this)     

    605.         if ( $this.is('input[ type="radio"]') ) {     

    606.           $this.parent().siblings('label').find( '.ideal-radio').removeClass('checked')     

    607.         }     

    608.         $span.toggleClass( 'checked', $this .is(':checked') )     

    609.       },     

    610.       focus: function() { $span.addClass('focus') },     

    611.       flou : function() { $span.removeClass('focus') },     

    612.       clic : fonction() { $ (this).trigger('focus') }     

    613.     })     

    614.   })     

    615. }     

    616. ;(function( $ ) {     

    617.   // Le navigateur prend en charge plusieurs fichiers HTML5 ?     

    618.   var multipleSupport = typeof $('<input/ >')[0].multiple !== 'undefined',     

    619.       isIE = /msie/i.test( navigator.userAgent )

    620.   $.fn.idealFile = function() {     

    621.     retourner this.each (function() {     

    622.       var $file = $(this).addClass('ideal-file'), // l'entrée du fichier d'origine     

      < >
    623. div
    624.  

      class

      =
    625. "ideal-file-wrap"
    626. >'),     

    627.           $input = $('<input type="texte"  class="idéal-file-filename" />'),     

    628.           // Bouton qui sera utilisé dans les navigateurs non-IE      

    629.           $bouton = $('<bouton type="bouton" class="téléchargement de fichiers idéal">Ouvrir< ;/bouton>'),     

    630.           // Hack pour IE     

    631.          $label = $('<label class="téléchargement de fichiers idéal" for="'+ $file[0].id +'">Ouvrirétiquette>')     

    632.       // Masquer en déplacement vers la gauche pour que nous     

    633.        // pouvons toujours déclencher des événements     

    634.       $file.css({     

    635.         position : 'absolue',     

    636. gauche : '-9999px'     

    637.       })     

    638.       $wrap.append( $input, ( isIE ? $label : $button ) ) .insertAfter( $file )     

    639.       // Empêcher le focus     

    640.       $file.attr('tabIndex', -1)     

    641.       $button.attr('tabIndex', -1)     

    642.       $button.click(function () {     

    643.         $file.focus().click() // Ouvrir la boîte de dialogue      

    644.       })     

    645.       $file.change(function( ) {     

    646.         var files = [], fileArr, filename     

    647.          // Si plusieurs sont supportés alors extraire     

    648.         // tous les noms de fichiers du tableau de fichiers     

    649.         si ( multipleSupport ) {     

    650.           fileArr = $file[0].files     

    651.           pour ( var i = 0, len = fileArr.length; je < len; i++ ) {     

    652.             files.push( fileArr[i].name )     

    653.           }     

    654.            nom de fichier = files.join(', ')     

    655.         // Si non supporté alors prenez juste la valeur     

    656.         // et supprimez le chemin pour afficher juste le nom du fichier      

    657.         } else {     

    658.           

      nom du fichier = $fichier. val().split('\').pop()     

    659.         }     

    660.         $input.val( filename ) // Définir le valeur     

    661.           .attr( 'title', filename ) // Afficher le nom du fichier dans le titre tootlip     

    662.       })      

    663.       $input.on({     

    664.         focus : function () { $file.trigger('change') },     

    665.         flou : function () { $file.trigger('blur') },     

    666.         keydown : function( e ) {     

    667. if ( 

      e.which === 13 ) { // Entrer     

    668.             if ( !isIE ) { $file.trigger('click') }     

    669.           } sinon if ( 

      e.which === 8 || e.which === 46 ) { // Retour arrière & Suppr     

    670.             // Sur certains navigateurs, la valeur est en lecture seule     

    671.             $file.replaceWith( $
    672. file

       = $file.val('').clone( true ) )     

    673.             $file.trigger('change' )     

    674.             $input.val('')     
    675.            } else if ( 
    676. e.which

       === 9 ){ // TAB     

    677.             retour     

    678.           } else { // Toutes les autres touches     
    679. return false     
    680.            }     
    681.         }     
    682.       })     
    683. }) 

    684. }(jQuery)) 

    685. /**    

    686.  * @namespace Erreurs    

    687.  * @locale fr    

    688.  */ 

    689. $.idealforms.errors = { 

    690. requis : 'Ceci est obligatoire.',  

    691. numéro : 'Doit être un numéro.',  

    692. chiffres : 'Doit être un numéro unique.' , 

    693. nom : 'Doit comporter au moins 3 caractères et ne peut contenir que des lettres.', 

    694. nom d'utilisateur : 'La longueur minimale de le nom d'utilisateur est de 5 caractères et la longueur maximale est de 30 caractères. Veuillez utiliser des lettres anglaises, des chiffres, des caractères chinois et des traits de soulignement. Le premier caractère du nom d'utilisateur doit être composé de lettres, de chiffres, de caractères chinois et ne peut pas être uniquement composé de chiffres. Le caractère chinois comporte 21 caractères.', 

    695. pass : 'Le mot de passe doit comporter entre 6 et 15 chiffres et contenir au moins un chiffre, une lettre majuscule et une lettre minuscule.', 

    696. strongpass : 'Doit comporter au moins 8 caractères et contenir au moins une lettre majuscule et une lettre minuscule et un chiffre ou un caractère spécial.',  

    697. email : 'Doit Est une adresse e-mail valide <em>(Exemple : user@gmail.com)< /em>', 

    698. téléphone : 'Doit être un numéro de téléphone portable valide <em >(Exemple : 18723101212)em>', >

      zip : 'Doit être un code postal américain valide ;/
    699. em

      >', url : ' Il doit s'agir d'une URL valide <em>(par exemple, www.google.com)

    700. em.

      >', minChar : 'Doit être au moins /fort> caractères longs.',

    701. minOption : 'Cochez au moins

      < strong>{0} strong> options.', 

    702. maxChar : 'Pas plus de

      < ;strong>{0}strong> caractères longs.' ,  

    703. maxOption : 'Pas plus de  

      <fort>{0}< /fort> options autorisées.', 

    704. plage : 'Doit être un nombre compris entre {0} et {1}.', date : 'Doit être une date valide 🎜><em> (par exemple {0})

      em
    705. >

      ', 

    706.   dob : 'Doit être une date de naissance valide.',     

    707.   exclure : '"{0}" n'est pas disponible.',     

    708.   excludeOption : '{0}',     

    709.   equalto : 'Doit avoir la même valeur que < fort>"{0}"fort>',     

    710.   extension : 'Le(s) fichier(s) doivent avoir une extension valide. <em>(par exemple "{0}")em >',     

    711.   ajaxSuccess : '<fort>{0}strong> n'est pas disponible.',     

    712.   ajaxError : 'Erreur du serveur...'     

    713. }     

    714. /**    

    715.  * Obtenir tous les filtres par défaut     

    716.  * @returns object    

    717.  */     

    718. var getFilters = fonction() {     

    719.   var filtres = {     

    720.     obligatoire : {

    721.       regex : /.+/,     

    722.       erreur : $.idealforms.errors.required     

    723.     },     

    724.     numéro : {     

    725.       regex : function( i, v ) { return !isNaN(v) },     

    726.       erreur : $.idealforms.errors.number     

    727.     },     

    728.     chiffres : {     

    729.       regex : /^d+$/,     

    730.       erreur : $.idealforms.errors.digits     

    731.     },     

    732.     nom : {     

    733.       regex : /^[A-Za-z]{3,}$/,     

    734.       erreur : $.idealforms.errors.name     

    735.     },     

    736.     nom d'utilisateur : {     

    737.       regex : /^[a-z](?=[w.]{4,30}$)w*.?w*$/i,     

    738.       erreur : $.idealforms.errors.username     

    739.     },     

    740.     pass : {     

    741.       regex : /(?=.*d)(?=.*[a-z])(?=.*[A-Z]).{6,}/,     

    742. erreur : $.idealforms.errors.pass     

    743.     },     

    744.     strongpass : {     

    745. expression régulière : /(?=^.{8,}$)((?=.*d)|(?=.*W+))(?![.n])(?=.*[A-Z])(? =.*[a-z]).*$/,     

    746.       erreur : $.idealforms.errors.strongpass     

    747.     },     

    748.     e-mail : {     

    749.       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})?$/,     

    750.       erreur : $.idealforms.errors.email     

    751.     },     

    752.     téléphone : {     

    753.       //regex : /^((13[0-9])|(15[0-9])|(17[0-9 ])|(18[0-9]))\d{8}$/,     

    754.       regex : /^(0|86|17951)?(13[0-9 ]|15[012356789]|17[678]|18[0-9]|14[57])[0-9]{8}$/,     

    755.       erreur : $ .idealforms.errors.phone     

    756.     },     

    757.     zip : {     

    758.       regex : / ^d{5}$|^d{5}-d{4}$/,     

    759.       erreur : $.idealforms.errors.zip     

    760.     },     

    761.     url : {     

    762.       regex : /^(?:(ftp|http|https)://) ?(?:[w-]+.)+[a-z]{2,6}([:/?#].*)?$/i,     

    763.       erreur : $ .idealforms.errors.url     

    764.     },     

    765.     min : {     

    766.       regex : fonction ( entrée, valeur ) {     

    767.         var $inputinput = input.input,     

    768.             min = input.userOptions.data.min,     

    769.             isRadioCheck = $input.is('[ tapez="checkbox"], [tapez="radio"]')     

    770.         if ( isRadioCheck ) {     

    771.           this.error = $.idealforms.errors.minOption.replace( '{0}', min )     

    772.           return $input.filter(':checked').length >= min     

    773.         }     

    774.         this.error = $.idealforms.errors.minChar.replace( '{0}', min )     

    775.         valeur de retour. longueur >= min     

    776.       }     

    777.     },     

    778. max : {     

    779.       regex: function( input, value ) {     

    780.         var $inputinput = input.input,     

    781.             max = input.userOptions.data.max,     

    782.             isRadioCheck = $input.is('[type="checkbox"], [type=" radio"]')     

    783.         if ( isRadioCheck ) {     

    784.           this.error = $.idealforms.errors.maxOption.replace( '{0} ', max )     

    785.           return $input.filter(':checked').length <= max     

    786.         }     

    787.         this.error = $.idealforms.errors.maxChar.replace( '{0}', max )     

    788.         valeur de retour.longueur <= max     

    789.       }     

    790.     },     

    791.     plage : {     

    792.       regex : fonction ( entrée, valeur ) {     

    793.        var plage = input.userOptions.data.range,     

    794.             val = +value     

    795. this.error = $.idealforms.errors.range     

    796.           .replace( '{0}', range[0] )     

    797.           .replace( '{1}', range[1] )     

    798.         return val >= range[0] && val <= range[1]     

    799.       }     

    800.     },     

    801. date : {     

    802.       regex: function( entrée, valeur ) {     

    803.         var     

    804.         userFormat =     

    805.           input.userOptions.data && input.userOptions.data.date     

    806. ? input.userOptions.data.date     

    807.             : 'mm/jj/aaaa', // format par défaut      

    808.         délimiteur = /[^mdy]/.exec( userFormat )[0],     

    809.         theFormat = userFormat.split(délimiteur),

    810.         theDate = value.split(delimiter),     

    811.         isDate = fonction( date, format ) {     

    812.           var m, d, y     

    813.            pour ( var i = 0len = format.length; i < len; i++ ) {     

    814.             if ( /m/.test( format[i]) ) m = date[i]     

    815.             si ( /d/.test( format[i]) ) d = date[i]     

    816.             si ( / y/.test( format[i]) ) y = date[i]     

    817.           }     

    818.           retour (     

    819.             m 

      > 0 && m < 13 &&     

    820.             y && 

      y.length === 4 &&     

    821.             d 

      > 0 && d <= ( new Date( y, m, 0 ) ).getDate()     

    822.           )     

    823.         }     

    824.         

      this.error = $.idealforms.errors.date.replace( '{0}', userFormat )     

    825. return isdate (thedate, theformat)

    826. }

    827. },

    828. dob: {

    829. regex: fonction (entrée, valeur) {

    830. var

    831.         

      userFormat =     

    832.          

      input.userOptions.data && input.userOptions.data.dob     

    833.             ? input.userOptions.data.dob     

    834.              : 'mm/jj/aaaa', // format par défaut     

    835.         // Simuler une entrée de date

    836.         

      dateInput = {     

    837.           input : input.input,     

    838.           Optionsutilisateur : {     

    839.             données : { date : userFormat }     

    840.            }     

    841.         },

    842.         // Utiliser un filtre de date interne pour val

      dater la date     

    843.         

      isDate = filters.date.regex( dateInput, value ),     

    844.         // DOB     

    845.         theYear = /d{4}/.exec( value ),     

    846.         maxYear = new Date().getFullYear(), // Current année     

    847.         minYear = maxYear - 100     

    848.         this.error = $.idealforms.errors.dob     

    849.         return isDate && theYear >= minYear && theYear <= maxYear      

    850.       }     

    851.     },     

    852.     exclure : {     

    853.       regex : function( input, value ) {     

    854.         var $

      inputinput = input.input,     

    855.             

      exclude = input.userOptions.data.exclude,

    856.             

      isOption = $input.is('[type="checkbox"], [ tapez="radio"], select')     

    857.         

      this.error = isOption     

    858.           ? $.idealforms.errors.excludeOption.replace( '{0}', value )     

    859.           : 

      this.error = $.idealforms.errors.exclude.replace ( '{0}', value )     

    860.         return $.inArray( value, exclure ) === -1     

    861.            

    862.     },     

    863.     égal à : {     

    864.       regex : function( entrée, valeur ) {     

    865.         var $

      equals = $( input.userOptions.data.equalto ),     

    866.             $

      inputinput = input.input,     

    867.            

      name = $equals.attr('name') || $equals.attr('id'),     

    868.             

      isValid = $equals.parents('.ideal-field')      

    869.               .filter(function(){ return $(this).data('ideal-isvalid') === true })     

    870.                .length     
    871.         if ( !isValid ) { return false }     
    872.         this.error = $.idealforms.errors.equalto.replace( '{0}', name )     

    873.         retour $input.val() === $equals.val()     

    874.       }     

    875.     },     

    876.     extension : {     

    877.       regex : fonction ( entrée, valeur ) {     

    878.         nbsp;var fichiersinput.input[0].files || [{ name: value }],     

    879.             extensions = input.userOptions.data.extension,     

    880.             re = new RegExp( '\.'+ extensions.join('|') +'$', 'i' ),     

    881.             valide = faux     

    882.         pour ( var i = 0len = files.length; i < len; i++ ) {     

    883.          valid = re.test( files[i].name );     

    884.         }     

    885.         this.error = $.idealforms.errors.extension.replace( '{0}' , extensions.join('", "') )     

    886.         retour valide     

    887.        }     

    888.     },     

    889.     ajax : {     

    890.       regex : function( input, value, showOrHideError ) {     

    891.         var self = cette     

    892.         var $inputinput = input. input     

    893.         var userOptions = input.userOptions     

    894.         var name = $input.attr('name')     

    895.        var $field = $input.parents('.ideal-field')     

    896. var valide = false

    897. var CustomErrors = userOptions .errors && userOptions.errors.ajax     

    898.         self.error = {}     

    899.         self. error.success = customErrors && customErrors.success     

    900.            ? customErrors.success     

    901.           : $.idealforms.errors.ajaxSuccess.replace( '{0}', value )     

    902.         self .error.fail = customErrors && customErrors.error     

    903.            ? customErrors.error     

    904.           : $.idealforms.errors.ajaxError     

    905.          // Envoyer le nom d'entrée en $_POST[name]    

    906.         var data = {}     

    907.         data[ name ] = $.trim( value )     

    908.         // Options Ajax définies par l'utilisateur     

    909.         var userAjaxOps = input.userOptions.data .ajax

    910. var ajaxops = {

    911. Type: 'Post',

    912.           dataType : 'json',     

    913.           data : data,     

    914.           succès : function( resp, text, xhr ) {     

    915.           console.log(resp)     

    916.             showOrHideError( self.error.success, true )     

    917.             $input.data({     

    918.              'ideal-ajax-resp': resp,     

    919.               'ideal-ajax-er ror' : soi .error.success     

    920.             })     

    921.            $input.trigger('change') // pour mettre à jour le compteur     

    922.             $field.removeClass('ajax')     

    923.             // Exécuter un rappel de réussite personnalisé     

    924.             if( userAjaxOps._success ) {     

    925.               userAjaxOps._success( resp, text, xhr )     

    926.             }     

    927.           } ,     

    928.           erreur : function( xhr, text, error ) {     

    929.             si ( text !== 'abandonner' ) {     

    930.               showOrHideError( self.error.fail, false )      

    931.               $input.data( 'ideal-ajax-error', self.error.fail )     

    932.               $field.removeClass('ajax')     

    933.               // Exécuter un rappel d'erreur personnalisé     

    934.              if ( userAjaxOps._error ) {     

      <🜜 >
    935.                 userAjaxOps. _error( xhr, text, error )     

    936.               }     

    937.             }     

    938.           }     

    939.         }     

    940.         $.extend( ajaxOps, userAjaxOps )     

    941.         // Init    

    942.         $input.removeData('ideal-ajax-error')     

    943.         $input.removeData('ideal-ajax-resp')     

    944.         $field.addClass('ajax')     

    945.         // Exécutez la requête et enregistrez-la pour pouvoir l'abandonner      

    946.         // pour que les requêtes ne font pas de bulles      

    947.         $.idealforms.ajaxRequests[ name ] = $.ajax( ajaxOps )     

    948. }     

    949.     }     

    950.   }    

    951.   filtres de retour      

    952. }     

    953. $

      .idealforms.flags = {     

    954.   aucune erreur : fonction (i) {     

    955.     i.parent().siblings('.ideal-error').hide()     

    956.   },     

    957.   noicons : function (i) {     

    958.     i.siblings('.ideal-icon-valid, .ideal-icon-invalid').hide()     

    959.   },     

    960.   novalidicon : function (i) {     

    961.     i.siblings('.ideal -icon-valid').hide()     

    962.   },     

    963.   noinvalidicon: function (i) {     

    964.     i.siblings('.ideal-icon-invalid').hide()     

    965.   },     

    966.   noclass : function (i) {     

    967.     i.parents('.ideal-field').removeClass('valid invalid')     

    968.   },

    969.   novalidclass: function (i) {     

    970.     i.parents('.ideal-field').removeClass('valid')     

          i.parents('. champ idéal').removeClass('invalid')     
    971.   }     
    972. }     
    973. /*    
    974.  * Plugin Ideal Forms     
    975.  */     
    976. var _defaults = {     

    977.   entrées : {},     

    978.   customFilters : {},     

    979.   customFlags : {},     

    980.   globalFlags : '',     

    981.   onSuccess : function(e) { alert('Thank you...') },     

    982.   onFail : function() { alert('Invalid !') },     

    983.   responsiveAt : 'auto',     

    984.   disableCustom: ''     

    985. }     

    986. // Constructeur     

    987. var IdealForms = fonction( élément, options ) {     

    988.   var self = this     

    989.   self.$form = $( element )     

    990.   self.opts = $.extend( {}, _defaults, options )     

    991.   self.$tabs = self.$form.find('section')     

    992.   // Définir des filtres localisés      

    993.   $. extend( $.idealforms.filters, getFilters() )     

    994.   self._init()     

    995. }     

    996. // Plugin     

    997. $.fn.idealforms = fonction( options ) {     

    998.   return this.each(function() {     

    999.     if ( !$.data( this, 'formes idéales' ) ) {     

    1000.       $.data( this, 'idealforms', new IdealForms( ceci, options ) )     

    1001.     }     

    1002.   })     

    1003. }     

    1004. // Obtenir MOINS de variables     

    1005. var LessVars = {     

    1006.   fieldWidth : Utils.getLessVar( 'ideal-field-width', 'width' )     

    1007. }     

    1008. /*    

    1009.  * Méthodes privées    

    1010.  */     

    1011. $.extend ( IdealForms.prototype, {     

    1012.   _init: function() {     

    1013.     var self = this     

    1014.     var o = self.opts     

    1015.     var formElements = self._getFormElements()     

    1016.     self.$form.css( 'visibility', 'visible' )     

    1017.       .addClass('ideal-form')     

    1018.       .attr( 'novalidate', 'novalidate' ) // désactiver la validation HTML5     

    1019. // Do Markup

    1020. Formements.inputs

    1021. .add (formations.headings)

    1022.       .add( formElements.separators )     

    1023.       .each(function(){ self._doMarkup( $(this) ) })     

    1024.     // Générer des onglets     

    1025.     if ( self.$tabs.length ) {     

    1026.       var $tabContainer = $('<div class="ideal-wrap ideal-tabs ideal-full-width"/>')     

    1027.       self.$form.prepend( $tabContainer )     

    1028.       self.$tabs.idealTabs( $tabContainer )     

    1029.     }

    1030.     // Toujours afficher le sélecteur de date sous l'entrée     

    1031.     if ( jQuery.ui ) {     

    1032.       $.datepicker._checkOffset = fonction( a,b,c ) { return b }     

    1033.     }     

    1034.     // Ajouter des entrées spécifiées par data-ideal     

    1035.     // à la liste des entrées utilisateur     

    1036.     self.$ form.find('[data-ideal]').each(function() {     

    1037.      var 

      userInput = o.inputs[ this.name ]     

    1038.       o.inputs[ this.name ] = userInput ||  { filters : $(this).data('ideal') }     

    1039.     })     

    1040.    // Réactif     

    1041.     if ( o.responsiveAt ) {     

    1042.       $(window).resize(function(){ self._responsive() })     

    1043.       self._responsive()     

    1044. }     

    1045.     // Événements de formulaire      

    1046.     self.$form.on({     

    1047.       keydown : function( e ) {     

    1048.         // Empêcher la soumission en appuyant sur Entrée     

    1049.         // mais exclure les zones de texte     

    1050.         if ( 

      e.which === 13 && e.target.nodeName !== 'TEXTAREA' ) {     

    1051.            e.preventDefault()

    1052.         }     

    1053.       },     

    1054.       soumettre : function( e ) {     

    1055.         if ( !self.isValid() ) {     

    1056.           e.preventDefault()      

    1057.           o.onFa il ()     

    1058.           self.focusFirstInvalid()     

    1059.         } else {     

    1060.           o. surSuccès( e )     

    1061.         }     

    1062.       }     

    1063.     })     

    1064.     self._adjust()     

    1065.     self._attachEvents()     

    1066.     self.fresh() // Start fresh     

    1067.   },     

    1068.   _getFormElements : function() {     

    1069.     return {     

    1070.       entrées : this.$form.find('input, select , textarea, :button'),     

    1071.       labels : this.$form.find('div > label:premier-enfant '),     

    1072.       texte : this.$form.find('input:not([type="checkbox"], [ type="radio"], [type="submit"]), textarea'),     

    1073.       select : this.$form.find('select'),     

    1074.       radiocheck : this.$form.find('input[type="radio"], saisie[type="case à cocher"]'),     

    1075.       boutons : this.$form.find(':button'),     

    1076.       fichier : this.$form.find('input[type="fichier "]'),     

    1077.       titres : this.$form.find('h1, h2, h3, h4, h5, h6'),     

    1078.       séparateurs : this.$form.find('hr'),     

    1079.       masqué : this.$form.find('input:hidden')     

    1080.     }     

    1081.   },     

    1082.   _getUserInputs: function() {     

    1083.     return this.$form.find('[name="'+ Utils.getKeys( this.opts.inputs ).join('"], [nom="') +'"]')     

    1084.   },     

    1085.   _getTab : function( nameOrIdx ) {     

    1086.     var self = this     

    1087.     var isNumber  = !isNaN( nameOrIdx )     

    1088.     if ( isNumber ) {     

    1089.       return self.$tabs.eq( nameOrIdx )     

    1090.     }     

    1091.     return self.$tabs.filter(function() {     

    1092.       var re = new RegExp( nameOrIdx, 'i' )     

    1093.       return re.test( nbsp;$(this).data('ideal- tabs-content-name') )     

    1094.     })     

    1095.   },     

    1096.   _getCurrentTabIdx : function() {     

    1097.     return this.$tabs.index( this.$form.find('.ideal-tabs-content:visible') )     

    1098.   },     

    1099.   _updateTabsCounter: function() {     

    1100.     var self = this     

    1101.     self.$tabs.each(function( i ) {     

    1102.       var invalid = self.getInvalidInTab( i ) .length     

    1103.       self.$tabs.updateCounter( i, invalid )     

    1104.     })     

    1105.   },     

    1106.   _adjust: function() {     

    1107.     var self = this     

    1108.     var o = self.opts     

    1109.     var formElements = self._getFormElements()     

    1110.     var curTab = self._getCurrentTabIdx()     

    1111.     // La saisie semi-automatique provoque quelques problèmes...     

    1112.     formElements.inputs.attr('autocomplete', 'off')     

    1113.     // Afficher les onglets pour calculer les dimensions     

    1114.     if ( self.$tabs.length ) { self.$tabs.show() }     

    1115.     // Ajuster les étiquettes     

    1116.     var labels = formElements.labels     

    1117.     labels. removeAttr('style').width( Utils.getMaxWidth( labels ) )     

    1118.     // Ajuster les titres et les séparateurs     

    1119.     if ( self. $tabs.length ) {     

    1120.       this.$tabs.each(function(){     

    1121.         $( this ).find('. ideal-heading:first').addClass('first-child')     

    1122.       })     

    1123.     } else {     

    1124.       self.$form.find('.ideal-heading:first').addClass('first-child')     

    1125.     }     

    1126.     self._setDatepicker()     

    1127.     // Fin du calcul masquer les onglets     

    1128.     if ( self.$tabs.length ) {     

    1129.       self.$tabs.hide()     

    1130.       self.switchTab( curTab )     

    1131.     }     

    1132.   },     

    1133.   _setDatepicker: function() {     

    1134.     var 

      o = ce.opts     

    1135.     var $

      datepicker = ce.$form.find( 'input.datepicker')     

    1136.     if ( jQuery.ui && $datepicker.length ) {     

    1137.       $datepicker.each(function() {     

    1138.         var userInput = o.inputs[ this.name ]     

    1139.        var data = userInput && userInput.data && userInput.data.date     

    1140.         var format = données ? data.replace( 'aaaa', 'aa' ) : 'mm/dd/yy'     

    1141.         $(this).datepicker({     

    1142.           dateFormat : format,     

    1143.           avantAfficher : function( input ) {     

    1144.             $( input ).addClass ('open')     

    1145.           },     

    1146.          onChangeMonthYear: function() {     

    1147. var
    1148. w
    1149. = $ this.outerwidth () //

      cache Tout d'abord! 🎜>

                    $this.datepicker('widget').css( 'width', w )     
    1150.             },     

                },     
    1151.           onClose : function() { $(this).removeClass('open') }     
    1152.          })
    1153.       })     
    1154.       // Ajuster la largeur     
    1155.       $datepicker.on('focus keyup ', function() {     
    1156.         var 
    1157. t
    1158.  = $(this), 

      w

       = 
    1159. t
    1160. .outerWidth( )     

    1161.         t.datepicker('widget').css( 'width', w )     

    1162.        })      

            $datepicker.parent().siblings('.ideal-error').addClass('hidden')     

          }     
    1163.   },     
    1164.   _doMarkup: function( $element ) {     
    1165.     var 
    1166. o
    1167.  = 

      this

      .opts     
    1168.     var 
    1169. elementType
    1170.  = 

      Utils

      .getIdealType( $element )     
    1171.     // Éléments de validation     

    1172.     var $field = $('<span class="idéal -field"/>')     

    1173.     var $erreur = $('< span class="erreur-idéale" />')     

    1174.     var $valid = $('<i class="icône-idéal icône-idéal-valide" />')     

    1175.     var $invalide = $('<i class="icône-idéale icône-idéale-invalide"/>')     

    1176.       . click(function(){     

    1177.         $(this).parent().find('input:first, textarea, select').focus()     

    1178.       })     

    1179.     // Marquage de base     

    1180.     $element.closest('div').addClass('ideal- wrap')     

    1181.       .children('label:first-child').addClass('ideal-label)     

    1182.     var idealElements = {     

    1183.       _defaultInput: function() {     

    1184.         $element.wrapAll( $field ).after( $valid , $invalid )     

    1185.           .parent().after( $error )     

    1186.       },     

    1187.       text :  function() { idealElements._defaultInput() },     

    1188.       radiocheck : function() {     

    1189.         // Vérifier si l'entrée est déjà enveloppé, donc nous ne le faisons pas     

    1190.         // envelopper les radios et les chèques plus d'une fois     

    1191.        var isWrapped = $element.parents('.ideal-field').length     

    1192.         if ( !isWrapped ) {     

    1193.           $element.parent() .nextAll().andSelf().wrapAll( $field.addClass('ideal-radiocheck') )     

    1194.           $element.parents('.ideal-field').append( $valid, $invalid ).after( $error )     

    1195.         }     

    1196.         if ( !/radiocheck/.test( o.disableCustom ) ) {     

    1197.           $element.idealRadioCheck()     

    1198.         }     

    1199.       },     

    1200.       sélectionnez : function() {     

    1201.         idealElements._defaultInput()     

    1202.         if ( !/select/.test( o.disableCustom ) ) {     

    1203.           $element.idealSelect()     

    1204.         }     

    1205.       },     

    1206.       fichier : function() {     

    1207.         Éléments idéaux ._defaultInput()     

    1208.         if ( !/file/.test( o.disableCustom ) ) {     

    1209.           $element.idealFile()     

    1210.         }     

    1211.       },     

    1212.       bouton : function() {     

    1213.         if ( !/button/.test( o.disableCustom ) ) {     

    1214.           $element.addClass('ideal-button')     

    1215.         }     

    1216.       },     

    1217.       masqué : fonction() {     

    1218.         $element.closest('div').addClass('ideal-hidden')     

    1219.       },     

    1220.       titre : fonction() {     

    1221.         $element.closest('div').addClass('ideal-full-width')     

    1222.         $element.parent( ).children().wrapAll('<span class="titre-idéal"/>')     

    1223.       },     

    1224.       séparateur : function() {     

    1225.         $element .closest('div').addClass('ideal-full-width')     

    1226.         $element.wrapAll('<div classe="séparateur-idéal"/>')     

    1227.        }     

    1228.     }     

    1229.     // Générer un balisage pour le type d'élément actuel     

    1230.     idealElements[ elementType ] ? idéalElements[ elementType ]()  : $.noop()      

    1231.     $error.add( $valid ).add( $invalid ).hide() // Start fresh     

    1232.   },     

    1233.   /** Valide une entrée et affiche ou masque l'erreur et l'icône    

    1234.    * @memberOf Actions    

    1235.    * @param {object} $input jQuery object    

    1236.    * @param {string} e L'événement JavaScript    

    1237.    */     

    1238.   _validate: function( $input, e ) {     

    1239.     var 

      soi = ce     

    1240.     var 

      oce.opts     

    1241.     var userOptions = o.inputs[ $input.attr('name') ]     

    1242.     var userFilters = userOptions.filters && userOptions.filters.split(/s/)     

    1243.     var name = $input.attr(' name')     

    1244.     var value = $input.val()     

    1245.     var ajaxRequest = $.idealforms.ajaxRequests[ name ]     

    1246.     var isRadioCheck = $input.is('[type="case à cocher "], [type="radio"]')     

    1247.     var inputData = {     

    1248.       // Si est la radio ou vérifier valider toutes les entrées liées par le nom     

    1249.       entrée : isRadioCheck  ? self.$form.find('[name="' + name + '"]') : $input,     

    1250.       userOptions : userOptions     

    1251.     }     

    1252.     // Éléments de validation      

    1253.     var $field = $input.parents('.ideal-field')     

    1254.     var $error = $field.siblings('.ideal-error')     

    1255.     var $invalid = isRadioCheck     

    1256.       ? $input.parent().siblings('.ideal-icon-invalid')     

    1257.       : $input.siblings('.ideal-icon-invalid')      

    1258.     var $valid = isRadioCheck     

    1259.       ? $input.parent().siblings('.ideal-icon-valid')     

    1260.       : $input.siblings('.ideal-icon-valid')     

    1261.     function resetError() {     

    1262.       $field.removeClass('valid invalid').removeData('ideal-isvalid')     

    1263.       $error.add( $invalid ).add( $valid ).hide()     

    1264.     }     

    1265.     fonction showOrHideError ( erreur, valide ) {     

    1266.       resetError()     

    1267.       valide ? $valid.show() : $invalid.show()     

    1268.       $field.addClass( valid ? 'valid' : 'invalid' )     

    1269.       $field.data( 'ideal-isvalid', valid )     

    1270.       if ( !valid ) {     

    1271.          $error.html( erreur ).toggle( $field.is('.ideal-field-focus') )     

    1272.       }     

    1273.     }     

    1274.     // Empêcher la validation lors de la saisie, mais sans introduire de nouveaux caractères     

    1275.     // Ceci est principalement pour empêcher plusieurs requêtes AJAX     

    1276.     var oldValue = $input.data('ideal-value') || 0     

    1277.     $input.data( 'ideal-value', value )     

    1278.     if ( e.type = == 'keyup' && value === oldValue ) { return false }     

    1279.     // Valider     

    1280.     si ( userFilters ) {     

    1281.       $.each( userFilters, function( i, filter ) {     

    1282.         var theFilter = $.idealforms.filters[ filter ]     

    1283.         var customError = userOptions.errors && userOptions.errors[ filter ]     

    1284.         var erreur = ''     

    1285.         // Si le champ est vide et pas obligatoire     

    1286.         if ( !value && filter !== 'obligatoire' ) {     

    1287.           resetError()     

    1288.           retour faux

    1289.         }     

    1290.         if ( le filtre ) {     

    1291.           // Abandonner et réinitialiser aja x s'il y a une demande en attente     

    1292.           if ( e.type === 'keyup' && ajaxRequest ) {     

    1293.             ajaxRe quête. abort()     

    1294.             $field.removeClass('ajax')     

    1295.           }     

    1296.           / / AJAX     

    1297.           si ( filtre === 'ajax' ) {     

    1298.  nbsp;           showOrHideError( error, false ) // set invalid jusqu'à ce que la réponse revienne     

    1299.             $error.hide()     

    1300.             si ( e .Type === 'KEYUP') {

    1301. thefilter.regex (InputData, Value, ShoworHideError) // Exécute le rappel AJAX

    1302.             } else {     

    1303.              var ajaxError = $input.data('ideal-ajax-error')     

    1304.               if ( ajaxError ) {     

    1305.                showOrHideError( ajaxError, $input.data('ideal-ajax-resp') | | faux )     

    1306.               }     

    1307.             }     

    1308.           }     

    1309.           // Tous les autres filtres     

    1310.           autre {     

    1311.             var 

      valid = Utils.isRegex( le Filtrer. regex ) && theFilter.regex.test( value ) ||     

    1312.                         Utils.isFunction( theFilter.regex ) && theFilter.regex( inputData, value )     

    1313.             erreur

       = customError || theFilter.error // attribuer une erreur après appel regex()     

    1314.             showOrHideError( error, valid )     
    1315.             if ( !valid ) { return false }     
    1316.           }     
    1317.         }     
    1318.       })     
    1319.     }     
    1320.     // Réinitialiser si il n'y a aucun filtre     
    1321.     sinon {     
    1322. resetError()     
    1323.     }     
    1324.     // Flags      
    1325.     var 
    1326. flags
    1327.  = (function(){     

            var 
    1328. f
    1329.  = 

      userOptions.flags && userOptions.flags.split(' ') || [ ]     

            if ( o.globalFlags ) {     
    1330.         $.each( o.globalFlags.split(' '), function( i, v ) { f.push(v) })     
    1331.       }     
    1332.       retour f     
    1333. }())     
    1334.     if ( flags.length ) {     
    1335.       $.each(flags, function( i,f ) {     
    1336.         var 
    1337. theFlag
    1338.  = $.idealforms.flags[f]     

              if ( theFlag ) { theFlag( $input, e .type ) }     
    1339.       })     
    1340.     }     
    1341.     // Mettre à jour le compteur      
    1342.     if ( self.$tabs.length ) {     
    1343.       self._updateTabsCounter( self._getCurrentTabIdx() )     

    1344.     }     

    1345.   },     

    1346.   _attachEvents: function() {     

    1347.     var self = this     

    1348.     self._getUserInputs().on('keyup change focus blur', function(e) {     

    1349.       var $this = $(this)

    1350.       var $field = $this.parents('.ideal-field')     

    1351.       var  isFile = $this.is('input[type=file]')     

    1352.       // Déclencheur en changement si type=fichier car fichier personnalisé      

    1353.       // désactive le focus sur l'entrée du fichier d'origine (tabIndex = -1)     

    1354.       if ( e.type === 'focus' || isFile && e.type === 'change' ) {     

    1355.         $field.addClass('ideal-field-focus')     

    1356.       }     

    1357.       si ( e.type === 'flou' ) {     

    1358.         $field.removeClass('ideal-field-focus')     

    1359.       }     

    1360.       self._validate( $this, e )     

    1361.     })     

    1362.   },     

    1363.   _responsive: function() {     

    1364.     var formElements = this._getFormElements()     

    1365.     var maxWidth = LessVars.fieldWidth + formElements.labels.outerWidth()     

    1366.     var $emptyLabel = formElements.labels.filter(function() {     

    1367.       return $(this).html () === ' '     

    1368.     })     

    1369.     var $customSelect = ce .$form.find('.ideal-select')     

    1370.     this.opts.responsiveAt === 'auto'     

    1371.       ? this.$form.toggleClass( 'stack', this.$form.width() < maxWidth )     

    1372.       : this. $form.toggleClass( 'stack', $(window).width() < this.opts.responsiveAt )     

    1373.     var isStack = this.$form.is('.stack')     

    1374.     $emptyLabel.toggle( !isStack )     

    1375.     $customSelect.trigger( isStack ? 'list' : 'menu' )     

    1376.     // Masquer datePicker     

    1377.     var $datePicker = this.$form.find('input.hasDatepicker')     

    1378.     if ( $datePicker.length ) { $datePicker.datepicker('hide') }     

    1379.   }     

    1380. })     

    1381. /*    

    1382.  * Méthodes publiques    

    1383.  */     

    1384. $.extend( IdealForms.prototype , {     

    1385.   getInvalid: function() {     

    1386.     return this.$form.find('.ideal-field').filter( function() {     

    1387.       return $(this).data('ideal-isvalid') === false     

    1388.     })     

    1389.   },     

    1390.   getInvalidInTab: function( nameOrIdx ) {     

    1391.     return this._getTab( nameOrIdx ) .find('.ideal-field').filter(function() {     

    1392.       return $(this).data('ideal-isvalid') === false     

    1393.     })     

    1394.   },     

    1395.   isValid : function() {     

    1396.     return !this.getInvalid().length     

    1397.   },     

    1398.   isValidField: function( field ) {     

    1399.     var $input = Utils.getByNameOrId( field )     

    1400.     return $input.parents(' .ideal-field').data('ideal-isvalid') === true     

    1401.   },     

    1402.   focusFirst : function() {     

    1403.     if ( this.$tabs.length ) {     

    1404.       this.$tabs.filter(':visible')     

    1405.         .find('.ideal-field:first')     

    1406.         .find('input:first, select, textarea').focus()

    1407.     } else {     

    1408.       this.$form.find('.ideal-field:first')     

    1409.         .find('input:first, select, textarea').focus()     

    1410.     }     

    1411.     retourner ce      

    1412.   },     

    1413.   focusFirstInvalid: function() {     

    1414.     var $first = this.getInvalid().first().find('input:first, select, textarea')     

    1415.     var tabName = $first.parents('.ideal-tabs-content').data('ideal-tabs-content-name')     

    1416.     si ( this.$tabs.length ) {     

    1417.       this.switchTab( tabName )     

    1418.     }     

    1419.     $first.focus()

    1420.     retourner ce     

    1421.   },      

    1422.   switchTab: function( nameOrIdx ) {     

    1423.     this.$tabs.switchTab( nameOrIdx )     

    1424.     retour this     

    1425.   },     

    1426.   onglet suivant : function() {     

    1427.     this.$tabs. nextTab()     

    1428.     retourner ce      

    1429.   },     

    1430.   prevTab : function() {     

    1431.     this.$tabs.prevTab()     

    1432.     retourner this     

    1433.   },     

    1434.   firstTab: function() {     

    1435.     this.$tabs.firstTab()     

    1436.     retourner ce      

    1437.   },     

    1438.   lastTab : function() {     

    1439.     this.$tabs.lastTab( )     

    1440.     retourner ce      

    1441.   },     

    1442.   fresh: function() {     

    1443.     this._getUserInputs().change().parents('.ideal-field')     

    1444.       .removeClass('valid invalid')     

    1445.     retourner ce     

    1446.   },     

    1447.   freshFields : function( fields ) {     

    1448.     fields = Utils.convertToArray( fields )     

    1449.     $.each( fields, function( i ) {

    1450.       var $input = Utils.getByNameOrId( fields[ i ] )     

    1451.       $ input.change().parents('.ideal-field').removeClass('valid invalid')     

    1452.     })     

    1453.     retour this     

    1454.   },     

    1455.   reload : function() {     

    1456.     this._adjust()

    1457.     this._attachEvents()     

    1458.     retourner this     

    1459.   },     

    1460.   reset : function() {     

    1461.     var formElements = this._getFormElements()     

    1462.     formElements.text.val('') // entrées de texte     

    1463.     formElements.radiocheck.removeAttr('checked') // radio & check     

    1464.     // Sélectionner et sélectionner personnalisée     

    1465.     formElements.select.find('option').first().prop( 'selected', true )

    1466.     this.$form.find('.ideal-select').trigger('reset')     

    1467.     if ( this.$ tabs.length ) { this.firstTab() }     

    1468.     this.focusFirst().fresh()     

    1469.     retourner this     

    1470.   },     

    1471.   resetFields : function( fields ) {     

    1472.     fields = Utils.convertToArray( fields )     

    1473.     var formElements = this._getFormElements()     

    1474.     $.each( fields, function( i, v ) {     

    1475.       var $ input = Utils.getByNameOrId( v )     

    1476.       var type = Utils.getIdealType ( $input )     

    1477.       if ( type === 'text' || type === 'file' ) {     

    1478.         $input.val('')     

    1479.       }     

    1480.       if ( type === 'radiocheck' ) {     

    1481.         $input.removeAttr('checked') // radio & check      

    1482.       }     

    1483.       if ( type === 'select' ) {     

    1484.         $input.find('option'). first().prop( 'selected', true )     

    1485.         $input.next('.ideal-select').trigger('reset')     

    1486.       }     

    1487.       $input.change()     

    1488.     })     

    1489. this.freshFields( fields )     

    1490.     retourner this     

    1491.   },     

    1492.   toggleFields : function( field ) {     

    1493.     fields = Utils.convertToArray( fields )     

    1494.     var self = this     

    1495.     var $fields = Utils.getFieldsFromArray( fields )     

    1496.     $fields.each(function() {     

    1497.      var $this = $(this)     

    1498.       var nom = $this.attr('name') || $this.attr('id')     

    1499.       var input = self.opts.inputs[ name ]     

    1500.       var filters = input && input.filters     

    1501.       var dataFilters = $this. data('filtres-idéaux') || ''     

    1502.       $this.data( 'ideal-filters', filters )     

    1503.       $this.closest('.ideal-wrap' .toggle()     

    1504.       self.setFieldOptions( name, { filters : dataFilters } )     

    1505.     })     

    1506.     retourner ce     

    1507.   },     

    1508.   setOptions : function( options ) {     

    1509.     $.extend( true, this.opts, options )     

    1510.     this.reload().fresh()     

    1511.     retourner ce     

    1512.   },     

    1513.   setFieldOptions : function( nom, options ) {     

    1514. $.extend( true, this.opts.inputs[ name ], options )     

    1515.     this.reload().freshFields([ name ])     

    1516.     retourner ce     

    1517.   },     

    1518.   addFields: function( fields ) {     

    1519. fields = Utils.convertToArray( fields )     

    1520.     var self = this     

    1521.     // Enregistrez les noms de toutes les entrées dans Array     

    1522.     // pour utiliser des méthodes qui prennent des noms c'est-à-dire. fresh()     

    1523.     var allNames = []     

    1524.     // Ajouter une entrée au DOM     

    1525.     function add( ops ) {     

    1526.       var name = ops.name     

    1527.  nbsp;     var userOptions = {     

    1528.         filtres : ops.filters || '',     

    1529.         données : ops.data || {},     

    1530.         erreurs : ops.errors || {},     

    1531.         drapeaux : ops.flags || ''     

    1532.       }     

    1533.       var label = ops.label || ''     

    1534.       var type = ops.type     

    1535.       var list = ops.list || []     

    1536.       var placeholder = ops.placeholder || ''     

    1537.       var value = ops.value || ''     

    1538.       var $field = $('<div> '+     

    1539.           '<étiquette>'+ label +' :label>'+     

    1540.           Utils.makeInput( name, value, type, list, placeholder ) +     

    1541.         'div>')     

    1542.       var $ input = $field.find('input, select, textarea, :button')     

    1543.       // Ajouter des entrées avec des filtres à la liste     

    1544.       // des entrées utilisateur à valider     

    1545.       if ( userOptions.filters ) { self.opts.inputs[ name ] = userOptions }      

    1546.       self._doMarkup( $input )     

    1547.       // Insérer dans DOM     

    1548.       if ( ops.addAfter ) {    

    1549.         $field.insertAfter(     

    1550.           $( Utils.getByNameOrId( ops.addAfter ) ).parents('.ideal-wrap')     

    1551.         )     

    1552.       } else if ( ops.addBefore ) {     

    1553.         $field.insertBefore (

    1554.           $(Utils.getByNameOrId( ops.addBefore ))     

    1555.           .parents('.ideal-wrap')     

    1556.           self._getTab( ops.appendToTab ).find('.ideal-wrap:last-child')     

    1557.         )     

    1558.       } else {     

    1559.         $field.insertAfter( self.$form.find('.ideal-wrap').last() )     

    1560. }

    1561. // Ajouter le nom de champ actuel à la liste des noms

    1562. allNames.push (name)

    1563.     }     

    1564.     // Parcourir chaque entrée     

    1565.     $.each( fields, function( i, ops ) { add( ops ) })     

    1566.     self.reload()     

    1567.     self.freshFields( allNames )     

    1568.     self._responsive()     

    1569.     retourner ce     

    1570.   },     

    1571.   removeFields : function( fields ) {     

    1572.     

      fields
    1573.  = 
    1574. Utils

      .convertToArray( fields )     

    1575.     var $fields = Utils.getFieldsFromArray( fields )     

    1576.     $fields.parents('.ideal-wrap').remove ()         this.reload()     

    1577.     retourner ce     

    1578.   }     

    1579. })     

    1580. }( jQuery, window, document ))

    【Recommandations associées】

    1 Tutoriel vidéo gratuit HTML5

    2. Explication détaillée de l'instance de base de données locale HTML5

    3 Vous apprendre à implémenter un micro-scénario H5

    .

    4 . Explication détaillée des données des attributs personnalisés de H5-*

    5 Exemple de code H5 pour implémenter les invites de zone de texte

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn