jquery自定义表单验证插件


Posted in Javascript onOctober 12, 2016

本文实例为大家分享了jquery表单验证插件,供大家参考,具体内容如下

//正则表达式
var map = new Map();
map.put("*", /[\w\W]+/);
map.put("*6-16", /^[\w\W]{6,16}$/);
map.put("n", /^\d+$/);
map.put("n6-16", /^\d{6,16}$/);
map.put("s", /^[\u4E00-\u9FA5\uf900-\ufa2d\w\.\s]+$/);
map.put("s6-16", /^[\u4E00-\u9FA5\uf900-\ufa2d\w\.\s]{6,16}$/);
map.put("p", /^[0-9]{6}$/);//邮编
map.put("m", /^13[0-9]{9}$|14[0-9]{9}|15[0-9]{9}$|18[0-9]{9}$/);//手机号码
map.put("e", /^\w+([-+.']\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*$/);//email
map.put("url", /^(http|https):\/\/(\w+:\/\/)?\w+(\.\w+)+.*$/);//url地址
map.put("image", /^(http|https):\/\/.*(.JPEG|.jpeg|.JPG|.jpg|.GIF|.gif|.BMP|.bmp|.PNG|.png)$/);//图片
map.put("integer", /^[1-9]\d*$/);//大于0的正整数
map.put("hj", /(\S*?) [^>]*>.*?<\/\1>|<.*?/);//过滤html标签和javascript标签


(function($,win){
 Validform = {
 matchReg : function(datatype){
  //匹配返回正则表达式 有3个比较特殊 所有特殊处理一下
  //这3个是因为有长度判断 要动态修改正则表达式
  var reg1 = /^\*\d{1,}-\d{1,}$/;
  var reg2 = /^n\d{1,}-\d{1,}$/;
  var reg3 = /^s\d{1,}-\d{1,}$/;
  if(reg1.test(datatype) || reg2.test(datatype) || reg3.test(datatype)){
  //把开始长度和结束长度截取出来
  var index = datatype.indexOf("-");
  var nums =new Array();
  nums[0] = datatype.substring(1,index);
  nums[1] = datatype.substring(index+1,datatype.length);
  //替换数字
  var reg;
  switch (datatype.substring(0,1)) {
  ///^[\w\W]{6,16}$/
  case "*": reg = new RegExp("^[\\w\\W]{"+nums[0]+","+nums[1]+"}$"); break;
  case "n": reg = new RegExp("^\\d{"+nums[0]+","+nums[1]+"}$"); break;
  case "s": reg = new RegExp("^[\\u4E00-\\u9FA5\\uf900-\\ufa2d\\w\\.\\s\\\\/]{"+nums[0]+","+nums[1]+"}$"); break;
  }
  return reg;
  }else{
  return map.get(datatype);
  }
 }
 }
})(jQuery,window);

 HaHaUtil = {
  checkFrom : function(formId){
  var form = $("#"+formId)[0];
  //遍历表单下面的元素
  for(var i=0;i<form.length;i++){
   if(!HaHaUtil.resultCheck(form[i])){
   return false;
   }
  }
  return true;
  },
  resultCheck : function(obj){
  var tagName = obj.tagName;
  switch(tagName)
  {
  case "INPUT": 
  case "TEXTAREA": 
   $item = $(obj);
   var dataType = $item.attr("dataType");
   //没有验证标签 就不校验了
   if(dataType == null){
   return true;
   }else{
   //获取 dataType 可以有多个验证用|分割开
   var reType = dataType.split("|");
   //把表单值前后的空格去掉
   var f_value = $item.val();
   if(f_value.indexOf(" ")!=-1){
    //说明有空格 也有可能中间有空格 中间有空格就不会去掉
    $item.val($.trim(f_value));
   }
   var tipId = $item.attr("tipId");
   $("#"+tipId).html("");

   for(var i=0;i<reType.length;i++){
    //如果第一个正则是 empty 说明是可以没值
    //如果有值 在根据正则校验
    if(reType[i] == "empty"){
    if($item.val() == ""){
     //就不校验了 
     return true;
     break;
    }else{
     //继续校验
     continue;
    }

    }
    if($("."+tipId).is(":hidden")){
    //如果是隐藏的菜单不校验
    continue;
    }
    //获取返回的正则表达式
    var reg = Validform.matchReg(reType[i]);
    if(!reg.test($item.val())){
    //判断不通过
     $("#"+tipId).html($item.attr("errormsg"));
     return false;
    break;
    }else{
     //判断通过 继续校验
     continue;
    }
   }
   return true;
   }
   break;
   //没有匹配到标签就返回false
   default : return true;
  }

  }



}


Array.prototype.remove = function(s) {
 for (var i = 0; i < this.length; i++) {
  if (s == this[i])
  this.splice(i, 1);
 }
}

function Map() {
 /** 存放键的数组(遍历用到) */
 this.keys = new Array();
 /** 存放数据 */
 this.data = new Object();

 /**
  * 放入一个键值对
  * @param {String} key
  * @param {Object} value
  */
 this.put = function(key, value) {
  if(this.data[key] == null){
  this.keys.push(key);
  }
  this.data[key] = value;
 };

 /**
  * 获取某键对应的值
  * @param {String} key
  * @return {Object} value
  */
 this.get = function(key) {
  return this.data[key];
 };

 /**
  * 删除一个键值对
  * @param {String} key
  */
 this.remove = function(key) {
  this.keys.remove(key);
  this.data[key] = null;
 };

 /**
  * 遍历Map,执行处理函数
  * 
  * @param {Function} 回调函数 function(key,value,index){..}
  */
 this.each = function(fn){
  if(typeof fn != 'function'){
  return;
  }
  var len = this.keys.length;
  for(var i=0;i<len;i++){
  var k = this.keys[i];
  fn(k,this.data[k],i);
  }
 };

 /**
  * 获取键值数组(类似Java的entrySet())
  * @return 键值对象{key,value}的数组
  */
 this.entrys = function() {
  var len = this.keys.length;
  var entrys = new Array(len);
  for (var i = 0; i < len; i++) {
  entrys[i] = {
   key : this.keys[i],
   value : this.data[i]
  };
  }
  return entrys;
 };

 /**
  * 判断Map是否为空
  */
 this.isEmpty = function() {
  return this.keys.length == 0;
 };

 /**
  * 获取键值对数量
  */
 this.size = function(){
  return this.keys.length;
 };

 /**
  * 重写toString 
  */
 this.toString = function(){
  var s = "{";
  for(var i=0;i<this.keys.length;i++,s+=','){
  var k = this.keys[i];
  s += k+"="+this.data[k];
  }
  s+="}";
  return s;
 };
}

这个是一个js插件保存.js引用就可以了,特点灵活可以自定义校验内容原理使用正则表达式,对于隐藏的表单不校验

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">
<%@ include file="/common/taglibs.jsp"%>
<%@page contentType="text/html;charset=UTF-8"%>
<%@page pageEncoding="UTF-8"%>

<html>
<head>
<title>新建商品</title>
<script type="text/javascript"
 src="<%=request.getContextPath()%>/static/v0/scripts/commodity/common_functions.js"></script>
<script type="text/javascript"
 src="<%=request.getContextPath()%>/static/v0/scripts/commodity/check_data.js"></script>
<script type="text/javascript"
 src="<%=request.getContextPath()%>/static/v0/scripts/commodity/commodity_create.js"></script>
<script type="text/javascript"
 src="<%=request.getContextPath()%>/static/v0/scripts/jquery/jquery.form.js"></script>
<script type="text/javascript"
 src="<%=request.getContextPath()%>/static/v0/scripts/haha.js"></script>
<script type="text/javascript"
 src="<%=request.getContextPath()%>/static/v0/scripts/haha_upload.js"></script>

<script type="text/javascript">
 j = 1; 
 $(function(){
 updateDiscountPercentage();  
 $("#btn_add2").click(function(){ 
  //var newNode='<div id="fileSelectDiv_'+j+'" class="form-inline"><div class="form-group">';
  //newNode +='<input id="detailImgFiles_'+j+'" name="detailImgFiles" type="file" /></div>';
  //newNode +='<div class="form-group"><input type="button" value="删除" onclick="delDivRow(\'fileSelectDiv_'+j+'\')"/></div><div class="form-group">';
  //newNode +='<span id="detailImgFiles_'+j+'_span" class="sr-text highlight"></span>';
  //newNode +='</div></div>';
  //$("#newUploadTd").append(newNode); 
  var newNode2='<div class="form-inline" id="newImgDiv_'+j+'"><div class="form-group">';
  newNode2+='<textarea dataType="empty|image|*1-500" tipId="detail_span" errormsg="请输入合法的图片链接,并小于500个字符" id="newDetailImgs" name="newDetailImgs" rows="1" cols="100"></textarea>';
  newNode2+='</div><div class="form-group">  ';
  newNode2+='<input type="button" id="btn_delOld2" value="删除" onclick="delDivRow(\'newImgDiv_'+j+'\')"></div></div>';
  $("#showResultTd").append(newNode2); 
  j = j + 1; 
 }); 

 $("input[name='needRobert']").click(function(){
  var need=$('input:radio[name="needRobert"]:checked').val();
  $("tr[name='Show']").toggle(); 
  /* if(need==1){
  $("tr[name='Show']").css('display','block'); 
  }else{
  $("tr[name='Show']").css('display','none'); 
  } */
 });
 });


 </script>
</head>
<body>
 <form:form method="post" action="#" id="hiddenForm" name="hiddenForm">
 <input type="hidden" name="selectedCommodityItemNo"
  id="selectedCommodityItemNo" value="" />
 <input type="hidden" name="imgFileName" id="imgFileName" value="" />
 </form:form>

 <form:form commandName="currentCommodity" name="detailDataForm"
 id="detailDataForm" method="post" enctype="multipart/form-data">

 <div id="errorMessage"
  style="color: #ff2233; font-size: 14px; text-align: center;">
  <c:if test="${not empty errorMessage }">
  <c:out value="${errorMessage }" />
  </c:if>
 </div>
 <input type="hidden" name="searchFunctionEntry"
  id="searchFunctionEntry" value="${searchFunctionEntry}" />
 <div id="content" class=" yui-g member_">
  <legend>新建商品</legend>
  <div class="h10px"></div>
  <fieldset>
  <div class="form-inline">
   <%-- <div class="form-group">
  <input type="button" name="save_btn" class="btn btn-default toTop_o_deg btn_width_1" onclick="createNewAppointment();" value='<fmt:message key="button.save"/>' id="save_btn"/>
  </div>--%>
   <div class="form-group">
   <input type="button" id="return_btn" name="return_btn"
    class="btn btn-default" value="返回列表"
    onclick="returnToSeachFunction('${searchFunctionEntry}');" />
   </div>
  </div>
  </fieldset>

  <div class="h10px"></div>
  <table border="0" width="100%">
  <tbody>

   <tr>
   <td width="20%">
    <div class="form-inline">
    <div class="form-group">
     <label for="commodityTitle" class="sr-outer">商品标题:</label>
    </div>
    </div>
   </td>
   <td width="80%">
    <div class="form-inline">
    <div class="form-group">
     <form:textarea path="title" id="title" dataType="s1-50"
     tipId="title_span" errormsg="请输入合法字符的标题,并小于50个字符" name="title"
     rows="1" cols="100" />
    </div>
    <div class="form-group">
     <span id="title_span" class="sr-text highlight">*</span>
    </div>
    </div>
   </td>
   </tr>

   <tr>
   <td width="20%">
    <div class="form-inline">
    <div class="form-group">
     <label for="keyword" class="sr-outer">关键字:</label>
    </div>
    </div>
   </td>
   <td width="80%">
    <div class="form-inline">
    <div class="form-group">
     <form:textarea dataType="empty|s1-50" tipId="keyword_span"
     errormsg="请输入合法字符的关键字,并小于50个字符" path="keyword" id="keyword"
     name="keyword" rows="1" cols="100" />
    </div>
    <div class="form-group">
     <span id="keyword_span" class="sr-text highlight"></span>
    </div>
    </div>
   </td>
   </tr>

   <tr>
   <td width="20%">
    <div class="form-inline">
    <div class="form-group">
     <label for="commodityType" class="sr-outer">商品分类:</label>
    </div>
    </div>
   </td>
   <td width="80%">
    <div class="form-inline">
    <div class="form-group">
     <form:radiobutton path="commodityType" id="commodityType"
     name="commodityType" value="0" />
     虚拟商品   
     <form:radiobutton path="commodityType" id="commodityType"
     name="commodityType" value="1" checked="true" />
     实体商品

    </div>
    <div class="form-group">
     <span id="commodityType_span" class="sr-text highlight">*</span>
    </div>
    </div>
   </td>
   </tr>

   <tr>
   <td width="20%">
    <div class="form-inline">
    <div class="form-group">
     <label for="currencyType" class="sr-outer">货币单位:</label>
    </div>
    </div>
   </td>
   <td width="80%">
    <div class="form-inline">
    <div class="form-group">
     <!-- <form:radiobutton path="currencyType" id="currencyType" name="currencyType" value="0"/>福豆    -->
     <form:radiobutton path="currencyType" id="currencyType"
     name="currencyType" value="1" checked="true" />
     福饼

    </div>
    <div class="form-group">
     <span id="commodityType_span" class="sr-text highlight">*</span>
    </div>
    </div>
   </td>
   </tr>


   <tr>
   <td width="20%">
    <div class="form-inline">
    <div class="form-group">
     <label for="pictureLink" class="sr-outer">图片链接:<span
     id="preview_myCustImage_span"></span></label>
    </div>
    </div>
   </td>
   <td width="80%">
    <div class="form-inline">
    <div class="form-group">
     <input type="file" id="myCustImage" name="myCustImage"
     size="45" />
    </div>
    <div class="form-group">
     <input type="button" value="上传图片"
     onclick="ajaxFileUpload('myCustImage','pictureLink')" />
    </div>
    <div class="form-group">
       <span id="myCustImage_span"
     class="sr-text highlight"></span>
    </div>
    </div>
    <div class="form-inline">
    <div class="form-group">
     <form:textarea dataType="image|*1-500" tipId="pictureLink_span"
     errormsg="请输入合法图片链接,并小于500个字符" path="pictureLink"
     id="pictureLink" name="pictureLink" rows="2" cols="100" />
    </div>
    <div class="form-group">
     <span id="pictureLink_span" class="sr-text highlight">*</span>
    </div>
    </div>
   </td>
   </tr>

   <tr>
   <td width="20%">
    <div class="form-inline">
    <div class="form-group">
     <label for="totalQuantity" class="sr-outer">总人次:</label>
    </div>
    </div>
   </td>
   <td width="80%">
    <div class="form-inline">
    <div class="form-group">
     <form:input dataType="integer" tipId="totalQuantity_span"
     errormsg="总人次必须为正整数" path="totalQuantity" id="totalQuantity"
     name="totalQuantity" class="form-control" type="text"
     maxlength="6" size="6" />
    </div>
    <div class="form-group">
     <span id="totalQuantity_span" class="sr-text highlight">*</span>
    </div>
    </div>

   </td>
   </tr>

   <tr>
   <td width="20%">
    <div class="form-inline">
    <div class="form-group">
     <label for="unitPrice" class="sr-outer">最低购买注数:</label>
    </div>
    </div>
   </td>
   <td width="80%">
    <div class="form-inline">
    <div class="form-group">
     <form:radiobutton path="unitPrice" id="unitPrice"
     name="unitPrice" value="1" checked="true" />
     一元   
     <form:radiobutton path="unitPrice" id="unitPrice"
     name="unitPrice" value="10" />
     十元
    </div>
    <div class="form-group">
     <span id="unitPrice_span" class="sr-text highlight">*</span>
    </div>
    </div>
   </td>
   </tr>
   <!-- 细节图 -->
   <tr>
   <td width="20%" rowspan="2">细节图: <!-- 
   <div class="form-inline">
   <div class="form-group">
    <label for="detailImgs" class="sr-outer">细节图:  <input type="button" value="全部上传" onclick="uploadDetailImgs();" /><span id="preview_detailImgs_span"></span></label>
   </div>
   </div>
   -->
   </td>
   <td width="80%" id="newUploadTd">
    <div class="form-inline">
    <div class="form-group">
     <input type="file" onchange="fileUpload_onselect(this)"
     style="display: none;" id="detailImgFiles"
     name="detailImgFiles" /> <input type="button" value="选择图片"
     onclick="document.getElementById('detailImgFiles').click();" />
    </div>
    <div class="form-group" style="margin-left: 20px">
     <input type="button" id="btn_add2" value="增加一行" />
    </div>
    <div class="form-group">
     <span id="detailImgFiles_0_span" class="sr-text highlight"></span>
    </div>
    </div>
   </td>
   </tr>
   <tr>
   <td width="80%" id="showResultTd"><c:forEach var="tmpEntity"
    items="${currentBanner.detailImages}" varStatus="status">
    <div class="form-inline" id="oldImgDiv_${tmpEntity.index}">
     <div class="form-group">
     <textarea id="oldDetailImgs" name="oldDetailImgs" rows="1"
      cols="100">${tmpEntity.url}</textarea>
     <div class="form-group">
      <input type="button" id="btn_delOld2" value="删除"
      onclick="delDivRow('oldImgDiv_${tmpEntity.index}')">
     </div>
     </div>
    </div>
    </c:forEach>
    <div class="form-inline" id="newImgDiv_0">
    <div class="form-group">
     <textarea id="newDetailImgs" dataType="empty|image|*1-500"
     tipId="detail_span" errormsg="请输入合法的图片链接,并小于500个字符"
     name="newDetailImgs" rows="1" cols="100"></textarea>
    </div>
    </div></td>
   </tr>

   <tr>
   <td> </td>
   <td><span id="detail_span" class="sr-text highlight"></span></td>
   </tr>

   <tr>
   <td width="20%">
    <div class="form-inline">
    <div class="form-group">
     <label for="tags" class="sr-outer">标签:</label>
    </div>
    </div>
   </td>
   <td width="80%">
    <div class="form-inline">
    <c:forEach var="tmpEntity" items="${allTagList}">
     <div class="form-group">
     <label><input type="checkbox" id="selectedTags"
      name="selectedTags" value="${tmpEntity.tagId}">${tmpEntity.tagName}</label>
     <input type="hidden" name="tagName_${tmpEntity.tagId}"
      id="tagName_${tmpEntity.tagId}" value="${tmpEntity.tagName}" />
     </div>
    </c:forEach>
    <div class="form-group">
     <span id="tags_span" class="sr-text highlight">*</span>
    </div>
    </div>

   </td>
   </tr>
   <tr>
   <td width="20%">
    <div class="form-inline">
    <div class="form-group">
     <label for="tags" class="sr-outer">是否需要机器人:</label>
    </div>
    </div>
   </td>
   <td width="80%">
    <div class="form-inline">
    <div class="form-group">
     <form:radiobutton path="needRobert" id="needRobert"
     name="needRobert" value="1" />
     是   
     <form:radiobutton path="needRobert" id="needRobert"
     name="needRobert" value="0" checked="true" />
     否
    </div>
    <div class="form-group">
     <span id="unitPrice_span" class="sr-text highlight">*</span>
    </div>
    </div>
   </td>
   </tr>

   <tr style="display: none;" name="Show">
   <td width="20%">
    <div class="form-inline">
    <div class="form-group">
     <label for="tags" class="sr-outer">计划售完时间:</label>
    </div>
    </div>

   </td>
   <td width="80%">
    <div class="form-inline">
    <form:input type="number" path="planSoldTime" dataType="integer" tipId="planSoldTime_"
     errormsg="必须为正整数" class="planSoldTime_" min="0" max="9999" />
    <div class="form-group">
     <span id="planSoldTime_" class="sr-text highlight">*</span>
    </div>
    </div>
   </td>
   </tr>
   <tr style="display: none;" name="Show">
   <td width="20%">
    <div class="form-inline">
     <div class="form-group">
     <label for="tags" class="sr-outer">最大购买次数:</label>
     </div>
    </div>
   </td>
   <td width="80%">
    <div class="form-inline">
    <form:input type="number" dataType="integer" tipId="regularTriggerTotalTimes_"
     errormsg="必须为正整数" class="regularTriggerTotalTimes_" path="regularTriggerTotalTimes" min="1"
     max="10" />
    <div class="form-group">
     <span id="regularTriggerTotalTimes_" class="sr-text highlight">*</span>
    </div>
    </div>
   </td>
   </tr>

   </div>

  </tbody>
  </table>

 </div>

 </form:form>
 <div class="h10px"></div>
 <div class="form-inline">
 <div class="form-group">
  <input type="button" name="save_btn" id="save_btn"
  class="btn btn-default toTop_o_deg btn_width_1"
  onclick="createNewCommodity();" value='提交并预览' />
 </div>
 </div>


</body>
</html>

这个是html的用法不用考虑其他的就是html代码

function validateForm1(){ 
 var flag=HaHaUtil.checkFrom('detailDataForm');
 return flag;
 }

这个是from表单之前的数据校验的函数。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
javascript 网页跳转的方法
Dec 24 Javascript
dreamweaver 安装Jquery智能提示
Apr 02 Javascript
jQuery中click事件的定义和用法
Dec 20 Javascript
JavaScript多线程详解
Aug 12 Javascript
bootstrap组件之按钮式下拉菜单小结
Jan 19 Javascript
ES6学习教程之对象的扩展详解
May 02 Javascript
Vue2.0 axios前后端登陆拦截器(实例讲解)
Oct 27 Javascript
js的函数的按值传递参数(实例讲解)
Nov 16 Javascript
浅谈JS对象添加getter与setter的5种方法
Jun 09 Javascript
前后端如何实现登录token拦截校验详解
Sep 03 Javascript
vue输入节流,避免实时请求接口的实例代码
Oct 30 Javascript
微信小程序实现发微博功能的示例代码
Jun 24 Javascript
jquery 动态增加删除行的简单实例(推荐)
Oct 12 #Javascript
老生常谈javascript的类型转换
Oct 12 #Javascript
vue制作加载更多功能的正确打开方式
Oct 12 #Javascript
将form表单通过ajax实现无刷新提交的简单实例
Oct 12 #Javascript
深入理解Node.js的HTTP模块
Oct 12 #Javascript
纯js实现手风琴效果代码
Apr 17 #Javascript
JavaScript 继承详解(六)
Oct 11 #Javascript
You might like
PHP类与对象中的private访问控制的疑问
2012/11/01 PHP
php生成缩略图示例代码分享(使用gd库实现)
2014/01/20 PHP
在php中设置session用memcache来存储的方法总结
2016/01/14 PHP
PHP模糊查询的实现方法(推荐)
2016/09/06 PHP
js清除input中type等于file的值域(示例代码)
2013/12/24 Javascript
jQuery淡入淡出元素让其效果更为生动
2014/09/01 Javascript
5种处理js跨域问题方法汇总
2014/12/04 Javascript
Jquery uploadify上传插件使用详解
2016/01/13 Javascript
jQuery实现的简单分页示例
2016/06/01 Javascript
每日十条JavaScript经验技巧(二)
2016/06/23 Javascript
JS+HTML5实现的前端购物车功能插件实例【附demo源码下载】
2016/10/17 Javascript
简单理解vue中Props属性
2016/10/27 Javascript
JS 拦截全局ajax请求实例解析
2016/11/29 Javascript
js表单序列化判断空值的实例
2017/09/22 Javascript
利用Promise自定义一个GET请求的函数示例代码
2019/03/20 Javascript
点击按钮弹出模态框的一系列操作代码实例
2019/03/29 Javascript
微信小程序实现的一键复制功能示例
2019/04/24 Javascript
JavaScript使用表单元素验证表单的示例代码
2019/08/20 Javascript
JavaScript文档加载模式以及元素获取
2020/07/28 Javascript
[38:40]2018DOTA2亚洲邀请赛 4.6淘汰赛 mineski vs LGD 第一场
2018/04/10 DOTA
Django中处理出错页面的方法
2015/07/15 Python
在linux下实现 python 监控usb设备信号
2019/07/03 Python
pytorch 指定gpu训练与多gpu并行训练示例
2019/12/31 Python
Python 实现网课实时监控自动签到、打卡功能
2020/03/12 Python
Python通过两个dataframe用for循环求笛卡尔积
2020/04/29 Python
写一个函数,要求输入一个字符串和一个字符长度,对该字符串进行分隔
2015/07/30 面试题
在校生党员自我评价
2013/09/25 职场文书
保险公司年会主持词
2014/03/22 职场文书
高中课前三分钟演讲稿
2014/08/18 职场文书
王金山在党的群众路线教育实践活动总结大会上的讲话稿
2014/10/25 职场文书
求职自我推荐信
2015/03/24 职场文书
西游记读书笔记
2015/06/25 职场文书
2015高中教师个人工作总结
2015/07/21 职场文书
2016同学毕业寄语大全
2015/12/04 职场文书
教你如何使用Python Tkinter库制作记事本
2021/06/10 Python
JS前端使用Canvas快速实现手势解锁特效
2022/09/23 Javascript