海外代购可以做小程序可以做直播吗吗?

转自http://blog.csdn.net/iaiti/article/details/
其实这篇文章要写的不止是XMLHttpRequest status = 0 这个问题,还有我重新看AJAX遇到的一些问题和自己的反思。
先看整个例子:
1、为什么是xmlhttp.onreadystatechange = state_Change而不是xmlhttp.onreadystatechange = state_Change();
调用函数不是要用()写明的吗?难道它会根据函数名去找函数?问了几个前端的,感觉对这个都是模模糊糊也不懂真正的原因在哪里,最后还是去请教了另外一位师兄。
为的是把整个函数给onreadystatechange,而不是将函数最后处理完的值返回给onreadystatechange。
再来理一遍思路,XMLHttpRequest对象是在我最近在重看xml的教程时看到了,立刻和AJAX联系在一起。
w3c这样描述,它用于后台与服务器交换数据,是开发者的梦想。
现在的浏览器直接可以通过new拿到对象,但是IE就不可以了,xmlhttp = new ActiveXObject(&Microsoft.XMLHTTP&);
同时在IE6运行的时候浏览器会提示你设置ActiveX。
onreadystatechange是一个事件句柄,同样功能的还有onclick这些,就是有点击事件的时候会进行特定处理,具体看你的函数怎么写了。而onreadystatechange是由readyState触发,readyState存着XMLHttpRequest的状态,
&0: 请求未初始化
&1: 服务器连接已建立
&2: 请求已接收
&3: 请求处理中
&4: 请求已完成,且响应已就绪
readyState改变,调用onreadystatechange这个函数,注意,是这个函数,那我们是不是要赋值一个函数给他,而不是单纯地返回一个值。
所以,问题解决了。
同时不同于:
这个是HTML里面的,虽然也是事件句柄,但是格式不同。上面那个是在JS代码里面的。
2、XMLHttpRequest status = 0 问题。
xmlhttp.readyState =4的时候,一直xmlhttp.status != 200。便随手输出,发现xmlhttp.status=0,http协议里可是没这个状态码的。最后翻啊翻啊,找啊找啊,最后找到一个XMLHttpRequest的说明:&。
The status attribute must return the result of running these steps:
status的值一定会返回运行这些步骤的结果。
1、If the state is UNSENT or OPENED, return 0.(如果状态是UNSENT或者OPENED,返回0)
2、If the error flag is set, return 0.(如果错误标签被设置,返回0)
3、Return the HTTP status code.(返回HTTP状态码)
如果在HTTP返回之前就出现上面两种情况,就出现0了。
先说两个button,一个是url是:file:///E:/test2.html,另外一个是:。
第一个button的url访问只是本地打开没有通过服务器,自己可以用Wireshark捉包(感谢某位高人指点)。
这里面还有一个问题,就是xmlhttp.readyState一直会变,
1: 服务器连接已建立
2: 请求已接收&&
3: 请求处理中&&
4: 请求已完成,且响应已就绪。
以这种情况看的话,应该是xmlhttp自己在模拟,因为根本就没通过服务器。本地直接打开而已。OPENED了,所以status为0。
第二个button的url访问虽然是其他域名,抓包是有的,但是,这是跨域访问了,
If the cross-origin request status is network error
&&& This is a network error.
虽然去访问了,应该是浏览器跨域的返回头没有允许,所以浏览器阻止,Access-Control-Allow-Origin这个属性。
真确的方法是在自己的服务器,访问自己域名内的url。
在tomcat上跑:
最后我在反思,我自己一直在寻求问题的答案,但是问其中一些人的时候,只是给出了自己随手百度而来的答案,有些人,甚至我说加括号之后有错了之后就不再理会这个问题,会用就行了。但是我不止于这种答案,还是去问了一个师兄,因为,这位师兄前端了得,重要的是,是一位技术爱好者,就是他把第一个问题的分析给我听,后面自己去Google再深入。
搞技术的差距,大概于此,现在可能差距不大,但是几年之后,估计就不是一个级别了。
人之差距,也是如此罢了。
最后要感谢另外一个人,他让我见识到了了一个全栈工程师的。前后端通杀,底层也会,业务逻辑也会。几句话能把我下午查的东西串联起来,所谓真正的程序员,也是如此。与他的一番谈话,很是兴奋,也甚是佩服。热爱技术的人,不过与此。
&&相关文章推荐
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:69次
排名:千里之外温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!&&|&&
LOFTER精选
网易考拉推荐
用微信&&“扫一扫”
将文章分享到朋友圈。
用易信&&“扫一扫”
将文章分享到朋友圈。
阅读(3002)|
用微信&&“扫一扫”
将文章分享到朋友圈。
用易信&&“扫一扫”
将文章分享到朋友圈。
历史上的今天
loftPermalink:'',
id:'fks_',
blogTitle:'AjaxError 方法中XmlHttpRequest的status为0的问题',
blogAbstract:'1. 页面上有一个下拉框,在下拉框的内容改变的时候,通过JQuery.ajax方法进行异步通信取得数据。\n2. 页面上还有一个页面跳转按钮,用于页面的跳转。\n&\n因为下拉框的异步通信数据量大,返回到前台页面要花费很长时间。\n在下拉框的异步传输数据返回到前台页面之前,如果按下页面跳转按钮,ajax的error方法就被调用了。\n&\n在FF3.5.7, Safari4.0.4, Chrome5.0下监视error方法中alert \nrequest的status值为0,IE, Opera下不是0。\n&\n问题:\n&a. 关于ajax的通信\n&&&& 页面跳转之前ajax是不是check过当前请求的状态,如果异步通信没有结束就自动调用error方法?',
blogTag:'',
blogUrl:'blog/static/',
isPublished:1,
istop:false,
modifyTime:1,
publishTime:0,
permalink:'blog/static/',
commentCount:1,
mainCommentCount:1,
recommendCount:0,
bsrk:-100,
publisherId:0,
recomBlogHome:false,
currentRecomBlog:false,
attachmentsFileIds:[],
groupInfo:{},
friendstatus:'none',
followstatus:'unFollow',
pubSucc:'',
visitorProvince:'',
visitorCity:'',
visitorNewUser:false,
postAddInfo:{},
mset:'000',
remindgoodnightblog:false,
isBlackVisitor:false,
isShowYodaoAd:false,
hostIntro:'',
hmcon:'0',
selfRecomBlogCount:'0',
lofter_single:''
{list a as x}
{if x.moveFrom=='wap'}
{elseif x.moveFrom=='iphone'}
{elseif x.moveFrom=='android'}
{elseif x.moveFrom=='mobile'}
${a.selfIntro|escape}{if great260}${suplement}{/if}
{list a as x}
推荐过这篇日志的人:
{list a as x}
{if !!b&&b.length>0}
他们还推荐了:
{list b as y}
转载记录:
{list d as x}
{list a as x}
{list a as x}
{list a as x}
{list a as x}
{if x_index>4}{break}{/if}
${fn2(x.publishTime,'yyyy-MM-dd HH:mm:ss')}
{list a as x}
{if !!(blogDetail.preBlogPermalink)}
{if !!(blogDetail.nextBlogPermalink)}
{list a as x}
{if defined('newslist')&&newslist.length>0}
{list newslist as x}
{if x_index>7}{break}{/if}
{list a as x}
{var first_option =}
{list x.voteDetailList as voteToOption}
{if voteToOption==1}
{if first_option==false},{/if}&&“${b[voteToOption_index]}”&&
{if (x.role!="-1") },“我是${c[x.role]}”&&{/if}
&&&&&&&&${fn1(x.voteTime)}
{if x.userName==''}{/if}
网易公司版权所有&&
{list x.l as y}
{if defined('wl')}
{list wl as x}{/list}Ajax入门——使用XMLHttpRequest的常见问题及解决方案
Ajax入门——使用XMLHttpRequest的常见问题及解决方案
发布时间: 2:30:50
编辑:www.fx114.net
本篇文章主要介绍了"Ajax入门——使用XMLHttpRequest的常见问题及解决方案",主要涉及到Ajax入门——使用XMLHttpRequest的常见问题及解决方案方面的内容,对于Ajax入门——使用XMLHttpRequest的常见问题及解决方案感兴趣的同学可以参考一下。
使用Ajax进行web开发中,经常会遇到下面三个基本问题:
1.XMLHttpRequest请求的缓存问题
2.Ajax应用中的中文乱码问题
3.Ajax应用中的跨域访问问题
一、XMLHttpRequest请求的缓存问题
由于浏览器的缓存机制,当我们使用XMLHttpRequest发出请求的时候,浏览器会将请求的地址与缓存中的地址进行比较,如果存在相同记录则返回与上一次请求相同内容。其实不光是在Ajax应用中,在我们项目开发中使用一个基本的JavaScript更换验证码时,也会发生发出请求之后,并没有得到服务器端更新的结果的问题。以上皆是缓存问题,解决这类缓存问题并不麻烦,而且方法很多。
1.时间戳方法
&&即在每次请求的url后面加上当前时间的字符串或其他类似的不会重复的随机字符串,这样浏览器每次发出的是不同的url,即会当做不同的请求来处理,而不会从缓存中读取。
    if(url.indexOf(&?&)&=0){//判断url中是否已经带有参数
&&&&&&&&&&&&&&&&&&&
url = url + &&t=& + (new Date()).valueOf();
&&&&&&&&&&&&&&&
&&&&&&&&&&&&&&&&&&& url = url + &?t=& + (new
Date()).valueOf();
&&&&&&&&&&&&&&& }
2、在HTTP header上处理缓存
    &meta http-equiv=&pragma& content=&no-cache& /&
    &meta http-equiv=&Cache-Control& content=&no-cache, must-revalidate&
    &meta http-equiv=&expires& content=&Thu, 01 Jan :01
    &meta http-equiv=&expires& content=&0& /&
