• 关于

    处理ajax请

    的搜索结果

回答

步骤1 首先打开ajax-comment-pager文件夹里的ajax-comment-pager.php文件,这个文件就是整个插件的核心。我们可以看到细心的MG12对插件的每一个模块都做了注释。 我们要做的是先分析这个插件是怎么运行的,程序结构是怎样的。 下面解释一下各个模块的作用: l10n:提供插件的本地化语言,在整合是可以忽略; options:用于配置插件参数; AJAX function:处理AJAX请求,并返回相应的结果,核心中的核心; add to WordPress:加载插件运行所需的JS脚本和CSS样式文件。 到这里,插件的运行机制已经呼之欲出。 首先由add to WordPress加载所需的文件->在点击评论翻页时发出AJAX请求->AJAX function模块获取options里的参数,处理AJAX请求并返回结果->add to WordPress事先加载的脚本把AJAX function返回的结果插入到评论列表位置。 步骤2 在充分了解插件的结构以后,我们开始提取所需的代码,先把cpage_ajax和commentpager_head改名,我给这两个函数名同意加上了“bolo_”前缀。这一步是为了避免和原来的插件产生冲突,改名的方法推荐先复制原来的函数名,改名后用新函数名全部替换原函数名。 接下来把ajax-comment-pager.css和ajax-comment-pager.js复制到主题文件夹里。水平高一点的童鞋们,在这一步就可以整合css和js文件了,如果你不会整合这两个文件则需要在主题的header.php里加载这两个文件,并且在加载ajax-comment-pager.js前需要先输出以下代码: <script type="text/javascript">//< ![CDATA[ var ajaxCommnetsPagerCommentsId = "thecomments" //thecomments是评论列表的ID,请根据自己的主题自行修改 var ajaxCommnetsPagerAjaxLoader = "Loading..." //]]></script> 步骤3 把 AJAX function 模块的所有代码复制到主题的functions.php里,我们还需要修改一下。 我们的目的是直接把最适合我们主题的参数整合进去,所以options,callback method name 和 type 这几部分都可以删去,并充新补上$callback和$type这两个变量。 $callback是自定义评论样式的名字,一般是custom_comment,请自行查看主题配置。 $type是翻页是需要显示的内容,只显示评论则是&type=comment,只显示pingback则是&type=pings,两者都显示则留空。 在这里我设置为: $callback = 'custom_comment'; //我的主题里评论样式名为custom_comment $type = '&type=comment'; //只显示评论 步骤4 在打开comments.php,在合适的地方加上: <span id="cp_post_id">< ?php echo $post->ID; ?></span> 如果你不知道什么地方是“合适的地方”,那就把这句代码加到任一个前吧。

小旋风柴进 2019-12-02 01:59:33 0 浏览量 回答数 0

问题

基于Apache Nutch和Htmlunit的扩展实现AJAX页面爬虫抓取解析插件 请求报错

kun坤 2020-05-28 16:03:29 4 浏览量 回答数 1

回答

ajax是异步的.不是说全发完才收到信息, 仅仅发送,很快的给你造成了这种错觉~~量大了肯定你就能看出来了. 第一个发的,不一定是第一个回来的... ######以为浏览器同时能发出的请求是有限制的。过去IE6时代同时只能发起两个请求。现代浏览器这个数值大大提高了,但还是有的###### 前端需要循环的发送ajax请使用闭包方式把。。。 for ( var i = 0 ; i < 3 ; i ++) { ( function ( n ) {       $.ajax... })( i ); } ######每个请求后台都是个线程,请求越多,请求处理线程之间的切换等待就越频繁,CPU忙不过来,就有可能请求乱序了###### ajax是异步的,第一个发送出去的,不一定是第一个收到返回结果的。如果你要控制发送的顺序,第一个返回后再发第二个的话,你要使用闭包+jquery的queue这个东东结合起来。 不知道,你是不是想做成这样的效果?###### @ syj52417 分别回答你的1和2: 问题1,ajax请求变多时,网络会慢慢变得堵塞,服务器的压力也越来越大,综合起来,越往后收到响应的时间当然越长。就好比12点大家陆续去餐厅吃饭,餐厅越来越堵,厨房越来越繁忙,越往后去的人吃到饭的时间越长。 问题2, 因为你的例子里面,发的请求太少,给你产生错觉“以为所有的请求发完了,才会收到响应”,如果你不信你可以发1000个甚至更多的ajax试试看,肯定没等到发完,就收到响应了。这里主要解释一下ajax“异步”: ajax是异步的,就是说 程序不会阻塞地等待响应(响应回来后,会主动打个报告,然后进入success回调里面,悄无声息地执行先前的代码 ),就是说一个请求发出去后,你就可以继续干别的事了,在你这里就是继续循环发下一个ajax请求。假设服务器处理一个ajax请求需要1秒,浏览器发出一个ajax请求需要0.01秒,那么你至少可以发完100个ajax请求,然后才会异步收到第1个ajax请求的响应...

