javascript处理表单示例(javascript提交表单)

前端技术 2023/09/03 JavaScript

处理各种表单, 以及链接,按钮的通用组件

复制代码 代码如下:

/**
 * Generic Form processing js
 * @author Anthony.chen
 */

/**
 * Push button action [btn_action]data into form
 * If there is prescript , run the pre script
 */
\"use strict\";
//All ajax request are synchronized by default
var ajaxSynchronized = true;
//All ajax request will be unblock by default
var ajaxAutoUnblock = true;

var ajax_action_button = function (e){
 var btn = $(this);
 //Add prescript
 var pre_script;
 if(pre_script = btn.attr(\"pre_script\")){
  var ret = eval(pre_script);
  if(ret==false){
   return false;
  }
 }
 var btn_action = btn.attr(\'value\');
 if(btn_action){
  $(this).closest(\'form\').data(\'btn_action\',
   { name:\'btn_action\',value:btn_action }
   );
 }
};

/**
 * Update the extra form data in FormElement with Form element, Key and Value
 */
var ajax_update_post_data = function(formEle, k, v){
 var form = $(formEle);
 var post_data = form.data(\'post_data\');
 if( post_data == undefined ){
  post_data = {};
 }

 if( v == undefined ){
  delete post_data[k];
 }else{
  post_data[k] = v;
 }
 form.data(\'post_data\',post_data);
 return true;
};

/**
 * Bool Checkbox is special checkbox which needs to keep UNCHECK value
 * And post with ajax form ,the form is in the parent
 */
var bool_checkbox = function(){
 var ipt = $(this);
 var formEle = ipt.closest(\"form\");
 var _check = ipt.prop(\"checked\");
 if(_check){
  ajax_update_post_data(formEle,ipt.attr(\'name\'));
 }else{
  ajax_update_post_data(formEle,ipt.attr(\'name\'),\'f\');
 }
};

/**
 * Init the spin number
 */
var spin_number = function(){
 var spin = $(this);
 var config = {
  lock:true,
    imageBasePath: \'{webpath}/css/images/spin/\',
    btnCss: null,
    txtCss: null,
    btnClass:\'spin_btn\',
 };
 var interval = spin.attr(\'interval\');
 if(interval){
  config.interval = interval;
 }else{
  config.interval = 1;
 }

 var min = spin.attr(\'min\');
 if( min ){
  config.min = min;
 }

 var max = spin.attr(\'max\');
 if( max ){
  config.max = max;
 }

 spin.spin(config);
 return true;
};

/**
 * Init the date input
 */
var date_input = function(){
 var ipt = $(this);
 var config = {
  offset:[4,0],
  selectors:true,
  lang: \'{lang}\',
  firstDay : 1,
  format: \'yyyy-mm-dd\',
 };

 var min = ipt.attr(\'min\');
 if( min ){
  config.min = min;
 }

 var min = ipt.attr(\'min\');
 if( min ){
  config.min = min;
 }

 ipt.dateinput(config);
 return true;
};


/**
 * Init the timePicker
 */
var time_picker = function(){
 var ipt = $(this);
 var config = { };

 var step = ipt.attr(\"step\");
 if( step ){
  config.step = step;
 }

 ipt.timePicker( config );
 return true;
};

/**
 * Generic Ajax Form post function
 * If btn_action is set, then add data into form
 * if returi is set, redirect to returi
 * if reload is set, reload
 * else Show block message
 *
 * the form will be validated.
 */
var ajax_form_post = function(e){
 var form = $(this);
 var pre_script;
 if(pre_script = form.attr(\"pre_script\")){
  var ret = eval(pre_script);
  if(ret==false){
   return false;
  }
 }
 var errHint = form.find(\".formError\").first();
 if(errHint.size() == 0){
  errHint = $(\"#pageError\");
 }
 errHint.text(\'\').hide();

 //Cleanup the pageError
 if(!e.isDefaultPrevented()){
  //Hide all .formError
  $.blockUI({ message:\"{__(\'L_PROCESSING\')}\" });
  var formArray = form.serializeArray();
  var btn_action_data;
  var btn_action;
  if(btn_action_data = form.data(\'btn_action\')){
   formArray.push(btn_action_data);
   form.removeData(\'btn_action\');
   btn_action = btn_action_data.value;
  }else{
   btn_action = \'\';
  }

  console.log(\'btn action:\'+btn_action);
  //Add extra Data
  var post_data;
  if(post_data = form.data(\'post_data\')){
   for (var k in post_data ){
    //if post_data[k] is array,need more to do
    formArray.push( { name:k ,value: post_data[k] } );
   }
   form.removeData(\'post_data\');
  }

  $.post(form.attr(\'action\'), formArray,function(json){
    if($(window).data(\'blockUI.isBlocked\') == 1){
     $.unblockUI();
    }
    if(json.code === true){
     var returi = \"\";
     var retData = \"{__(\'L_PROCESSED\')}!\";
     if(json.data){
      retData = json.data; 
     }

     //TODO Add suppport to allow save and stay
     if(btn_action ==\'reqonly\'){
      if(returi = form.attr(\'returi\')){
       $(window).data(\'blockUI.returi\',returi);
       ajaxAutoUnblock = false;
      }
      $.blockUI({ message:retData, css:{ cursor:\'pointer\',padding:\'4px\',border:\'3px solid #CC0000\',}, overlayCSS:{ cursor:\'pointer\' } });
      $(\".blockUI\").addClass(\"blockwarn\");
     } //if there is returi set, then return to uri
     else if(returi = form.attr(\'returi\')){
      window.location = returi;
     //Else if reload is set, then will be reload
     }else if(form.attr(\'reload\')!=undefined){
      window.location.reload();
     }else{
      $.blockUI({ message:retData });
      $.unblockUI();
     }
    }
    else{
     if(typeof (json.data.errmsg) == \'string\'){
      errHint.html(json.data).show();
      //$.blockUI({ message:json.data, css:{ cursor:\'pointer\',padding:\'4px\',border:\'3px solid #CC0000\',}, overlayCSS:{ cursor:\'pointer\' } });
      //$(\".blockUI\").addClass(\"blockwarn\");
     }else{
      errHint.html(\"{Html::text(__(\'E_FORM\'))}\").show();
      for(var p in json.data){
       var msg = json.data[p];
       //Process hidden value,None hidden input should has refid refered to hidden value
       //Showing the Server message to ref
       var ele = form.find(\"[type=hidden][name=\"+p+\"]\");
       if(ele.length){
        delete json.data.p;
        refid = ele.attr(\"id\");
        refname = form.find(\"[hidden-id=\"+refid+\"]\").attr(\"name\");
        json.data[refname]=+msg;
       }

       //Muti checkbox
       var ele = form.find(\"[type=checkbox][name=\'\"+p+\"[]\']\");
       if(ele.length){
        delete json.data.p;
        refname = p+\'[]\';
        json.data[refname]=+msg;
       }
       //@END
      }
     }
     /*
      * Checking the hidden values
      */
     form.data(\"validator\").invalidate(json.data);
    } },\'json\');
    e.preventDefault();
 }else{
  errHint.html(\"{Html::text(__(\'E_FORM\'))}\").show();
 }
};

/***
 * Reset the input
 */
var ajax_post_form_hidden = function(){
  var form  = $(this);

  form.find(\"[hidden-id]\").each(function(){
   //Clear the message of Reference
   var input = $(this);
   var refid = input.attr(\"hidden-id\");
   var field = $(\"#\" + refid + \"\");
   //Setup the clear of Errmsg
   //Monitor the change event on ID element, remove error message
   //of Real input
   field.change(function(){
    //Hidden input
    var hinput  = $(this);
    //real input
    var rinput = $(\"[hidden-id=\"+hinput.attr(\"id\")+\"]\").first();
    form.data(\'validator\').reset(rinput)
    });
   });
  };

var validate_hidden_id =  function(input) {
 var refid = input.attr(\"hidden-id\");
 var field = $(\"#\" + refid + \"\");
 var msg = field.attr(\'msg\');
 if( !msg ){
  msg = \"{__(\'E_NOT_EMPTY\')}\";
 }

 return field.val() ? true : msg;
};

var data_equals_validate =  function(input) {
 var field;
 var name = input.attr(\"data-equals\");
 field = this.getInputs().filter(\"[name=\" + name + \"]\");
 return input.val() == field.val() ? true : [name];
};

/**
 * Ajax request through link
 * If confirm is set, confirm before send request
 * Support returi and reload
 * Else show block message
 */
var ajax_link_req = function(){
 var l = $(this);
 var hint = l.attr(\'hint\');
 if(hint){
  var errHint = $(l.attr(\'hint\'));
  errHint.text(\'\').hide();
 }
 //If the confirm message is set, then should be confirmed from client
 if(l.attr(\'confirm\')){
  if(!confirm(l.attr(\'confirm\'))){
   return false;
  }
 }

 $.blockUI({ message:\"{__(\'L_PROCESSING\')}\" });

 var pre_script;
 if(pre_script = l.attr(\"pre_script\")){
  var ret = eval(pre_script);
  if(ret==false){
   return false;
  }
 }

 var block = l.attr(\'block\');
 if(block != undefined){
  ajaxAutoUnblock = false ;
 }

 $.get(l.attr(\'href\'),function(json){
   if(json.code == true){
    var retData = \"{__(\'L_PROCESSED\')}!\";
    var returi;
    //If success to execute funtion for each
    var successFunc = l.attr(\'success\');
    if(successFunc){
     l.each(window[successFunc]);
    }

    if(json.data){
     retData = json.data; 
    }
    //IF Require warning before
    if( l.attr(\'value\') == \'reqonly\'){
     alert(retData);
    }else if(returi = l.attr(\'returi\')){
     window.location = returi;
    }
    else if(l.attr(\'reload\')!=undefined){
     window.location.reload();
    }
    else{
     $.blockUI({ message:retData, css:{ cursor:\'pointer\',padding:\'4px\',border:\'3px solid #CC0000\',}, overlayCSS:{ cursor:\'pointer\' } });
     $(\".blockUI\").addClass(\"blockwarn\");
    }
   }else{
    //$.unblockUI();
    //Only could support Text errmsg
    if(hint){
     errHint.text(json.data).show();
    }else{
     alert(json.data);
    }
   }},\'json\');
 return false;
};

/**
 * Supporting the button base navigation
 * Only jump to new href
 */
var btn_nav = function(){
 var input = $(this);
 var href = input.attr(\"href\");
 if(href){
  window.location = href;
 }else{
  alert(\"Href not set\");
 }
 return false;
};

/**
 * Support button base Ajax get method request
 * support returi and reload
 */
var btn_req = function(){
 var input = $(this);
 var href = input.attr(\"href\");

 var hint = input.attr(\'hint\');
 if(hint){
  var errHint = $(hint).first();
  if(errHint.size() == 0){
   errHint = $(\"#pageError\");
  }
  errHint.text(\'\').hide();
 }

 var block = input.attr(\'block\');
 if(block != undefined){
  ajaxAutoUnblock = false 
 }

 $.get(href,function(json){
   if(json.code == true){
   var returi;
   if(returi = input.attr(\'returi\')){
    window.location = returi;
   }
   else if(input.attr(\"reload\")!=undefined){
    window.location.reload();
   }else{
     var retData = \"{__(\'L_PROCESSED\')}!\";
     if(json.data){
      retData = json.data; 
     }
     $.blockUI({ message:retData,css:{ cursor:\'pointer\' },overlayCSS:{ cursor:\'pointer\' } });
    }
   }else{
    if(hint){
     $.unblockUI();
     errHint.html(json.data.errmsg).show();
    }else{
     $.blockUI({ message:json.data.errmsg, css:{ cursor:\'pointer\',padding:\'4px\',border:\'3px solid #CC0000\',}, overlayCSS:{ cursor:\'pointer\' } });
     $(\".blockUI\").addClass(\"blockwarn\");
    }
   }
   },\'json\');
 return false;
};

 

/**
 * Generic Ajax Checkbox
 * The default action is prevented and submit real request through URL
 */
var ajax_checkbox = function(){
 event.preventDefault();
 var action = $(this);
 var url = action.attr(\'url\');
 var _check = action.prop(\"checked\");
 console.log(_check);
 var op ;
 if(_check){
  op = \"1\";
 }else{
  op = \"0\";
 }
 $.get(url + op ,function(json){
  if(json.code == true){
    if(_check){
     action.prop(\"checked\",true);
    }else{
     action.prop(\"checked\",false);
    }
    return true;
   }else{
    return false;
   }
 },\'json\');
};


/**
 * Crete Root picklist
 */
var picklistinit = function(){
 var _select = $(this);
 var _hidden_id = _select.attr(\'hidden-id\');
 var _un = _select.attr(\'un\');
 var _lovchildren = _select.data(\'lovtree\').c;
 var _rowvalue = _select.data(\'rowvalue\');

 $(\"<OPTION>\").append(\"{__(\'L_SELECT\')}\").appendTo(_select);
 for(var _kid in _lovchildren){
  var _lov = _lovchildren[_kid][\'lov\'];
  $(\"<OPTION>\").val(_lov.lov_id).append(_lov.v).attr(\'k\',_lov.id).attr(\'is_leaf\',_lov.is_leaf).appendTo(_select);
 }
 _select.change(picklistchange);

 //Select the list
 if(_rowvalue){
  _select.find(\"[value=\"+_rowvalue[0]+\"]\").prop(\"selected\",true);
  _select.change();
 }
 return true;
};

/**
 * Select pick list
 */
var picklistchange = function (){
 var _select = $(this);
 var _hidden_id = _select.attr(\'hidden-id\');
 var _un = _select.attr(\'un\');

 //Remove all the subsequent
 var _lovtree = _select.data(\'lovtree\');
 var _rowvalue = _select.data(\'rowvalue\');

 _select.nextAll().remove();

 //This is value of Current Select
 var _selected = _select.find(\':selected\');
 if(_selected.attr(\'is_leaf\')==\"{DB::T}\"){
  $(\"#\"+_hidden_id).val(_select.val());
  _select.after(\"<img src=\'/s.gif\' class=\'sprite_global successimg\'/>\");
 }else{
  var _val = _select.val();
  var _k = _selected.attr(\'k\');

  //Getting Children list
  if(_lovtree.c[_k].c == undefined){
   return false;
  }
  var _c_lovtree =  _lovtree.c[_k];

  var _c_select = $(\'<SELECT>\').data(\'lovtree\',_c_lovtree).
   data(\'rowvalue\',_rowvalue).
   attr(\'hidden-id\',_hidden_id).attr(\'un\',_un).
   attr(\'name\',_un+\'_\'+_k);
  $(\"<OPTION>\").append(\"{__(\'L_SELECT\')}\").appendTo(_c_select);
  //Building the option list
  for(var _kid in _c_lovtree.c){
   var _lov = _c_lovtree.c[_kid][\'lov\'];
   $(\"<OPTION>\").val(_lov.lov_id).append(_lov.v).attr(\'k\',_lov.id).attr(\'is_leaf\',_lov.is_leaf).appendTo(_c_select);
   //Insert after
   _select.after(_c_select);
   //Onchange
  }
  _c_select.change(picklistchange);

  if(_rowvalue){
   _c_select.find(\"[value=\"+_rowvalue[_k]+\"]\").prop(\"selected\",true);
   _c_select.change();
  }
 }
};

 

var lookup_new = function(){
 var lookup = $(this);
 var pre_script;
 if(pre_script = lookup.attr(\"pre_script\")){
  var ret = eval(pre_script);
  if(ret==false){
   return false;
  }
 }
 var url = lookup.attr(\"url\");
 if(!url){
  alert(\'url not set\');
  return false;
 }
 var height = lookup.attr(\'h\');
 if(!height){
  height = 600;
 }
 var width = lookup.attr(\'w\');
 if(!width){
  width = 800;
 }
 window.open(url,\"pselect\",\"scrollbars=yes,menubar=no,height=\"+height+\",width=\"+width+\",resizable=yes,toolbar=no,location=no,status=no\");
 return false;
};

/**
 * Lookup  new value for hidden value
 */
var parent_lookup = function(){
 var lookup = $(this);
 var pid = opener.$(\"#\" + lookup.attr(\'pid\'));
 if(!pid.length){
  alert(lookup.attr(\'pid\')+ \" not found\");
  return false;
 }
 var pname = opener.$( \"#\" + lookup.attr(\'pname\'));
 if(!pname.length){
  alert(lookup.attr(\'pname\')+ \" not found\");
  return false;
 }

 var aft_script;
 //Run current after script
 if(aft_script = lookup.attr(\'aft_script\')){
  window.eval(aft_script);
 }

 pid.val($(this).attr(\"refid\")); 
 //Only operation from opener could trigger change event
 pid.change();
 pname.val($(this).attr(\"refvalue\")); 
 pname.change();
 //Parent after_script
 if(aft_script = pname.attr(\'aft_script\')){
  opener.window.eval(aft_script);
 }
 if(aft_script = pid.attr(\'aft_script\')){
  opener.window.eval(aft_script);
 }
 window.close();
};

/**
 * Default upload complete
 */
//var uploadComplete = function(event, id, fileName, responseJSON) {
var uploadComplete = function(e, data) {
 //To be replaced by jquery uploader
 var _fileUpload = $(this);
 //console.log(_fileUpload);
 //console.log(data.result);
 if(_fileUpload.attr(\'reload\')!=undefined){
  window.location.reload();
 }
};

/**
 * File upload function ,the following attribute to control action of upload
 * \'endpoint\' as upload url
 * \'sid\' as session id
 * \'complete\' optional to configure the custom upload complete function
 */
var genericUpload = function(dom){
 var endpointurl = $(this).attr(\'endpoint\');
 var sid = $(this).attr(\"sid\");
 var completeFunc = \'uploadComplete\';
 //Setup custome complete function
 var cusComplete = $(this).attr(\'complete\');
 if(cusComplete){
  completeFunc = cusComplete;
 }

 $(this).fileupload({
  url: endpointurl,
  autoUpload:true,
  dataType:\'json\',
  formData: [{ \'sessionid\': sid }],
  paramName: \'Filedata\',
 }).bind(\'fileuploaddone\',window[completeFunc]);
};

/**
 * Matched errors with input
 * Only matched errors could be identified here
 */
var advance_validate = function(errors, event) {
 var conf = this.getConf();
 // loop errors
 $.each(errors, function(index, error) {
   // add error class into input Dom element
   var input = error.input;     

   input.addClass(conf.errorClass);

   // get handle to the error container
   var msg = input.data(\"msg.el\");

   // create Error data if not present, and add error class for input
   // \"msg.el\" data is linked to error message Dom Element
   if (!msg) {
   //msg = $(conf.message).addClass(conf.messageClass).insertAfter(input);
   msg = $(conf.message).addClass(conf.messageClass).appendTo(input.parent());
   input.data(\"msg.el\", msg);
   } 

   // clear the container
   msg.css({visibility: \'hidden\'}).find(\"span\").remove();

   // populate messages
   $.each(error.messages, function(i, m) {
     $(\"<span/>\").html(m).appendTo(msg);   
     });

   // make sure the width is not full body width so it can be positioned correctly
   if (msg.outerWidth() == msg.parent().width()) {
    msg.add(msg.find(\"span\"));  
   }

   //insert into correct position (relative to the field)

   msg.css({ visibility: \'visible\'}) .fadeIn(conf.speed);    
   msg.parent().addClass(\"colError\");
 });
};

var advance_inputs = function(inputs) {
 var conf = this.getConf();    
 inputs.removeClass(conf.errorClass).each(function() {
   var msg = $(this).data(\"msg.el\");
   if (msg) {
   msg.hide();
   msg.parent().removeClass(\"colError\");
   }
   });
 if($(\".colError\").size() == 0){ 
  var form = $(this);
  var errHint = form.find(\".formError\").first();
  if(errHint.size() == 0){
   errHint = $(\"#pageError\");
   errHint.text(\'\').hide();
  }
 }
};

/**
 * When refname is contained to be selected
 */
var checkall = function() {
 var check = $(this);
 var refname = check.attr(\'refname\');
 if(refname){
  if(check.prop(\"checked\")){
   $(\"input[name*=\'\"+refname+\"\']\").prop(\"checked\",true);
  }else{
   $(\"input[name*=\'\"+refname+\"\']\").prop(\"checked\",false);
  }
 }

 var refclass = check.attr(\'refclass\');
 if(refclass){
  if(check.prop(\"checked\")){
   $(\"input.\"+refclass).prop(\"checked\",true);
  }else{
   $(\"input.\"+refclass).prop(\"checked\",false);
  }
 }
};

/**
 * Setup readonly checkbox
 */
var readonlyCheck = function(e){
 e.preventDefault(); 
 return false;
};

/**
 * Select List disable
 */
var readonlySelect = function(){
 $(this).prop(\"disabled\", true);
};


$(document).ready(function() {
  $(document).ajaxStart(function(){
   //Clean up the Ajax request Page Level Error
   $(\"#pageError\").text(\'\').hide();
   //Clean up teh Form Error
   $(\".formError\").text(\'\').hide();
   //Blocking all ajax processing
   if(ajaxSynchronized){
    $.blockUI({ message:\"{__(\'L_PROCESSING\')}\" });
    }
   });
  $(document).ajaxStop(function(){
   if(ajaxSynchronized){
    if($(window).data(\'blockUI.isBlocked\') == 1){
     if(ajaxAutoUnblock){
      $.unblockUI();
     }else{
        ajaxAutoUnblock = true;
     }
    }
   }else{//Change back to default Synchronized mode from Async
    ajaxAutoUnblock = true;
    ajaxSynchronized =  true;
   }
   });
  $(document).ajaxError(function(event, request, settings){
   alert(\'Ajax Request Error! URL=\'+settings.url);
   if(ajaxSynchronized){
    if($(window).data(\'blockUI.isBlocked\') == 1){
     if(ajaxAutoUnblock){
      $.unblockUI();
     }else{
        ajaxAutoUnblock = true;
     }
    }
   }else{
    ajaxAutoUnblock = true;
    ajaxSynchronized =  true;
   }
   });

  //Force unblockUI
  $(document).click(function(){
    if($(window).data(\'blockUI.isBlocked\') == 1){
     $.unblockUI();
     var returi = $(window).data(\'blockUI.returi\');
     if(returi){
      window.location = returi;
     }
    }});

  $.tools.validator.addEffect(\"advanced\", advance_validate,advance_inputs);
  $.tools.validator.fn(\"[data-equals]\", { \"{lang}\":\"{__(\'E_NOTEQUAL\')}\" }, data_equals_validate );
  $.tools.validator.fn(\"[hidden-id]\",validate_hidden_id);

  $(\".ajax_form_post\").validator({ lang:\'{lang}\',effect:\'advanced\' }) .submit( ajax_form_post );
  $(\".ajax_form_post\").each(ajax_post_form_hidden);
  $(\".spin_number\").each(spin_number);
  $(\".date_input\").each(date_input);
  $(\".time_picker\").each(time_picker);

  $(\'.ajax_link_req\').click(ajax_link_req);
  //Client validation for the hidden ID
  $(\".require_validate\").validator({ lang:\'{lang}\',effect:\'advanced\' });

  $(\".btn_nav\").click( btn_nav );
  $(\".btn_req\").click( btn_req );
  $(\"button.btn_action\").click(ajax_action_button);
  $(\".lookup_new\").click(lookup_new);
  $(\".parent_lookup\").click(parent_lookup);
  $(\".ajax_checkbox\").click(ajax_checkbox);
  $(\".bool_checkbox\").click(bool_checkbox);
  $(\".checkall\").click(checkall);
  $(\"img[rel]\").overlay();
     $(\"input[tip]\").tooltip({ position:\"center right\"});

  //At last we will do localize
  $.tools.validator.localize(\"{lang}\", {
   \'*\'     : \"{__(\'E_ALL\')}\",
   \':email\'    : \"{__(\'E_EMAIL\')}\",
   \':number\'   : \"{__(\'E_DECIMAL\')}\",
   \':url\'      : \"{__(\'E_URL\')}\",
   \'[max]\'     : \"{__(\'E_MAX_LENGTH\')}\",
   \'[min]\'     : \"{__(\'E_MIN_LENGTH\')}\",
   \'[required]\'    : \"{__(\'E_NOT_EMPTY\')}\",
   });
});

本文地址:https://www.stayed.cn/item/6419

转载请注明出处。

本站部分内容来源于网络,如侵犯到您的权益,请 联系我

我的博客

人生若只如初见,何事秋风悲画扇。