3. 在XMLHttpRequest发送请求之前加上:
    XMLHttpRequest.setRequestHeader(&If-Modified-Since&,&0&);
    XMLHttpRequest.send(null);
二、Ajax应用中的中文乱码问题分为两种:
&&& 1.请求数据中包含中文,服务器端接收数据时出现乱码;
&&&& 解决方案:
&&&& 在页面端,将包含中文信息的请求数据利用JavaScript中的encodeURL进行两次编码:
    //获取文本框中用户输入的内容
&&&&&&&&&&&&&&& var email =
document.getElementById(&email&).
&&&&&&&&&&&&&&&
//encodeURL进行两次编码
&&&&&&&&&&&&&&& email =
encodeURI(encodeURI(email));
&&&& 在服务器端,对获得到的请求数据用URLDecoder类的decode方法按照utf-8的方式进行decode操作
    String email =
request.getParameter(&email&);
    email = URLDecoder.decode(email, &utf-8&);
这里为什么在页面端要进行两次encodeURL编码,而在服务器端却只进行一次decode操作呢?因为在调用getParameter方法的时候,应用服务器内部会进行一次解码,所以String
request.getParameter(&email&)中的email已经是经过一次解码之后的数据,然后我们只需进行一个decode即可得到原始数据。(视频上是这么说的,关于服务器端getParameter的内部机制,感兴趣的只有自己去Google了。)
&&& 2.响应数据中包含中文,由于编码设置错误导致浏览器显示时出现乱码
&&&& 解决方案:
&&&& 保证页面端定义的charset和http响应头的content-type中定义的charset一致即可。
&&&& 这里有一个特殊情况,就是在IE6.0中如果页面端和服务器端对应的charset都设置为gb2312时,还是会出现中文的响应时乱码,其他浏览器没有。
针对这个问题,第一套解决方案是将charset设置为除gb1312之外的编码方式,如utf-8等;第二套解决方案是在我们创建XMLHttpRequest对象的时候,仅仅使用MSXML2.XMLHTTP和Microsoft.XMLHTTP来创建,这也是我们通常采用的做法。
三、跨域访问问题
&&&& 即在XMLHttpRequest对象中访问远程服务器地址:
     xmlhttp.open(&GET&,
&http://192.168.0.102:8080/Demo/Email?email=&+email, true, &admin&,
&&&& 在IE6.0中当然执行此操作时,会弹出一个对话框:
&&&& 提示会存在安全风险,问是否继续,如果选择&Yes&会继续访问你所请求的远程页面,否则停止响应。
&&&& 但在IE7.0及以上版本、Firefox等上访问时,默认的会不支持这样的跨域访问。
就像我们有时候直接访问国外网站是访问不了的,这时我们可以给浏览器加一个代理。在这里我们也可以利用代理的思想来解决。即先让XMLHttpRequest对象访问同域的服务器,然后通过该服务器再去请求远程服务器上的数据。我们可以通过代码实现,鉴于代码有点多,有空再贴出。
一、不得利用本站危害国家安全、泄露国家秘密,不得侵犯国家社会集体的和公民的合法权益,不得利用本站制作、复制和传播不法有害信息!
二、互相尊重,对自己的言论和行为负责。
本文标题:
本页链接:}

我要回帖

更多关于 微信小程序可以做什么 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信