优选2 2020-06-09 15:09:56 0 浏览量 回答数 0

阿里云高校特惠,助力学生创业梦!0元体验,快速入门云计算!

学生动手场景应用,快速了解并掌握云服务器的各种新奇玩法!

回答

1、关于问题1,如果是html5技术可以使用websocket,否则可以使用ajax轮询,请google ajax comet2、这个可以通过js控制css来实现,或者使用css3的动画3、不清楚你说的这个问题是想要处理什么,统计什么

小旋风柴进 2019-12-02 02:19:19 0 浏览量 回答数 0

问题

struts2 ajax json问题,请求高手指点?报错

爱吃鱼的程序员 2020-06-22 21:40:16 0 浏览量 回答数 1

问题

请求PYTHON的WEB微框架BOTTLE处理AJAX的问题? 400 报错

爱吃鱼的程序员 2020-06-04 16:30:03 1 浏览量 回答数 1

回答

ajax跨域不是浏览器的限制吗,为什么后台可以解决呢?######回复 @大河向东流啊 : 关键是你的ajax跨域请求就到不了后台######如果你把项目做出来而这个功能有浏览器的限制,那用户知道怎么办吗,难道用户要处理浏览器的限制吗?显然是不可能的,后台处理了就不必管浏览器了###### 添加架构师交流圈,请加微信号 codingcx,也可以添加java技术交流QQ群号318815519,大家一起快乐交流技术,互相学习分享。

爱吃鱼的程序员 2020-05-31 13:07:05 0 浏览量 回答数 0

回答

ajax跨域不是浏览器的限制吗,为什么后台可以解决呢?######回复<aclass="referer"target="_blank">@大河向东流啊:关键是你的ajax跨域请求就到不了后台######如果你把项目做出来而这个功能有浏览器的限制,那用户知道怎么办吗,难道用户要处理浏览器的限制吗?显然是不可能的,后台处理了就不必管浏览器了###### 添加架构师交流圈,请加微信号 codingcx,也可以添加java技术交流QQ群号318815519,大家一起快乐交流技术,互相学习分享。

优选2 2020-06-09 15:44:27 0 浏览量 回答数 0

回答

