jquery validate有一个方法,不过这样写代码的扩展性和维护性可想而知

2019-12-03 作者:美高梅-运维   |   浏览(169)

可以看到,各种验证规则很容易被修改和相互替换。如果某天产品经理建议字符过长的限制改成60个字符。那只需要0.5秒完成这次工作。

在处理的时候要用到replace的方法,这个方法最后结合正则表达式进行使用,也就是第一行的reg对象。

                                     hr += 12;

  alert('password不能为空');

这2句代码都是让div在1000ms内往右移动200个像素. linear就是一种策略模式的封装.

2.将时间戳转化为整数,确保万一,通过parseInt("",10)来处理。

                                                        _o.validate = function()

  },

复制代码 代码如下:nameInput.addValidata({notNull: true,dirtyWords: true,maxLength: 30})而notNull,maxLength等方法只需要统一的返回true或者false,来表示是否通过了验证。复制代码 代码如下:validataList = {notNull: function{return value !== ”;},maxLength: function{return value.length() > maxLen;}}

复制代码 代码如下:

JavaScript表单验证email,判断一个输入量是否为邮箱email,通过正则表达式实现。
//检查email邮箱
function isEmail(str){
       var reg = /^([a-zA-Z0-9_-])+@([a-zA-Z0-9_-])+((.[a-zA-Z0-9_-]{2,3}){1,2})$/;
       return reg.test(str);
}

  isEmpty:'用户名不能为空',

回忆下jquery里的animate方法.

