jquery的ajax和getJson跨域
jQuery中的Ajax几种请求方法

jQuery确实是一个挺好的轻量级的JS框架,能帮助我们快速的开发JS应用,并在一定程度上改变了我们写JavaScript代码的习惯。
废话少说,直接进入正题,我们先来看一些简单的方法,这些方法都是对jQuery.ajax()进行封装以方便我们使用的方法,当然,如果要处理复杂的逻辑,还是需要用到jQuery.ajax()的(这个后面会说到).1. load( url, [data], [callback] ) :载入远程HTML 文件代码并插入至DOM 中。
url (String) : 请求的HTML页的URL地址。
data (Map) : (可选参数) 发送至服务器的key/value 数据。
callback (Callback) : (可选参数) 请求完成时(不需要是success的)的回调函数。
这个方法默认使用GET 方式来传递的,如果[data]参数有传递数据进去,就会自动转换为POST方式的。
jQuery 1.2 中,可以指定选择符,来筛选载入的HTML 文档,DOM 中将仅插入筛选出的HTML 代码。
语法形如"url #some > selector"。
这个方法可以很方便的动态加载一些HTML文件,例如表单。
示例代码:$(".ajax.load").load("[url]/QLeelulu/archive/2008/03/30/1130270.html[/url] .post",function (responseText, textStatus, XMLHttpRequest){this;//在这里this指向的是当前的DOM对象,即$(".ajax.load")[0]//alert(responseText);//请求返回的内容//alert(textStatus);//请求状态:success,error//alert(XMLHttpRequest);//XMLHttpRequest对象});这里将显示结果。
一、Django前后端交互之Ajax和跨域问题

⼀、Django前后端交互之Ajax和跨域问题⼀、Ajax介绍1、概述AJAX 是⼀种在⽆需重新加载整个⽹页的情况下,能够更新部分⽹页的技术。
AJAX(Asynchronous Javascript And XML)翻译成中⽂就是“异步Javascript和XML”。
即:使⽤Javascript语⾔与服务器进⾏异步交互,传输的数据为XML(当然,传输的数据不只是XML,⽐如还有JSON)。
同步交互:客户端发出⼀个请求后,需要等待服务器响应结束后,才能发出第⼆个请求;异步交互:客户端发出⼀个请求后,⽆需等待服务器响应结束,就可以发出第⼆个请求。
2、使⽤场景搜索引擎(⾕歌、百度)在⽤户输⼊某个关键字后,会出来⼀串提⽰关键字;注册页⾯,输⼊信息后,如果信息有重复或缺失,会⾃动提⽰;当我们只要修改⽹页上的部分内容时,单独局部刷新就可以做到;3、优缺点优点:AJAX使⽤Javascript技术向服务器发送异步请求;AJAX⽆须刷新整个页⾯;因为服务器响应内容不再是整个页⾯,⽽是页⾯中的局部,所以AJAX性能⾼;缺点:AJAX并不适合所有场景,很多时候还是要使⽤同步交互;AJAX虽然提⾼了⽤户体验,但⽆形中向服务器发送的请求次数增多了,导致服务器压⼒增⼤;因为AJAX是在浏览器中使⽤Javascript技术完成的,所以还需要处理浏览器兼容性问题,当然,如果使⽤jQuery的话,则不⽤考虑这个问题;⼆、通过JavaScript实现Ajax1、过程和请求相关使⽤Ajax的过程:创建核⼼对象,根据不同浏览器版本新建核⼼对象(主要原因是浏览器兼容问题);使⽤核⼼对象打开与服务器的连接(open⽅法);发送请求(send⽅法)注册监听,监听服务器响应。
(通过判断核⼼对象的就绪程度和状态码)XMLHTTPRequest关键知识点:open(请求⽅式, URL, 是否异步)send(请求体)onreadystatechange,指定监听函数,它会在xmlHttp对象的状态发⽣变化时被调⽤readyState,当前xmlHttp对象的状态,其中4状态表⽰服务器响应结束status:服务器响应的状态码,只有服务器响应结束时才有这个东东,200表⽰响应成功;responseText:获取服务器的响应体,⽂本responseXML:获取服务器的响应体,XML2、通过JavaScript实现Ajax之⽆后台交互<html><head><script type="text/javascript">function loadXMLDoc(){var xmlhttp;if (window.XMLHttpRequest){// code for IE7+, Firefox, Chrome, Opera, Safarixmlhttp=new XMLHttpRequest();}else{// code for IE6, IE5xmlhttp=new ActiveXObject("Microsoft.XMLHTTP");}xmlhttp.onreadystatechange=function(){if (xmlhttp.readyState==4 && xmlhttp.status==200){document.getElementById("myDiv").innerHTML=xmlhttp.responseText;}}xmlhttp.open("GET","/ajax/test1.txt",true);xmlhttp.send();}</script></head><body><div id="myDiv"><h2>Let AJAX change this text</h2></div><button type="button" onclick="loadXMLDoc()">通过 AJAX 改变内容</button></body></html>3、通过JavaScript实现Ajax之与后台交互通过Django实现,其实唯⼀区别就是在open的时候,把URL修改成Django的⼀个URL即可,包括GET和POST⽅法的URL。
jQuery跨域访问问题解决方法

jQuery跨域访问问题解决⽅法时间过得好快,⼜被拉回js战场时, 跨域问题这个伤疤⼜开疼了.好在,有jquery帮忙,跨域问题似乎没那么难缠了.这次也借此机会对跨域问题来给刨根问底,结合实际的开发项⽬,查阅了相关资料,算是解决了跨域问题..有必要记下来备忘.跨域的安全限制都是指浏览器端来说的.服务器端是不存在跨域安全限制的,所以通过本机服务器端通过类似httpclient⽅式完成“跨域访问”的⼯作,然后在浏览器端⽤AJAX获取本机服务器端“跨域访问”对应的url.来间接完成跨域访问也是可以的.但很显然开发量⽐较⼤,但限制也最少,很多widget开放平台server端(如sohu博客开放平台)其实就么搞的.不在本次讨论范围.要讨论的是浏览器端的真正跨域访问,推荐的是⽬前jQuery $.ajax()⽀持get⽅式的跨域,这其实是采⽤jsonp的⽅式来完成的.真实案例:复制代码代码如下:var qsData ={'searchWord':$("#searchWord").attr("value"),'currentUserId':$("#currentUserId").attr("value"),'conditionBean.pageSize':$("#pageSize").attr("value")}; $.ajax({async:false,url: http://跨域的dns/document!searchJSONResult.action,type: "GET",dataType: 'jsonp',jsonp: 'jsoncallback',data: qsData,timeout: 5000,beforeSend: function(){//jsonp ⽅式此⽅法不被触发.原因可能是dataType如果指定为jsonp的话,就已经不是ajax事件了},success: function (json) {//客户端jquery预先定义好的callback函数,成功获取跨域服务器上的json数据后,会动态执⾏这个callback函数if(json.actionErrors.length!=0){alert(json.actionErrors);}genDynamicContent(qsData,type,json);},complete: function(XMLHttpRequest, textStatus){$.unblockUI({ fadeOut: 10 });},error: function(xhr){//jsonp ⽅式此⽅法不被触发.原因可能是dataType如果指定为jsonp的话,就已经不是ajax事件了//请求出错处理alert("请求出错(请检查相关度⽹络状况.)");}});注意:$.getJSON(" http://跨域的dns/document!searchJSONResult.action?name1="+value1+"&jsoncallback=?",function(json){if(json.属性名==值){// 执⾏代码}});这种⽅式其实是上例$.ajax({..}) api的⼀种⾼级封装,有些$.ajax api底层的参数就被封装⽽不可见了.这样,jquery就会拼装成如下的url get请求http://跨域的dns/document!searchJSONResult.action?&jsoncallback=jsonp1236827957501&_=1236828192549&searchWord=%E7%94%A8%E4%BE%8B¤tUserId=5351&conditionBean.pageSize=15在响应端(http://跨域的dns/document!searchJSONResult.action),通过 jsoncallback = request.getParameter("jsoncallback") 得到jquery端随后要回调的js function name:jsonp1236827957501然后 response的内容为⼀个Script Tags:"jsonp1236827957501("+按请求参数⽣成的json数组+")";jquery就会通过回调⽅法动态加载调⽤这个js tag:jsonp1236827957501(json数组);这样就达到了跨域数据交换的⽬的.jsonp的最基本的原理是:动态添加⼀个<script>标签,⽽script标签的src属性是没有跨域的限制的。
动态script标签技术结合JSON数据交换格式解决Ajax的跨域问题

1引 言
号 、 等信息 , 成绩 可能如下
< x e s0 =“10 ? ? m1 r i n v .” >
参数 apd pi ce lr uy
说明 应用的 I D,可 以去 yh o申请,测 试可 以采用 Y h o e o ao ao D m 查询的关键字
o t t 设置返回数据格式,可设置为j n up u s 或者 x 。默认 X o ml ML cl ak a 1 c 处理返回数据所用的回调函数 1 9
siO数 组 中 。 ut ] [
当我们构建好查询 网页后 ,可以在本机上 用I E或 F e x i f 等浏 览器直 接打开该 网页并测 ro
31 S N的 定 义 .J O
< td ns su e t>
< td n> su e t
< a > 三 <nme nme张 /a >
<su e tD> 0 8 < su e tD> t d n I 2 0 01 / t d n I <g a e 8 < g a e rd > 0 /rd > <su e t /t d n > <su e t t d n>
当前多数 的 We b服务都是 采用 X 作 为 ML 数据交换格式。因此 当我们在 Aa 应用中会使 j x 用 XML t R q et 象来 访问 We H t eu s对 p b服 务 的时 候就会遇到跨域 限制问题 。 跨域问题的实质是由于浏 览器对 J ac p a Sr t v i 脚本的安全限制使得在 A a 应用中只能访 问本 j x 域 的 We b服务。我们 通常选 用的解 决方案是在 本域的服务器上建立一 个跨 域代理 ( rs — Cos Do ma rx ) 间接 的访 问第三放 We i Poy来 n b服务。但 是跨域代理需 要在本 域的服务器上运行 ,不仅 浪 费服务 器资源 ,而且也增加 了开发 和维护成 本 。如果我们在编写 We b服务 的时候放弃 X ML 作 为 数 据交 换 格式 ,而 采 用 J O (aac p S N J Sr t v i O jc N tt n数据交换格式 , bet oai ) o 那么将 能够 利用 动态建立 s i 标签的方式来规避跨域限制。 cp rt 2动态 sr t c p 标签技术 i 我们 知道 , r t 签是 属 于 H M s p标 c i T L标签 , 而H M T L标签是没有跨域限制 的。从 而我们可 以使用 s i 标签 中的 s 属性来访问其他任意 cp rt r c 域的 U L链接来获取数据。 R 文 档 对 象 模 型 ( M, ou n bet DO D c metO jc Moe)为我们 提供 了动态建立 sr t d1 ci 标签的能 p 力。我们 可以在需要 的时候使 用 dc m n e — ou e tr .e a Ee et方法来建立一个 s i 标 签对象 , tl n e m 0 cp rt 并 使 用 s Atb t 方法来 设定 它 的 s 、 、 p 、 e ti e t ru 0 r i t e cdy l g a 等属性 , a ug n e 这样 当我 们使用 a pn C i 0 p ed h d l 方 法将这个 刚刚建立 的 sr t c p 标签 添加到 网页 i 中后 ,我们就能够得到这个 sr t c p 标签 sc i r 属性 的 UR L所返回的数据 。 3J O S N数据交换格式 We 服务使 用 X 作 为数 据交换 格 式是 b ML 不能 用 sr t 签访 问 We cp 标 i b服 务并 获取 数 据 的。但如果 We b服务使用 JON作为 数据交换 S 格式就不会存在这个 问题 了。
Jquery中$.get(),$.post(),$.ajax(),$.getJSON()的用法总结

四, $复.g制et代JS码O
代码如下:
$.getJSO N("data. $("#getJ S所ON以Re调sp用o 时需要使
);
When Ajax 载入静态 页面 load( url, (dSatraing) (cMaalpl)b(a可ck (Callbac load()方 法可以轻 复制代码
代码如下:
$("#load ing").aj $(t}h)i;s).
全局事件 也 复可制以代帮码
代码如下:
$("#msg" ).before $(t}h)i.sa)j.a xSuccess $(t}h)i.sa)j.a xError(f $}()t;his).
很显然, 第 复三制个代参码
代码如下:
$.ajax({
进一步了 解 前A面JA讨X事论 的一些方 ajaxStar t(全局事 件 be)fo开re始Se n(d局部事 件 a(j全)ax局当Se事一nd 件 s(u局)cc部请es事求s 件 aj)ax请Su求cc e全ss局事件 全 e(r局局ro部的r事请 件 aj)ax仅Er当ro r
全局事件 全 c(o局局mp部的le事发te 件 aj)ax不Co管mp l全et局e事件 全 a(j全局ax局的St事请op 件 局)部当事没件 在之前的 复制代码
代码如下:
$('#ajax 这样, d复at制a.代ht码m
代码如下:
$('#ajax -
实现GET 和POST方 get( url, (dSatraing) (cMaalpl)b(a可ck (Callbac 很显然这 是一个专 复制代码
代码如下:
$.get('l ogin.pihdp
详解ajax跨域问题解决方案

详解ajax跨域问题解决⽅案今天来记录⼀下关于ajax跨域的⼀些问题。
以备不时之需。
跨域同源策略限制同源策略阻⽌从⼀个域上加载的脚本获取或操作另⼀个域上的⽂档属性。
也就是说,受到请求的 URL 的域必须与当前 Web页⾯的域相同。
这意味着浏览器隔离来⾃不同源的内容,以防⽌它们之间的操作。
解决⽅式通常来说,⽐较通⽤的有如下两种⽅式,⼀种是从服务器端下⼿,另⼀种则是从客户端的⾓度出发。
⼆者各有利弊,具体要使⽤哪种⽅式还需要具体的分析。
1. 服务器设置响应头2. 服务器代理3. 客户端采⽤脚本回调机制。
⽅式⼀Access-Control-Allow-Origin 关键字只有在服务器端进⾏设置才会⽣效。
也就是说即使再客户端使⽤xmlhttprequest.setHeaderREquest('xx','xx');也不会有什么效果。
正常ajax请求下⾯来模拟⼀下ajax⾮跨域请求的案例实现。
test1.html<!DOCTYPE html><html lang="en"><head><meta charset="UTF-8"><title>ajax 测试</title></head><body><input type="button" value="Test" onclick="crossDomainRequest()"><div id="content"></div><script>var xhr = new XMLHttpRequest();var url = 'http://localhost/learn/ajax/test1.php';function crossDomainRequest() {document.getElementById('content').innerHTML = "<font color='red'>loading...</font>";// 延迟执⾏setTimeout(function () {if (xhr) {xhr.open('GEt', url, true);xhr.onreadystatechange = handle_response;xhr.send(null);} else {document.getElementById('content').innerText = "不能创建XMLHttpRequest对象";}}, 3000);}function handle_response() {var container = document.getElementById('content');if (xhr.readyState == 4) {if (xhr.status == 200 || xhr.status == 304) {container.innerHTML = xhr.responseText;} else {container.innerText = '不能跨域请求';}}}</script></body></html>同级⽬录下的test1.PHP内容如下:<?phpecho "It Works.";>跨域请求刚才是HTML⽂件和php⽂件都在Apache的容器下,所以没有出现跨域的情形,现在把HTML⽂件放到桌⾯上,这样再次请求PHP数据的话,就营造了这样⼀个“跨域请求”了。
jQuery操作Ajax和Json

jQuery操作Ajax和Json嗯,自己学SSH和做项目也已有两个月了。
自己今天来整理一下自己在项目中利用jQuery操作过的Ajax和Json。
当时我对于jQuery操作Ajax几乎不怎么了解,但是项目中有需求,所以自己也是必须要去使用,因此现在来详细讲解一下自己在项目中的操作。
功能中,有一个下拉框,里面存储的是服务商的信息,首选项是“--请选择--”,当我选择第一个下拉框中服务商信息之后,后面紧接着将会得到这个选定的服务商下的所有产品。
做一个联动操作。
虽然我不会用jQuery操作Ajax,但是我第一反应就是想到利用这块技术,于是自己就开始查找对应的资料了。
首先,我在Action中,将服务商的信息从数据库查找出来,保存到List集合中,将集合转发到JSP界面上,利用的是struts2标签:<div><s:select name="provider.iscenicid"list="#request.providerList"listKey="i scenicid"listValue="szcenicname"headerKey=""headerValue="--请选择"onchange="onChangeOptionScenic(this)"id="scenicType"/></s:select><span id="productInfo"></span></div>(ps:其实这个里面,本不应该设置headerKey和headerValue,应该在Action中在List集合中去增加一行再进行操作。
)中间的span标签就是将要利用jQuery操作Ajax把产品信息增加到span标签里面!其次,进行jQuery操作Ajax了:<script>function onChangeOptionScenic(_this) {// 获取下拉框中的listKey值var iscenic =$(_this).val();// 设置一个变量,来进行下面的操作var htmltv ="";// 设置URL地址var url ="/tips/travelmessage.action";// Ajax操作开始$.ajax ({// 设定URLurl : url,// 设置提交方式,这里为posttype : "post",// 设置数据类型为JsondataType : "json",// 设置传过去的值的属性名data : {"iscenicid" : iscenic},// 成功返回之后的操作方法success : function(result) {// 获取Action中传回来的result的值var json =eval("("+result+")");// 循环将服务商下的产品以复选框形式拼接出来for(var i=0; i<json.length; i++) {// 将产品信息以复选框形式拼接起来htmltv +="<input type='checkbox' name='productNa me'value='"+json[i].productId+"'/>"+json[i].prod uctName;}// 添加到上面的span标签中$("#productInfo").val(htmltv);}});}</script>最后,将result进行一个映射文件的配置,配置信息如下(根据公司的一些设定而操作):<action name="travelmessage"class="com.web.system.tips.TravelMessageAction" method="trav elMessage"><result type="json"><param name="root">result</param></result></action>在TravelMessageAction中,需要将内容返回到result中,部分代码如下:List productList = travelMessageService.getProductInfo(product);JSONArray json =new JSONArray().fromObject(productList);result = json.toString();return SUCCESS;至此,一个完整的操作已完成,这就是自己的一点点整理,希望以后有更多的有技术的知识与大家分享!。
ajax传值,jQuery.ajax,json格式转化和前台后台传值

1.ajax传输用字符串,后台接收参数用request.getParameter,所以前台必须有Parameter 如"/FirstServlet/regPage?countryId=" + countryId2.后台向前台传参数通过response,PrintWriter pw = resp.getWriter();pw.print(“df”);前台接收参数用var txt = xhr.responseText;3.如果用json字符串传输前台用jQuery.ajax是如下data : {'mydata':jsonStr},jQuery.ajax({type: "post",url: url,dataType : 'json',data : {'mydata':jsonStr},success: function(data,textStatus){alert("操作成功");},error: function(xhr,status,errMsg){alert("操作失败!");}});后台一样用request如String jsonStr = ServletActionContext.getRequest().getParameter("mydata");4.后台向前台传值一样用response如pw.print(jsonList.toString());前台接收jQuery用success: function(data,textStatus)data就是一个json(自动将json字符串转化为了json)5.json与json字符串之间的转化json的格式两种:数组["hello", 12, true , null];和对象{ "color": "red", "doors" : 4, "paidFor" : true };前台:json-json字符串JSON.stringify(jsonobj);$("#form").serialize()//表单转化为json字符串json字符串-jsoneval('(' + jsonstr + ')');JSON.parse(jsonstr);使用Function对象来进行返回解析function(data,textStatus){后台:json-json字符串jsonObj.toString()json字符串-jsonJSONObject obj1 = JSONObject.fromObject("{'dsaf':'uuuu'}");JSONObject obj = JSONObject.fromObject(address);//把对象转化为json。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
很多开发人员在使用jquery在前端和服务器端进行数据交互,所以很容易会认为在前端利用jquery就可以读取任何站点的数据了。
近日在进行开发时,因为要和第三方公司的一个项目进行数据的共享,因为考虑多不占用服务器的资源,遂决定直接在html进行数据的读取,不走服务器端进行中转了。
然后正好就遇到了浏览器端跨域访问的问题。
跨域的安全限制都是指浏览器端来说的,服务器端不存在跨域安全限制的问题。
目前浏览器端跨域访问常用的两种方法有两种:
1、通过jQuery的ajax进行跨域,这其实是采用的jsonp的方式来实现的。
jsonp是英文json with padding的缩写。
它允许在服务器端生成script tags至返回至客户端,也就是动态生成javascript 标签,通过javascript callback的形式实现数据读取。
html页面端示例代码:
代码如下:
//首先要引入jquery的js包
jQuery(document).ready(function(){
$.ajax({
type : "get", //jquey是不支持post方式跨域的
async:false,
url : "/apitools/ajax_props.do", //跨域请求的URL
dataType : "jsonp",
//传递给请求处理程序,用以获得jsonp回调函数名的参数名(默认为:callback)
jsonp: "jsoncallback",
//自定义的jsonp回调函数名称,默认为jQuery自动生成的随机函数名
jsonpCallback:"success_jsonpCallback",
//成功获取跨域服务器上的json数据后,会动态执行这个callback函数
success : function(json){
alert(json);
}
});
});
服务器端示例代码,以java为例:
服务器端代码,是重点,开始以为,只要客户端通过jsonp就可以直接跨域访问,其实不然,需要服务器端的支持才行。
代码如下:
public void jsonpTest() throws IOException{
HttpServletRequest request = ServletActionContext.getRequest();
HttpServletResponse response = ServletActionContext.getResponse();
//根据html指定的jsonp回调函数的参数名,获取回调函数的名称
//callbackName的值其实就是:success_jsonpCallback
String callbackName = (String)request.getAttribute("jsoncallback");
//简单模拟一个json字符串,实际可使用google的gson进行转换,次数通过字符串拼接
//{"name":"张三","age":28}
//\是对"号进行转义
String jsonStr = "{\"name\":\"张三\",\"age\":28}";
//最终返回的数据为:success_jsonpCallback({"name":"张三","age":28})
String renderStr = callbackName+"("+jsonStr+")";
response.setContentType("text/plain;charset=UTF-8");
response.getWriter().write(renderStr);
}
jsonp的原理:
首先在客户端注册一个callback (如:'jsoncallback'), 然后把callback的名字(如:success_jsonpCallback)传给服务器端对应的处理函数。
服务器先生成需要返回给客户端的json 数据。
然后以javascript 语法的方式,生成一个function , function 名字就是传递上来的参数(jsoncallback)的值(success_jsonpCallback) 。
最后将json 数据直接以入参的方式,放置到function 中,这样就生成了一段js 语法的文档,返回给客户端。
客户端浏览器,解析script标签,并将服务器端返回的数据,作为参数,
传入到了客户端预先定义好的callback 函数(如上例中jquery $.ajax()方法封装的的success: function (json))里。
实际上跨域是通过动态增加script来加载数据,无法直接获得数据,所以需要使用回调函数。
2.使用jquery的getJson进行跨域读取数据
实际上getJson方式的根本原理和ajax使用jsonp的方式是一样的。
jquery中常用getJson来调用获取远程的数据,并通过json格式返回。
函数的原型如下:
jQuery.getJSON(url,data,success(data,status,xhr))
参数描述
url 必需。
规定将请求发送的哪个URL。
data 可选。
规定连同请求发送到服务器的数据。
success(data,status,xhr)
可选。
规定当请求成功时运行的函数。
额外的参数:
response - 包含来自请求的结果数据
status - 包含请求的状态
xhr - 包含XMLHttpRequest 对象
该函数是简写的ajax函数,实际上等价于:
代码如下:
$.ajax({
url: url,
data: data,
success: callback,
dataType: json
});
言归正传,下面我们来看如何使用getJson跨域获取数据。
html页面示例代码:
代码如下:
$.getJSON("/apitools/ajax_props.do&jsoncallback=?",
function (data) {
alert(data);
}
);
执行原理:
发送请求时需要传一个callback的回调函数名到服务器端,服务器端拿到这个回调函数名,再将返回数据用参数的形式反回到客户端,这样客户端就能够调到。
所以发送请求URL的地址后面一定要上jsoncallback=?这样的参数,jquery会将?号自动替换成自动生成的回调函数的名称。
所以最终的实际请求为:/apitools/ajax_props.do&jsoncallback=jsonp1322444422697
所以和ajax的方式想比较,也就是callback函数一个是自动生成的函数名,一个是手工指定的函数名。