ajax异步的,单单settimeout不行,得获取返回之后ajax递归###### 频繁轮询用webSocket比较好 ###### 后台:xls 文件处理逻辑 public Map updateFile(){ map= new hashmap(); int count = xls.count(); for(int i=0;i<count;i++){ //处理每一条数据 session.setAttribute("上传进度百分比",(int)((i+1+0.0)/count*100)); } return map; } 后台:/abc/a  public Map getJd(){ map = new hashmap(); map.put("data",session.getAttribute("上传进度百分比")); return map; } 前台js: var id = setInterval(function(){ $.post('/abc/a',function(d){ //d是json:返回0-100的数字 var data=d.data; 进度条对象.set进度(data); if(data==100){ 进度条对象.close(); clearInterval(id); } }); },500); ######回复 @blue_think : servlet 3.0有异步请求######回复 @blue_think : 我不同意你的说法,请看我对这个回复的引用。######session和cookies关联。之前试过如果程序没处理完,session根本获取不到,能获取到的时候已经100%了。所以如果不是用flush强制输出,不然就是进度存到数据库,或者写入到实际文件中。###### 刚好今天写了一个。 我需要检测核销订单的状态(数据库),然后页面上进行相应的变化。 //ajax短轮询获取后台核销的状态 function getStates(){ jQuery.ajax({ type: "POST", url: "#springUrl('/microVerification/getStates.in')", data: { orderNo: "$!order.orderNo", }, dataType: "json", success: function (data) { if(data.result == "already"){ //检测到已核销 $("#yet").hide(); $("#already").show(); return; }else if(data.result == "yet"){ //检测到未核销,继续调用 setTimeout(function () { getStates(); }, 5000); }else{ //出错了 } }, error: function () { //alert("没有订单"); } }); } ######setTimeout  ###### 不知道你这个处理程序一般是多长时间。 你可以在后台处理数据,程间隔一段时间flush()一次处理结果到客户端,只到全部处理完成再response.end()掉这个链接。 客户端用xmlhttprequest监听onreadystatechange事件,获取xmlhttprequest的readystate,为3的时候就可以开始不断的获取到responseText的数据(实时,但是不一定是完整的)。 比如你的后台每次这样flush进度。第一次"1,",第二次"2,",第三次"3,"。这样客户端三次readystatechange获取的结果就是: 第一次 "1," 第二次 "1,2," 第三次 "1,2,3," 以此类推。 但是这样又有一个缺点就是,这个http连接可能会被浏览器本身关闭,因为早期的一些ie浏览器,会忽略keep-alive这个头,大约1分钟就自己关了,所以如果你的处理时间很长,比如要几分钟的话,这个方案可能就不是很合适。 ######这个不难,后台程序要将当前进度放到session中,Ajax定时去获取进度并显示;达到100%时要在session中保持一定时间(一般是启动一个Timer任务定时删除),以在下次Ajax获取时再自动删除掉这个session数据或者达到定时时间时自动删除session数据(避免内存泄漏),后者是防止前台离开或刷新页面而停止了Ajax请求。###### 假设你的上传Excel, 以及解析Excel都是ok的。 当程序一条条插入数据库时,正常情况下这个时间间隔是非常非常短的也就几毫秒(不排除当时连接数据库很慢很慢)。假设你页面ajax每一秒去轮训一下这个状态, 正常情况下, 你拿到的这个状态值也就处理完了。 所以这种显示百分比也就骗骗人了! ######回复 @Solid : 优化一下的话,就把list变成count,一个是100,一个从0开始。######赞同,百分百就是骗人的,千万别为了这个而浪费大好时光。 从Excel里取出数据,定义两个变量(list)到session,一个记录初始化时的条数,另一个List设置为空,在插入数据库时往这个List里也插入一条数据,Ajax请求不要操作数据库,直接访问两个List的size的比值,这个比值就是进度条数据了。###### 进度条都是假的~也就是用户体验好些而已。。 跟分页类似,首先先要获取数据多少条,一次导入多少条。。比如:1000/100 = 10 把进度条分10份,ajax一次,传page。后台根据page导入。导入成功,页面相应,进度条走1,ajax传page+1 ######楼上的可以试试. 

kun坤 2020-06-07 22:00:05 0 浏览量 回答数 0

回答

ajax跨域请求浏览器是不允许的哦~ 当然你可以尝试使用 jQuery中 $.getJSON()方法加载其它网域的数据,具体操作请参见jquery API ######回复 @布谷鸟 : 可以跨域,就是利用jquery中的ajax函数就行,但是确实要设置jsonp类型.######回复 @索隆 : 嗯######回复 @布谷鸟 : getJSON方法能返回不是json的数据吗?貌似它只是能通过jsonp完成吧######回复 @索隆 : 谢嘛呀,凑巧会这会一点也不知道能不能帮到你######谢谢!!!!######ajax不能跨域######我如何才能进行跨域请求###### jsonp 跨于请求一般用的是 jsonp  还有iframe ######回复 @小囧 : 弄明白了,谢谢!!######回复 @小囧 : http://ditu.google.cn/maps/geo?q=china&output=csv我只想要获取它的经纬度信息######回复 @小囧 : 不行,那是别人的网站######可以丢后端服务器去处理不?######但是他是要服务端和客户端合作,但是我是要获取的一个第三方数据源,我对它不可控..怎么办?###### ajax不能跨域,你可以自己写一个后台,通过java跨域访问,然后将数据返回给自己的页面。 这样,你的页面只需要ajax请求自己项目的java方法,来得到其他网站的相关数据。