复制代码 代码如下:

                                     {

  result.l = arr.filter(function(v){

所以更好的做法是把每种验证规则都用策略模式单独的封装起来。需要哪种验证的时候只需要提供这个策略的名字。就像这样:

validate有很多验证规则,但是更多的时候,需要根据特定的情况进行自定义验证规则。 这里就来聊一聊jquery validate的自定义验证。 j...

         position: absolute;

  }else if(password.length < 6){

策略模式的意义是定义一系列的算法,把它们一个个封装起来,并且使它们可相互替换。一个小例子就能让我们一目了然。

效果图如下:

                                     //判断是是否必填,是否有最小长度

  如上,因为希望实现的方式是简单易用、方便配置的,并且适用一些不一样的场景,所以这里只取value进行验证,不干预dom、样式,也不提供默认提示,没有跟jQuery

比如姓名框里面, 需要验证非空,敏感词,字符过长这几种情况。 当然是可以写3个if else来解决,不过这样写代码的扩展性和维护性可想而知。如果表单里面的元素多一点,需要校验的情况多一点,加起来写上百个if else也不是没有可能。

第三个参数是返回的错误提示。

         </p>

  isMobile:'手机号不正确'

再来一个例子. 上半年我写的dev.qplus.com, 很多页面都会有个即时验证的表单. 表单的每个成员都会有一些不同的验证规则.

具体如何使用呢?

</label>

  在现如今,大多数开发许多项目中,表单验证都是不可或缺的一环,比如注册、登录以及上传资料等等,但是每个人写代码的风格不一,如果没有一致而优雅的风格,没有方便的配置,代码很容易变得混乱,所以本文将用较统一的方式来实现验证。

复制代码 代码如下:$.animate( {“left: 200px”}, 1000, ‘linear' ); //匀速运动$.animate( {“left: 200px”}, 1000, ‘cubic' ); //三次方的缓动

后台验证代码:

匹配中文字符的正则表达式: [u4e00-u9fa5]
匹配双字节字符(包括汉字在内):[^x00-xff]
匹配空行的正则表达式:n[s| ]*r
匹配HTML标记的正则表达式:/< (.*)>.*|< (.*) />/
匹配首尾空格的正则表达式:(^s*)|(s*$)
匹配Email地址的正则表达式:w+([-+.]w+)*@w+([-.]w+)*.w+([-.]w+)*
匹配网址URL的正则表达式: ./?%&=]*)?

  //标记错误

案例三:ajax验证

                                                        if ( regexp1.test(_r[2]) )

  val = l.value;

jquery validate有一个方法,可以让用户来自定义验证规则。

         if(document.getElementById(this.form_id))

  {//密码

上述代码红色部分是对时间字符串进行处理,处理成2013/12/12 08:09:00这种标准格式,

                                     }

  len = l.minLength.substring(index+1);

3.将时间戳转为日期对象new Date()。

或者:

  return false;

第二个参数是真正的验证主体,它是一个函数,函数的第一个value表示调用这个验证规则的表单的值,第二个element可以用来判断是否为空,为空的时候,就不调用这个验证规则了。

    var curlen = this.length;

  msg = l.minLength.substring(0,index),

去数据库验证用户名是否存在,这个也会经常用到。

function email_test(str)
{
var i,flag=0;
var at_symbol=0;
//“@”检测的位置
var dot_symbol=0;
//“.”检测的位置
if(char_test(str.charAt(0))==0 )
return (1);
//首字符必须用字母

  isEmpty:'手机号不能为空',

$.validator.addMethod("checkUserExist",function(value,element){
                var user = value;
                $.ajax({
                    type:"POST",
                    async:false,
                    url:"/default/index/ajax/do/ajaxcheckuser",
                    data:"nick="+user,
                    success:function(response){
                        if(response){
                            res = false;
                        }else{
                            res = true;
                        }
                    }
                });
                return res;
            },"<font color='#E47068'>用户名已存在</font>");

                            var valid = true;

  {//用户名

如果数据库中存在,就返回true。

                   document.getElementById(this.form_id).onsubmit = function()

  }

复制代码 代码如下:

                   </label>

  这样会产生以下问题

1.将标准时间转化为时间戳通过Date.parse()方法来处理。

         left: 581px;

  isError = true;

复制代码 代码如下:

         else

  }

案例一:

         if (y != 0 && m != -1 && d != 0)

  //验证为空

其实跟jquery validate固有的验证规则使用是一样的。

code {

  break;

图片 1

                   }

  //验证最大长度

如上所示,加粗的地方就是使用的方法,一共用了三个验证规则,一个是必须,一个是数字,一个是自定义验证规则。

                   o.style.zindex = 100;

  if(!rules.maxLength(val,len)){

转为对象之后,就能够比较时间大小了,直接判断,如果结束时间小于开始时间,就进行错误提示。

<style>
@media print {
   * { display: none }
}
</style>

  value:phone,

这个时候可以通过jquery validate 自定义一个验证方法,进行验证。

                            m = a[i]-1;

  代码不利于重复使用,直接复制过来,改动较大。

复制代码 代码如下:

                                     //添加长度验证函数

  //假设接收到的验证数据是data

 <tr bgcolor="#f7f7f7"  height="43" align="right">
                        <td class="font14_s pdr_12 grey_70">总分:</td>
                        <td class="font14_s pl40" align="left"><input type="text" id="fullscore" name="fullscore" style=" margin-left: 10px; margin-right: 2px;" value="<!--{$aExams.fullscore}-->" class="required number isPositive input_233" /></td>
                    </tr>

{

  }

图片 2

         <h1>vForm1.0beta</h1>

  因为很多验证场景都是类似的,所以我们可以把规则提取出来,统一管理,也方便后续的增加或修改。

这里就来聊一聊jquery validate的自定义验证。

<span style="color:#f00">必填项目</span>',20);

  break;

$.validator.addMethod("compareDate",function(value,element){
                var assigntime = $("#assigntime").val();
                var deadlinetime = $("#deadlinetime").val();
                var reg = new RegExp('-','g');
                assigntime = assigntime.replace(reg,'/');//正则替换
                deadlinetime = deadlinetime.replace(reg,'/');
                assigntime = new Date(parseInt(Date.parse(assigntime),10));
                deadlinetime = new Date(parseInt(Date.parse(deadlinetime),10));
                if(assigntime>deadlinetime){
                    return false;
                }else{
                    return true;
                }
            },"<font color='#E47068'>结束日期必须大于开始日期</font>");

         width: 170px;

  minLength:'密码长度不小于6位&6',

case 'ajaxcheckuser':
                $nick = trim($this->_getParam('nick'));
                if(isset($nick)){
                    $where['lx_user.nick = ?'] = array('type'=>1,'val'=>$nick);
                    $aUser = $daoUser->getUser($where);
                    if(count($aUser)>=1){
                        echo TRUE;
                    }else{
                        echo FALSE;
                    }
                }else{
                    echo FALSE;
                }
                break;

                   vform.rules.add('least10',10,'any','您必须至少填写10个

  return value.length >= length;

这个方法有三个参数,第一个参数表示验证规则名称,这里是isPositive,表示是否为正数。

                                                                 if (regexp2.test(_s2))//是一个标志符,整数 或者变量

  isMobile:function(value){

方法如下:

                                                        b = b && (this.maxLength >= this.value.length );

  lens = list.length,

//自定义验证
            $.validator.addMethod("isPositive",function(value,element){
                var score = /^[0-9]*$/;
                return this.optional(element) || (score.test(value));
            },"<font color='#E47068'>请输入大于0的数字</font>");

<span style="color:#f00">必填项目</span>',100);

  isEmpty:function(value){

通过addMethod用户可以自定义自己的验证规则

         top: 375px;

  综上,表单验证的过程应该是简单,方便复用,并且易于配置的,因为UI设计师的设计风格往往不是单一的,所以我们还希望它是灵活的,能适应一些不太一样的场景,下面将详细介绍一种方式来实现。

替换完了之后,如果比较时间呢?要进行三个处理,

         {

  arr[i] = l.isMobile;

这个时候compareDate就可以像其他的jquery validate验证规则一样验证了。

Date.parseDate = function(str, fmt) {

  arr = [],

jquery validate有很多验证规则,但是更多的时候,需要根据特定的情况进行自定义验证规则。

               <li>一项输入与另一项输入比较(例如:密码的确认输入)</li>

  如何实现良好的调用方式是很重要的,将直接影响到我们代码的风格,还有是否方便复用,这一点可以借鉴npm中的package.json,需要什么,就配置什么,想象每条规则都是一个模块,我们要做的就是把模块配置进来。

案例二:

if (str_len!= 27)
{
alert("请输入英文大写字母a-z和1-9数字。如:dbdg43-byeiy2-mal3k5-re34y1");
return false;
}
for(i=0;i<=str.length;i++)
{
ch = str.charcodeat(i);
if(!(ch>=65 && ch<=90) || !(ch>=49 && ch<=57)|| !(ch==45))
{
alert("请输入英文大写字母a-z和1-9数字。如:dbdg43-byeiy2-mal3k5-re34y1");
return false;
}
}
return true;
}
</script> 响应者 1:不能用正则吗? 响应者 2:<script language="javascript">
function testcontain(inputstr){
var reg1=/*/g;
var reg2=/*/g;
var reg3=/-*/g;
inputstr=inputstr.replace(reg1,"");
inputstr=inputstr.replace(reg2,"");
inputstr=inputstr.replace(reg3,"");
if (inputstr.length>0) alert("出现以下不允许输入的内容:n"+inputstr)
}
</script>
<input type=text value="1w@a" name="txt1">
<input type=button onclick="testcontain(txt1.value)" value="测试"> 响应者 3:<script language=javascript>
function check()
{

  var list = data,

表单提交时,经常会需要对日期进行验证,比如结束时间必须大于开始时间。

这个用来验证http地址。

  if(l.isMobile){

<a href="javascript:
location.replace(url)">

  for(var i=0;i

只能是英文,好简单吧,用的就是正则,javascript验证英文的正则表达式

  通过上面的配置,便可以在函数中取得验证数据,接下来与规则库相匹配,并返回错误信息,这样就能实现整个验证过程。

               <li>字符长度检查</li>

  }

                                               }

  {//手机号

         left: 671px;

  代码中if else过多,如果验证规则比较多,将会占用很长的篇幅,并且看起来比较混乱。

<FORM METHOD=POST ACTION="">
<input type="password" id="input1">
<input type="password" id="input2">
<input type="button" value="test"
onclick="check()">
</FORM>

  //最小长度

         {

  },

         top: 100px;

  //如果验证失败,check设置为false,并且返回一条错误信息

         color: #000;

  }

vform.init= function()

  maxLength:function(value,length){

         overflow:visible;

  1,建立一个规则库

                   </label>

  //用一个数组接收错误信息

(2)应用:javascript中没有像vbscript那样的trim函数,我们就可以利用这个表达式来实现
String.prototype.trim = function()
{
return this.replace(/(^s*)|(s*$)/g, "");
}
(3)应用:利用正则表达式分解和转换IP地址
function IP2V(ip) //IP地址转换成对应数值
{
re=/(d+).(d+).(d+).(d+)/g //匹配IP地址的正则表达式
if(re.test(ip))
{
return RegExp.$1*Math.pow(255,3))+RegExp.$2*Math.pow(255,2))+RegExp.$3*255+RegExp.$4*1
}
else
{
throw new Error("Not a valid IP address!")
}
}
(4)应用:从URL地址中提取文件名的javascript程序
s="";
s=s.replace(/(.*/){0,}([^.]+).*/ig,"$2") ; //Page1.htm
(5)应用:利用正则表达式限制网页表单里的文本框输入内容
用正则表达式限制只能输入中文:onkeyup="value="/blog/value.replace(/["^u4E00-u9FA5]/g,'') " onbeforepaste="clipboardData.setData('text',clipboardData.getData('text').replace(/[^u4E00-u9FA5]/g,''))"
用正则表达式限制只能输入全角字符: onkeyup="value="/blog/value.replace(/["^uFF00-uFFFF]/g,'') " onbeforepaste="clipboardData.setData('text',clipboardData.getData('text').replace(/[^uFF00-uFFFF]/g,''))"
用正则表达式限制只能输入数字:onkeyup="value="/blog/value.replace(/["^d]/g,'') "onbeforepaste= "clipboardData.setData('text',clipboardData.getData('text').replace(/[^d]/g,''))"
用正则表达式限制只能输入数字和英文:onkeyup="value="/blog/value.replace(/[W]/g,"'') "onbeforepaste="clipboardData.setData('text',clipboardData.getData('text').replace(/[^d]/g,''

  if(l.isEmpty && rules.isEmpty(val)){

         position: absolute;

  2,良好的调用方式

{

  //...

<META HTTP-EQUIV="imagetoolbar" CONTENT="no">

  //验证手机号

           ,然后可以写一个函数设置表单名称,验证规则,<code>function start()

  var index = l.minLength.lastIndexOf('&'),

                                               d = m+1;

  return value == '';

         this.init = function(dis)

  break;

                            {

  //其他

         var _i = /^[-+]?d+$/;

  length:function(value,min,max){

onsubmit=”return domainname.value==”?(alert(’请输入搜索内容’),false):true;”

  return value.length >= min && value.length <= max;

                   <input name="r_pass0" type="text" class="text_input" id="r_pass0" title="输入您希望的密码 " />

  如果平常的代码不加整理,大概会如下:

         if (isNaN(y)) y = today.getFullYear();

  arr[i] = l.isEmpty;

JavaScript正则验证字符串是否为空
用途:检查输入字符串是否为空或者全部都是空格
输入量是一个字符串:str
返回:如果输入量全是空返回true,否则返回false

  },

                                                                 _s2 = _s0.replace(regexp1,'');

  //规则库

                            d = a[i];

  var l = list[i];

{

  maxLength:'密码长度最大12位&12',

         {

  return v;

                            }

  return value.length <= length;

               <li>大小比较(只能有一个比较符号)</li>

  return /(^1[3|5|7|8|9][0-9]{9}$)/.test(value);

         _S = _d.getSeconds();

  },

         var a = str.split(/W+/);

  }

          <li>时间日期</li>

  3,验证的逻辑过程

         return today;

图片 3

             <h3>验证:</h3>

  value:password,

          <li>兼容性好(ie5,6 firefox,oprea)。</li>

  isError = true;

         <p>

  耦合性较强,不利于维护,无论是增加还是删除都要小心。

         _Y =_d.getFullYear();

Validate等一些验证插件一样,直接与dom元素绑定在一起。

                                                       

  return result;

                                                        break;

  //返回

         top: 463px;

  })

<img galleryimg="no">

  ...

                   //获取表单

  }

         }

  //是否为空

// 检查是否为中文
function isChn(str){
      var reg = /^[u4E00-u9FA5]+$/;
      if(!reg.test(str)){
       return false;
      }
      return true;
}

  break;

                            return valid;

  if(l.minLength){

                            <option value="2">2000</option>

  if(error){result.check = false;}

         <p> </p>

  //其他

与其他程序不一样的是:我对http地址与日期格式地址的处理不同,填入的地址没有

  return false;

         background: #33CCFF;

  ...

<script>
function check()
{
with(document.all){
if(input1.value!=input2.value)
{
alert("false")
input1.value = "";
input2.value = "";
}
else document.forms[0].submit();
}
}
</script>

  if(l.maxLength){

         this.hide = function()

  minLength:function(value,length){

         return url.test(tmpStr);

  }

<script language="javascript">
<!--
function CheckForm()
if (document.form.PWD.value != document.form.PWD_Again.value) {
   alert("您两次输入的密码不一样!请重新输入.");
   document.ADDUser.PWD.focus();
   return false;
}
   return true;
}
-->
</script>

  var index = l.maxLength.lastIndexOf('&'),

                                                                           _o.equal = _el;

  }

注:在body标签里加上onbeforeunload="javascript:return false"(使不能关闭窗口)

  value:username,

                                     {

  if(!rules.minLength(val,len)){

                   <input name="r_pass1" type="text" class="text_input" id="r_pass1" title="将密码确认一次" />

  msg = l.maxLength.substring(0,index),

                                                        }

  return false;

JavaScript表单验证自定义内容,这个比较好,可以自由定制输入项的内容来用JavaScript进行验证,下面demo中是表单项只能为数字和"_",同样您可以进行扩展来达到您想要的目的。用于电话/银行帐号验证上,可扩展到域名注册等

  arr[i] = msg;

    return this.length;

  //定义一个返回对象

                                     {

  }

function isNull( str ){
if ( str == "" ) return true;
var regu = "^[ ]+$";
var re = new RegExp(regu);
return re.test(str);
}

  if(username == ''){

                                     }

  },

<input type='TEXT' onKeyPress="if(event.keyCode==13){if(isNaN(this.value))alert('不是数值')};">

  }else if(password == ''){

}

  var rules = {

匹配双字节字符(包括汉字在内):[^x00-xff]
评注:可以用来计算字符串的长度(一个双字节字符长度计2,ASCII字符计1)

  result = {check:true},

//表单元素.validate

  isError = true;

                                                        {

  //长度

验证规则参数:

  isEmpty:'密码不能为空',

匹配空白行的正则表达式:ns*r
评注:可以用来删除空白行

  arr[i] = msg;

         <p>

  if(!rules.isMobile(val)){

JavaScript验证表单项不能为空,这个可是很常用的哦,比如在验证表单里面的用户名不能为空等等,代码如下<s
cript  language="javascript">
<!--
function  CheckForm()
{  
if  (document.form.name.value.length  ==  0)  {  
alert("请输入您姓名!");
document.form.name.focus();
return  false;
}
return  true;
}
-->
</script>

  len = l.maxLength.substring(index+1);

<span style="color:#f00">必填项目</span>',20);

  }

                       case "%P":

  }

                                                                 {

  },

                   vform.init();

  //验证最小长度

                            _r = this.rules[i]

  //最大长度

                            break;

  //是否是手机号码

                                                        break;

  alert('username不能为空');

                            d = parseInt(a[i], 10);

  isError = true;

                   //验证规则,逐条填写

  isError = false;

匹配特定数字:
^[1-9]d*$    //匹配正整数
^-[1-9]d*$   //匹配负整数
^-?[1-9]d*$   //匹配整数
^[1-9]d*|0$  //匹配非负整数(正整数 + 0)
^-[1-9]d*|0$   //匹配非正整数(负整数 + 0)
^[1-9]d*.d*|0.d*[1-9]d*$   //匹配正浮点数
^-([1-9]d*.d*|0.d*[1-9]d*)$  //匹配负浮点数
^-?([1-9]d*.d*|0.d*[1-9]d*|0?.0+|0)$  //匹配浮点数
^[1-9]d*.d*|0.d*[1-9]d*|0?.0+|0$   //匹配非负浮点数(正浮点数

</form>

                            break;

 

     return _p;

                                               case 'date':

                    while(el=el.offsetParent)

}

         var tmpStr = this;

                                                                 this.tip.hide();

         fmt = fmt||"%Y-%m-%d %H:%M";

                                                        var regexp1 = /^\(==|!=|>=|<=|>|<)/;

         font-size: small;

                                                        _o.validate = function()

        //this[curlen] = [ 0 ,    1    ,    2   ,   3  ,   4  ,  5 ,   6  ];

         {

                                                        _o.validate = function()

匹配中国邮政编码:[1-9]d{5}(?!d)
评注:中国邮政编码为6位数字

           {

                   for(var i = 0 ;i< this.rules.length;i++)

         filter:progid:DXImageTransform.Microsoft.Shadow(color=#111111,direction=135,strength=3);

                                                        {

         padding:5px;

<script language="JavaScript">
var str1 = "求一个比较字符串处理功能";
var str2 = "求两或三个比较字符串处理";
var re = new RegExp("(?=.*?)[^" + str1 +"](?=.*?)|(?=.*?)[^" + str2 + "](?=.*?)", "g");
var arr;
while ((arr = re.exec(str1 + str2)) != null)
{
   document.write(arr);
}
</script>

function spchar_test(chr)
//数字和特殊字符检测函数
{
var i;
var spch="_-.0123456789";
for (i=0;i<13;i++)
  if(chr==spch.charAt(i))
  return(1);
return(0);
}

匹配身份证:d{15}|d{18}
评注:中国的身份证为15位或18位

JavaScript屏蔽关键字,大概的思路就是去用javascript去替换已有的文本,达到替换的目的<script language="javascript1.2">
function test() {
if((a.b.value.indexOf ("***") == 0)||(a.b.value.indexOf ("****") == 0)){
alert(":)");
a.b.focus();
return false;}
}
</script>
<form name=a onsubmit="return test()">
<input type=text name=b>
<input type="submit" name="Submit" value="check">
</form>

                   }

JavaScript屏蔽网站的打印功能

                                                                 this.tip.show();//显示错误信息

这段javascript代码很简洁,大家可以看下。

         font-family: Verdana, Arial, Helvetica, sans-serif;

                            }

//字符串验证扩展

         if (isNaN(d)) d = today.getDate();

                            if (/pm/i.test(a[i]) && hr < 12)

         <h2>使用方法</h2>

         </p>

JavaScript验证两次输入密码是否相同,
通过去判断两次输入的密码是否相同来实现,
下面是html代码

  • 0)
    ^(-([1-9]d*.d*|0.d*[1-9]d*))|0?.0+|0$  //匹配非正浮点数(负浮点数
  • 0)
    评注:处理大量数据时有用,具体应用时注意修正

                   *

         var y = 0;

                                                                 _el = _r[2].substring(1);

                   <label for="frm_sel">选择:

JavaScript屏蔽拷屏,不断地清空剪贴板
在body标签里加上

         width: 24em;

                       case "%I":

                                               _o.minLength = parseInt(_r[1]);

                                                        }

                       case "%y":

         //验证规则,逐条填写

div.info {

                                     else

<script language="javascript">
function check(obj){
if(event.keyCode == 13 || event.keyCode == 46)
return true;
if(event.keyCode < 48 || event.keyCode >57)
return false;
else
return true;
}
</script>
<input type="text" name="textfield" onkeypress="javascript:return check(this);" />

                   vform.rules.add('dateinput',0,'date','请按2000-03-05 的格式输入日期。<br /><span style="color:#f00">必填项目</span>');

body {

                   if (!a[i])

                                                        {

         var i = 0, j = 0;

         border:1px solid #0099cc;

</style>

                   vform.rules.add('myweb',1,'url','请您按照 的格式输入您的网址。<br /><span style="color:#f00">必填项目</span>');

                   {

         var email = /^w+([-+.]w+)*@w+([-.]w+)*.w+([-.]w+)*$/;

                                                        break;

                                                                                             {

                                     _o = this.elements[i];

                   return (_Y + '-'+_s[0]+'-'+_s[1]+' '+_s[2]+':'+_s[3]+':'+_s[4])

<script language="javascript">
<!--
window.open(www.32pic.com,"32pic","fullscreen=3,height=100,
width=400, top=0, left=0, toolbar=no, menubar=no,
scrollbars=no, resizable=no,location=no, status=no");
-->
</script>

<head>

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

<body onload="start()">

                   vform.rules.add('ok100',1,'any','这里被限制为100个字符<br /><span style="color:#f00">必填项目</span>',100);

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" ";

本文由美高梅赌堵59599发布于美高梅-运维,转载请注明出处:jquery validate有一个方法,不过这样写代码的扩展性和维护性可想而知

关键词: