ajax的核心,好好认识一下XMLHttpRequest

相信包括在我的绝大多数人都用jQuery的$.get(),$.post(),$.ajax()方法用的很爽了,关于其原生的请求却很少去发掘,很多时候(比如用html5开发app的时候),我并不再需要jQuery,弄明白XMLHttpRequest用原生的就能很好的处理ajax了。

首先,由于我的js是通过jQuery入门的,所以才会有这篇文章。

从new一个对象开始

var xmlhttp = new XMLHttpRequest();

之后的请求,读取,出错等等各种处理都在xmlhttp这个对象里面啦

第一个GET请求

get请求简单,最适合入门操作啦。之前new了一个xmlhttp对象,这次我们就要对它进行操作了。

var url = "http://localhost/";
xmlhttp.open( "GET", url, true );
xmlhttp.send( null );

使用get请求来请求一个url,受到同源策略的约束,请求的url必须是和你当前页面所在的主域是一样的(你在本地是不可能请求到imhuchao.com这个域名的内容的),否则你会什么也看不到。

好了,我们请求了一个操作,也send了,但是要怎样得到结果呢?

其结果是储存在xmlhttp.responseText,但是我们是不能直接去取的,因为上面的请求我们设定了是异步的呀!发送请求就完了,异步并不会等待结果返回。

xmlhttp有一个onreadystatechange事件,这个会根据请求状态的改变而触发。于是,我们需要做的是在请求完成之后,来获取这个responseText值,然后送给回调函数来处理啦!看看下面的代码吧!一个完整的get请求

function get(url,callback){
    var xmlhttp = new XMLHttpRequest()
    xmlhttp.open("GET",url, true);
    xmlhttp.send(null);
    xmlhttp.onreadystatechange = function(){
                if( xmlhttp.readyState == 4 ){
                    callback(xmlhttp.responseText);
                }
            };
}

上面的callback就是回调函数啦。使用的方法就是

get("http://localhost/",function(data){
    console.log(data)
});

2.第一个同步GET请求

虽然同步请求不是官方推荐的方式,但有时候,使用同步请求要比异步请求来的舒服。至少在代码上看的很舒服。(ps,我也不推荐同步请求,哈哈)

var url = "http://localhost/";
xmlhttp.open( "GET", url, false );
xmlhttp.send( null );

只要将open的第三个参数,改为false,就是同步请求啦。

上面代码将会阻塞js的运行,如果这个url迟迟不响应的话,那么页面将会出现“卡死的”状态,所以,一般用这个,当且仅当你能确定目标地址能够迅速响应的情况下!

获取相应文本,直接返回 xmlhttp.responseText 就可以!

3.第一个post请求

现在尝试一下使用XMLHttpRequest来发送post请求。主要使用

var url = "http://localhost/";
var data = "foo=bar&a=b";
xmlhttp.open( "POST", url, true );
xmlhttp.setRequestHeader("Content-Type","application/x-www-form-urlencoded")
xmlhttp.send( data )

重点在data,这个data就是所需要post的数据。

一般情况下,我们肯定不喜欢将data直接写成url查询的模式,而是json格式,但是javascript并没有直接提供json转为url串的方法,不像php直接一个http_build_query搞定。这里就需要我们自己写函数来进行转换咯,不过这个并不是太难。

data的格式类似于这种

foo=bar&a=1

和url查询是一样的。

下面写一个buildQuery()方法

 

function buildQuery(){}

 

未完

你可能还喜欢下面这些文章

使用php curl 的并发能力可以做什么