kun坤 2020-05-29 23:22:58 0 浏览量 回答数 0

问题

jquery回车提交表单

a123456678 2019-12-01 20:24:47 987 浏览量 回答数 1

问题

文件上传与数据库是怎么设计的?

a123456678 2019-12-01 20:16:29 1221 浏览量 回答数 1

问题

用php如何实现类似于登录人人网后弹出的提示信息功能?

落地花开啦 2019-12-01 19:51:50 962 浏览量 回答数 1

回答

你在最后一个else里打断点,看是不是走的最后一个chain,目测是你session状态判断的问题。######断点都打了,不好用,关键刷新页面就可以,就这个区别,代码执行逻辑是一样的###### sendRedirect的时候括号里的request请写错了吧######回复 @两江总督是码农 : 那个requesth 是HttpservletRequest 没有错啊######你看,写错了######没有,那个子类###### 你那个是个Ajax请求,服务端和客户端都要处理,服务端判断是Ajax请求就返回未登录的状态码要求客户端转向登录页,客户端在error里,判断状态码是没有登录,就把页面转向登录页######恩,是的!多谢解答啊

爱吃鱼的程序员 2020-06-01 14:32:43 0 浏览量 回答数 0

回答

尝试添加JSON.stringify(result)以将JS对象转换为JSON字符串。 从您的代码中,我可以看到您正在记录AJAX请求失败时error调用的结果,因此我不确定如何访问id / name / etc。然后(您正在检查错误情况下是否成功!)。 请注意,如果您使用Chrome浏览器的控制台,则无需对JSON进行字符串化处理即可浏览该对象,这使调试更加容易。

保持可爱mmm 2020-02-08 19:04:15 0 浏览量 回答数 0

问题

ajax实现DropDownList的更新,但是点击 按钮控件时出错,为什么??报错

爱吃鱼的程序员 2020-06-22 19:26:45 0 浏览量 回答数 1

问题

【精品问答】前端开发必懂之JS技术二百问

茶什i 2019-12-01 22:05:04 146 浏览量 回答数 0

回答

参数不做json处理试下呢###### 不做json处理也不行呢,还是一样报400错误,如下,,就是后台那里加上@RequestBody之后才报的,不加的话,就没报,但这个情况json格式传过去的参数后台那边就接收不到  ###### 可以试试看看报文有没有价值的东西看.只显示400那就不是runtime error,在spring里多打几个log看看情况吧######ajax增加一个属性,processData: false###### 400的错误一般都是数据绑定不上导致的,看下你的数据类型吧,如果密码是int类型,那么请使用Integer类型 springmvc对基础数据类型不能很好支持######后台的问题,注解问题###### 引用来自“sprouting”的评论 400的错误一般都是数据绑定不上导致的,看下你的数据类型吧,如果密码是int类型,那么请使用Integer类型 springmvc对基础数据类型不能很好支持 确实是password这里出了问题,感谢大家宝贵的意见!###### 注解问题,SpringMVC的 @RequestBody接收Json对象字符串

爱吃鱼的程序员 2020-06-04 17:12:28 0 浏览量 回答数 0

回答