在php中,没有多线程让编程变得简单。但在一些需要并发提升性能的场景下,显得有些无能为力,比如发起一些http请求。但好在curl扩展可以让我们“并发”去请求网络资源。利用这个特点,我们能做很多有趣的事情。最基础的,并发请求网络资源,提升处理速度。并发访问代码<?phpclass ConcurrencyHTTP { private $_requests; private $_callbacks; private $_currentIndex = 0; public function get($url, $header = array(), $timeout = 3

JS使用XMLHttpRequest实现ajax请求

是一个JavaScript对象,它最初由微软设计,随后被 Mozilla、Apple和Google采纳。如今,该对象已经被 W3C组织标准化。通过它,你可以很容易的取回一个URL上的资源数据。尽管名字里有XML, 但 可以取回所有类型的数据资源,并不局限于XML。而且除了HTTP ,它还支持 和 协议。创建一个 实例, 可以使用如下语句:方法概述非标准方法属性AttributeTypeDescription一个JavaScript函数对象,当readyState属性改变时会调用它。回调函数会在user interface线程中调用。警告: 不能在本地代码中使用. 也不应该在同步模式的请求中

Go入门:五、goroutine和channel

这是我Go学习的第五篇笔记,学习的是go的语言的其他特性,这些特性是其他语言所不具备的。这次主要学习的是goroutine和channel。我的语言学习过程一般分为下面几个:1. 变量和数据类型2. 流程控制方法3. 函数声明和调用4. 面向对象5. 语言特性6. 常用标准库goroutine介绍和使用Go语言中,每个并发执行的单元称为goroutine(可类比线程)。当一个程序启动时候,main函数在一个main goroutine中运行。如果想要创建新的goroutine,使用go关键字!语法创建一个新的 goroutinechannel是goroutine的通信机制,比如创建一个能够接收

CGI与FastCGI是什么

当我们在谈到cgi的时候,我们在讨论什么最早的Web服务器简单地响应浏览器发来的HTTP请求,并将存储在服务器上的HTML文件返回给浏览器,也就是静态html。事物总是不 断发展,网站也越来越复杂,所以出现动态技术。但是服务器并不能直接运行 php,asp这样的文件,自己不能做,外包给别人吧,但是要与第三做个约定,我给你什么,然后你给我什么,就是握把请求参数发送给你,然后我接收你的处 理结果给客户端。那这个约定就是 common gateway interface,简称cgi。这个协议可以用vb,c,php,python 来实现。cgi只是接口协议,根本不是什么语言。下面图可以看到流程WEB服

布隆过滤器(bloom filter)介绍以及php和redis实现布隆过滤器实现方法

引言在介绍布隆过滤器之前我们首先引入几个场景。场景一在一个高并发的计数系统中,如果一个key没有计数,此时我们应该返回0。但是访问的key不存在,相当于每次访问缓存都不起作用了。那么如何避免频繁访问数量为0的key而导致的缓存被击穿?有人说, 将这个key的值置为0存入缓存不就行了吗?这是确实是一种解决方案。当访问一个不存在的key的时候,设置一个带有过期时间的标志,然后放入缓存。不过这样做的缺点也很明显:浪费内存和无法抵御随机key攻击。场景二在一个黑名单系统中,我们需要设置很多黑名单内容。比如一个邮件系统,我们需要设置黑名单用户,当判断垃圾邮件的时候,要怎么去做。比如爬虫系统,我们要记录下

欧拉计划:找出1000以下3与5的倍数之和

题目如果我们列出10以下的3和5的倍数,我们可以得到3,5,6,9。它们的和为23。请求出1000以下所有的3和5的倍数之和。原文If we list all the natural numbers below 10 that are multiples of 3 or 5, we get 3, 5, 6 and 9. The sum of these multiples is 23.Find the sum of all the multiples of 3 or 5 below 1000.原文链接https://projecteuler.net/problem=1解答我会用php,pyth

iterm2 使用 rz、sz 的方法

如果没有额外的设置,iterm2 使用 rzsz 的时候会卡在这个时候就需要使用iterm2提供的trigger来实现rzsz的功能。第一步:本机安装rzsz使用rzsz之前本地也需要安装如果没有安装brew,请先安装brew,mac必备的包管理器!第二步:创建发送和接收脚本发送文件的脚本如下,可以复制下面的内容,保存在 /usr/local/bin/iterm2-send-zmodem.sh中。接收文件的脚本如下,同样可以复制保存在/usr/local/bin/iterm2-recv-zmodem.sh第三步:设置Triggerteigger需要设置两个,一个实发送文件的trigger,一个

C++动态内存管理

C++中,动态内存管理是通过一对运算符来完成:new 和 delete。new操作符在内存中为对象分配空间并返回一个指向该对象的指针,delete接收一个动态对象的指针,销毁该对象,并释放与之相关的内存。手动管理内存看起来只有这两个操作,似乎很轻松,但实际上这是一件非常繁琐的事情,分配了内存但没有释放内存的场景发生的概率太大了!回想一下,你有多少次打开抽屉却没关上,拿出来的护肤品擦完脸之后却忘了放回去,吃完饭却忘了洗碗。类似这种没有收尾的事情我做的太多了。(以上这些都是在实际生活中我爱人批评我的点)我连这种明面上的事情都能忘记收尾,何况分配内存!所以为了世界和平,我放弃了手动管理内存。好在C+

使用sublime+platuml高效画图

程序员难免要经常画流程图,状态图,时序图等。以前经常用 visio 画,经常为矩形画多大,摆放在哪等问题费脑筋。有时候修改文字后,为了较好的显示效果不得不再去修改图形。今天介绍的工具是如何使用 Sublime + PlantUML 的插件画流程图,状态图,时序图等。这是一种程序员看了就会爱上的画图方式:自然,高效。什么是 PlantUMLPlantUML 是一个画图脚本语言,用它可以快速地画出:时序图流程图用例图状态图组件图简单地讲,我们使用 visio 画图时需要一个一个图去画,但使用 PlantUML 只需要用文字表达出图的内容,然后就可以直接生成图片。看一个最简单的例子:软件安装这些软件

查看varnish统计信息命令:varnishstat

varnishstat是一个查看当前varnish实例的实时运行状态信息。命令以及参数如下:varnishstat 以下选项可用: -1不再显示不断更新的显示,而是将统计信息打印到stdout。-f <glob>Field inclusion glob. Use backslash to escape characters. If the argument starts with '^' it is used as an exclusion glob. Multiple -f arguments may be given, and they will be ap

赞赏

微信赞赏支付宝赞赏

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注