get.php <?php header("Content-Type:text/xml"); $pararl = $_GET['geturl']; if(!empty($pararl)) { echo file_get_contents($pararl); } ?> 接下来是,query.html页面,处理js和ajax <html> <body> <script src="jquery.js"></script> <script> function query(geturl){ $.ajax({ url:geturl, type: 'GET', dataType: 'xml', timeout: 2000, error: function(xml){ alert('Error loading XML document'+xml); }, success: function(xml){ var code=[]; var msg=[]; $(xml).find("Result").each(function(i){ code[code.length]=$(this).children("Code").text(); msg[msg.length]=$(this).children("msg").text(); }); //如果能找到code属性,并且第一个code的值为1,显示提示信息,否则,打印全部信息 if(xmldata.code[0]=='1'){ $("#data_div").html(msg); }else{ $("#data_div").html(xml.responseText); } } }); } </script> <div>请输入url:<input type="text" value="http://baidu.com" size="30" id="geturl"><input type="button" name="btn" value="获取信息" onclick="query($('#geturl').val())"></div> <div id="data_div"></div> </body> </html>

a123456678 2019-12-02 03:10:38 0 浏览量 回答数 0

问题

同步异步与回调

chenchuan 2019-12-01 21:37:37 1178 浏览量 回答数 0

回答

same origin policy 页面中的Javascript只能读取,访问同域的网页。这里需要注意的是,Javascript自身的域定义和它所在的网站没有任何关系,只和该Javascript代码所嵌入的文档的域有关。如以下示例代码: <!DOCTYPE HTML> <html lang="en"> <head> <meta charset="UTF-8"> <title>This is a webpage came from http://localhost:8000</title> <script src="//ajax.googleapis.com/ajax/libs/jquery/1.8.3/jquery.min.js"></script> </head> <body> <div id="test">123</div> <script type="text/javascript"> console.log($('#test').text()); </script> </body> </html> 该HTML文档来源于http://localhost:8000,这意味着它的域为http://localhost:8000(域和端口也相关),虽然页面中的jquery加载自ajax.googleapis.com,然而该JQuery的域只和它所处的HTML文档的域有关,从而可以访问该HTML文档的属性,因而以上代码可以正常运行。 附:使用上述代码的原因是,开发者将通用的Javascript库(如JQuery)地址指向公共相同的URL。当用户加载过一次该JS后,以后的加载将都通过浏览器缓存,从而加快了页面加载速度。 从这个角度看问题,假如提问者所知的远端指的是互联网上任意的页面,那么不能实现你所期望的功能;如果远端指的是提问者你所拥有控制权的网站,请看下面的Relaxing the same-origin policy; Relaxing the same-origin policy1.Document.domain:用于子域名的情况。对于多个windows(一个页面有多个iframe),通过设置document.domain的值为相同的域,使得Javascript可以访问异域window;2.Cross-origin resource sharing:通过在服务器端返回头增加Access-Control- Allow-Origin,该头部包含了所有允许访问的域的列表。支持的浏览器将允许本页面Javascript访问这些域;1.cross-document messaging:该方式和域无关,不同文档的Javascript可以相互发送接受消息而不受限制,然而不能主动趣读取,调用另一个文档的方法属性; 如果提问者拥有远端页面的控制权,可以尝试第二种方法。 服务器端抓取 根据提问者的需求,比较可行的方案应该是在服务器端进行处理。借助(http://phantomjs.org/),你可以使用Javascript语法在服务器端进行DOM操作,同时你可以使用nodejs进行进一步的分析等,当然,你也可以使用Python, php ,Java语言进行后续操作。 参考资料 同源策略http://en.wikipedia.org/wiki/Same_ori... Google Hosted Librarieshttps://developers.google.com/speed/l... Cross-origin resource sharinghttp://en.wikipedia.org/wiki/Cross-or...http://www.w3.org/TR/cors/ phantomjshttps://github.com/ariya/phantomjs

杨冬芳 2019-12-02 02:46:33 0 浏览量 回答数 0

回答

开源Web应用最常见漏洞和防御方法:1.XSS(跨站脚本攻击):htmlspecialchars/HTMLPurifier过滤后输出2.SQL注入:预处理参数化查询3.远程和本地文件包含漏洞:allow_url_fopen=On(默认值)include($_GET['file']);这样做是危险的.4.跨站请求伪造CSRF:操作加上csrf_token或者验证码(csrf_token可以放在URL的get参数里,表单的隐藏域里,或者AJAX的参数里)5.远程命令执行(RCE)命令注入 xss和注入的防御思路完全不一样 另外楼主的方案至少是10年以前的,早已落伍 对于注入,使用PDO或者mysqli的prepare方式来解决 对于XSS,请使用#<spanstyle="font-family:Verdana,sans-serif,宋体;font-size:13.3333px;line-height:21.3333px;background-color:#FFFFFF;">HTMLPurifier# 不拼接sql不完了吗?过滤毛线啊有时拼SQL也无妨,比如:var_export($db->query('SELECT*FROMlogsWHEREid='.intval($_GET['id']))->fetchAll(PDO::FETCH_ASSOC));用intval把用户输入强制转整数即可.

爱吃鱼的程序员 2020-06-09 13:41:40 0 浏览量 回答数 0

问题

最大限度利用 JavaScript 和 Ajax 性能:报错

kun坤 2020-06-05 22:56:50 0 浏览量 回答数 1

回答

客户端向服务器发送请求,服务器接到请求后hang住连接,等待30秒,直到有新消息,才返回响应信息并关闭连接,客户端处理完响应信息后再向服务器发送新的请求。 <!DOCTYPE html> <html lang="zh-cn"> <head> <meta charset="UTF-8"> <meta http-equiv="X-UA-Compatible" content="IE=edge"> <meta name="viewport" content="width=device-width, initial-scale=1"> <title>Title</title> </head> <body> <h1>请选出最帅的男人</h1> <ul> {% for k,v in gg.items() %} <li style="cursor: pointer" id="user_{{ k }}" ondblclick="vote({{ k }});">ID:{{ k }}, 姓名:{{ v.name }} ,票数:<span>{{ v.count }}</span></li> {% endfor %} </ul> <script src="/static/jquery-3.3.1.min.js"></script> <script> $(function () { get_new_count(); }); function get_new_count() { $.ajax({ url: '/get_new_count', type:'GET', dataType:'JSON', success:function (arg) { if (arg.status){ // 更新票数 var gid = "#user_" + arg.data.gid; $(gid).find('span').text(arg.data.count); }else{ // 10s内没有人投票 } get_new_count(); } }) } function vote(gid) { $.ajax({ url: '/vote', type:'POST', data:{gid:gid}, dataType:"JSON", success:function (arg) { } }) } </script> </body> </html>

珍宝珠 2019-12-02 03:20:15 0 浏览量 回答数 0

回答

真正的问题不在于“怎么赋给外面用”,而是“何时外面才能用”。为了理解这一点,你得明白什么是 async programming(异步编程),看这个虚构例子: var outside // 0. 我在外面 $.getJSON('/some/api/endpoint', function(response) { outside = response // 1. 你当然可以把响应数据赋值给外面的代码 }) console.log(outside) // 2. 但是你没法保证接下来的代码能正确运行 // 因为以上代码的运行顺序是 0 -> 2 -> 1从 0 到 2,代码是自上而下同步运行的,然而 1(注意:1 是 $.getJSON 的回调函数而不是 $.getJSON 方法本身)是在之后运行的,并且确切的时间无法预知,它取决于对于 '/some/api/endpoint' 的请求何时返回。所以上面的虚拟例子从语法上来说没有任何问题,你只是无法保证它能运行出期望的结果罢了(在现实中由于 event loop 的机制,1 总是晚于 2 运行的)。 So,我们不知道何时异步回调会执行(只知道它晚于同步代码),那我们怎么办?幸运的是我们知道:“反正它会运行的”(除非请求失败,然而那属于错误处理或异常处理的部分,此处我们只谈 happy path),所以我们就告诉它:“当它运行时该做什么”就是了。所以之前的例子可以改写一下: var outside $.getJSON('/some/api/endpoint', function(response) { outside = response // 你还是可以把响应数据赋值给外面的代码 console.log(outside) // 然后再执行相应的逻辑,因为这里面是同步的,你能保证顺序 }) 当然这个例子太简单了,以至于 outside 这个变量根本就是个摆设(who cares),领会精神就好。当然在实际中,由于代码组织的关系,我们不总是能把逻辑上的顺序按照线性的方式自上而下的写代码,不过没关系只要你心中始终拎清楚现在正在写的代码将在何时运行就好。举例而言,稍微改动一下上面的例子: var outside // 我不知道什么时候,但终将在某一时刻我要打印出 outside 的值 // 至于这个值是什么就看到时候是谁传 response 进来了 // 注意:这也同时暗示着,此函数的调用者一定要传递一个 response 进来,否则接下来的代码无意义 function printOutside(response) { outside = response console.log(outside) } // ... // 接着在未来的某个时候,某个请求调用了 printOutside 函数,outside 被顺利赋值并打印$.getJSON('/some/api/endpoint', printOutside)实际上,最后的 $.getJSON 写在 printOutside 的前面或后面都无所谓,它总是能正确运行的,因为无论写前写后,同步代码的解释执行都会先于 printOutside 被调用。而作为函数声明 $.getJSON 也总是能找到正确的 printOutside 函数(hoisting)。 这就是你想知道的“怎样给外面用”的最核心的知识,我尽可能通俗的讲解了。不过现实中会有非常多复杂的情形,比如最常见的:“异步回调里面再异步请求回调再异步请求回调再……”,也就是俗称的“回调地狱”——就需要更复杂一些的手段来让它们乖乖听话。这些进阶的知识其实并不难,只是在我之前描述的概念之上更进一步罢了。 那么最后我在给你点明一下如何在这个概念上进阶一步。想想看如果你是 jQuery 的作者(或者其他类似异步请求函数的作者),你要如何定义 $.getJSON 这个函数?重点是:你如何赋予使用者自由定义回调函数,然后你能确保它正确运行?先自己想想,然后看下面的伪代码: // 这里,我要定义这个 getJSON;本质上,它是对一个 xhr 请求的封装 $.prototype.getJSON = function(path, callback) { // 使用者需要告诉我两个条件:1,请求的 path;2,请求返回后要执行的 callback // 接着我开始封装 xhr 请求,具体的代码请参考 javascript 的 API 手册 // 比如这里:https://developer.mozilla.org/en-US/docs/AJAX/Getting_Started var xhr = new XMLHttpRequest() // 初始化一个 xhr 对象 xhr.onreadystatechange = function() { // xhr 请求发出后会有多种状态变化(根据请求的发送及接受情况),这个函数用于处理各种状况 // 因此真实的代码这里会比较复杂,然而最终一切 OK 的话我们能获得正确的 response // 要注意的是,此函数必须在 send 之前定义,否则 send 完之后 xhr 对象并不知道该继续做什么 // 这也就暗示着,onreadystatechange 其实是 send 在某一时刻调用的 // 这与前面的 printOutside 的例子有异曲同工之妙 // 拿到 response 之后我们开始调用 callback,并把 response 传递进去 callback(xhr.responseText) } xhr.open('GET', path) // 配置 xhr 的请求参数 xhr.send() // 发送真正的请求 } 真正的 jQuery 自然要比这个伪代码例子复杂多了(就连 xhr 的封装都不是在这里做的,我没记错的话 jQuery 还有更底层的函数,$.ajax?),它要处理的问题可不仅仅是调用 callback 这么简单,不过一旦你从作者角度明确了 callback 是如何被调用的,那么从使用者的角度来考量该如何利用 callback 就变得自然而然毫无窒碍了,这也就是常说的“知其然并知其所以然”。 有心的话,再研究一个举一反三的小题目吧(不难),研究明白了就能再上一个台阶。题目如下: 我们已经了解了这样的写法和用法: $.getJSON('some/api/endpoint', function(response) { // do something... }) 那么这样的写法和用法又是怎么实现的呢? $.getJSON('some/api/endpoint'[, maybeSomeAdditionalParams]) .success(function(response) { // do something when request is OK }) .fail(function(error) { // do something when it is NOT OK }) 一旦你掌握了这类写法是如何定义的,你就 get 到了新的姿势来处理可能存在的异步回调嵌套问题,并且这也是接下来你去学习更先进的异步编程范式的基础(比如 promises 等)。GL!

小旋风柴进 2019-12-02 02:22:52 0 浏览量 回答数 0

问题

【精品问答】python必备面试干货

问问小秘 2019-12-01 21:53:38 1125 浏览量 回答数 2

回答

如果界面传入数据在转换的时候抛出了异常,通常是输入数据错误。一个完整的,经过测试的网站在这种时候往往代表着被攻击了。如果是代码漏洞,你需要给界面非常友好的提示。 如:para1 = Integer.valueOf(request.getParameter("para1"));如果它抛出了异常,则代表输入非法了,通常页面就会限制这个数据是数字。你需要对这个数据对应的输入框中提示。 通常后台的判断应该是这样的 void myrequest(HttpServletRequest request, HttpServletResponse response) throws IOException { int para1; String name; try { para1 = getInteger(request, "param1", true); } catch (Exception e) { //此处处理过于简单,通常需要针对具体的输入框做提示。完整的异常处理 PrintWriter writer = response.getWriter(); writer.write(e.getMessage()); writer.flush(); return; } try{ name = getString(request, "name", true); } catch (Exception e) { //此处处理过于简单,通常需要针对具体的输入框做提示。完整的异常处理 PrintWriter writer = response.getWriter(); writer.write(e.getMessage()); writer.flush(); return; } //do other } private String getString(HttpServletRequest request, String param, boolean isCanNull) throws ValiException { String paramValue = request.getParameter(param); if(StringUtils.isEmpty(paramValue)){ if(isCanNull) return null; else throw new ValiException("文本不能为空");//返回异常时,建议在异常中加入一个int类型的code。通过code去判断异常类型。提示文本,应放入到系统常量中 } //此处可以依据你的具体业务需求做其他判断 return paramValue; } private int getInteger(HttpServletRequest request, String param, boolean isCanNull) throws ValiException { String paramValue = request.getParameter(param); if(StringUtils.isEmpty(paramValue)){ if(isCanNull) return 0; else throw new ValiException("请输入有效数字"); } //此处可以依据你的具体业务需求做其他判断 try { return Integer.parseInt(paramValue); } catch (NumberFormatException e) { throw new ValiException("输入数字格式错误", e); } } ######回复 @铂金小虫 : 是这个意思,不能所有的都在一个try里面的,那样前一个错误会造成后面的代码都无法执行。对于String/int/double...的处理封装一个通用工具类就行了。工具类中的判断可以在我注释的地方扩展正则表达式等(这里根据你的具体业务需求来)。。。######恩,我也有过这个想法,你这里关键是对每个参数的获取放在独立的try里面吧,然后对于string,int可以放在通用的工具类里。###### 我擦,看到这题目我还以为点到知乎里面去了。。 表单提交我都是用一个通用的类完成,实例化这个对象之后,添加进验证规则,返回验证结果和相关描述并ajax输出到浏览器 个人看法,因为前端的js代码非常容易被破解.而且浏览器自带破解工具(Debug...) 所以,如果是公网的网站,就不要考虑前端验证了.或者说,前端js负责错误提示,不负责验证(这其实是两回事) 验证主要工作放倒后端来做.后端的做法太多了,单独写类,拦截器,配置文件等等各种奇淫技巧.具体情况具体分析吧. 如果楼主做的是内网的系统(内网怎么就能降低要求呢摔....)那么可以把验证环节完全放倒前端.后端只接管数据库层面的异常.这样如果验证问题就去前端找.比较方便.前端验证的方法也很多.try catch是一种,正则表达式比try catch 要强大,但是不如try catch用起来方便.具体还是应该具体情况具体分析的吧.

kun坤 2020-05-30 14:02:29 0 浏览量 回答数 0

问题

刚学习strut2出现了一个前后台交互的问题?报错

爱吃鱼的程序员 2020-06-15 19:42:02 0 浏览量 回答数 1

问题

通过图片服务获取图片信息报错: Uncaught SyntaxErrorUnexpected token

何顺 2019-12-01 21:19:47 4915 浏览量 回答数 1

问题

模板,从服务端到客户端

go696 2019-12-01 21:32:31 3535 浏览量 回答数 0
阿里云大学 云服务器ECS com域名 网站域名whois查询 开发者平台 小程序定制 小程序开发 国内短信套餐包 开发者技术与产品 云数据库 图像识别 开发者问答 阿里云建站 阿里云备案 云市场 万网 阿里云帮助文档 免费套餐 开发者工具 企业信息查询 小程序开发制作 视频内容分析 企业网站制作 视频集锦 代理记账服务 2020阿里巴巴研发效能峰会 企业建站模板 云效成长地图 高端建站