1、ajax:
AJAX是指一种创建交互式网页(操作人员和系统之间存在交互作用的信息处理方式,即:访问者在移动鼠标,显示的内容在不断变化,就像对话一样有互动呈现。一打开网站所有内容都展现完了,那是老式的非交互布局)应用的网页开发技术,是一种技术而不是框架。通俗点来说,就是页面发送请求之后,还可以在当前页面进行操作,不用被阻塞着等待请求的响应,即异步请求。
2、ajax框架:
将ajax进行封装的框架,这些框架提供了Ajax快捷操作的方法,如快速异步获取一个页面,一个字符串、一个XML或JSON等。并通过回调函数对返回结果进行操作,用于实现ajax。主要包括:jQuery,prototype,MooTools,ASP.NET AJAX,Ajax.NET Professional,ExtJs等。
2.1、主要框架介绍
2.1.1 jQuery:
jQuery是一个轻量级(规模较小,但是功能比较全面)的javaScript(Web 的编程语言)库,也是一个快速、简洁的js框架,兼容各种浏览器和css3(用于控制网页的样式和布局),使用户能更方便的处理HTML document、events、实现用户效果,并且方便为网页提供ajax交互。
2.1.1 mootools:
mootools是一个简洁、模块化、面向对象的JavaScript库。它能够帮助你更快、更简单地编写可扩展和兼容性强的JavaScript代码。
2.1.3 prototype:
prototype是一个基础类库,对JS做了大量的扩充,并且能很好的支持ajax。
2.1.4 另外一些不常用的框架:(链接:https://www.jianshu.com/p/8953775f3c65)
DWR(direct web remoting):DWR是一个Java库,可以帮助开发者轻松实现服务器端的Java和客户端的JavaScript相互操作、彼此调用。
Apache Wicket:Apache Wicket是一个针对Java的Web开发框架,与Struts、WebWork、Tapestry类似。其特点在于对HTML和代码进行了有效的分离(有利于程序员和美工的合作),基于规则的配置(减少了XML 等配置文件的使用),学习曲线较低(开发方式与C/S相似),更加易于调试(错误类型比较少,而且容易定位)。
Dojo Tookit:Dojo是一个强大的面向对象的JavaScript框架。主要由三大模块组成:Core、Dijit、DojoX。Core提供AJAX、events、packaging、CSS-based querying、animations、JSON等相关操作API;Dijit是一个可更换皮肤、基于模板的WEB UI控件库;DojoX包括一些创新/新颖的代码和控件:DateGrid、charts、离线应用、跨浏览器矢量绘图等。
Spry framework:Adobe Spry是一个面向Web设计人员而不是开发人员的AJAX框架,它使得设计人员不需要了解复杂的AJAX技巧也能在一个HTML页面中创建丰富体验成为了可能。
YUI:YUI(Yahoo User Interface),是由雅虎开发的一个开源的JavaScript函数库,它采用了AJAX、 DHTML和DOM等诸多技术。YUI包含多种程序工具、函数库以及网页操作界面,能够更快速地开发互动性高且丰富的网站应用程序。
2.2、框架之间的区别
2.2.1 jQuery和mootools的区别:
jQuery优于api和DOM,以及出色的插件。但是在面对一些大型项目的时候,一些功能特性上的缺陷往往需要借助插件,这就有可能导致插件乱用,导致代码逐渐冗余,故jQuery更适用于动态的小中站点。而mootools虽API和DOM都不及jQuery,但是其API和面向对象的设计更适用于大型网站。
2.2.2 jQuery和prototype的区别:
jQuery是通过构建一个特殊对象$来扩充,将所有的功能都放在$里;而prototype是通过原型来扩展JS的功能的。比如:
//============加载页面============
// JQuery
$ ( document ). ready ( function () {
// Code
});
// JQuery Shorthand
$ ( function () {
// Code
});
// Prototype
document . observe ( 'dom:loaded' , function () {
// Code
});
//============根据ID获取============
// JQuery
$ ( "#idname" );
// Prototype
$ ( "idname" );
//============根据类名获取============
// JQuery
$ ( ".classname" );
// Prototype
$$ ( '.classname' );
//============根据第一个符合的类名获取============
// JQuery
$ ( ".classname:first-child" );
// Prototype
$$ ( '.classname' )[ 0 ];
//============根据ID绑定监听事件============
// JQuery
$ ( "#id" ). bind ( 'click' , function () {
// Code
});
// JQuery Shorthand
$ ( "#id" ). click ( function () {
// Code
});
// Prototype
$ ( "#id" ). observe ( 'click' , function () {
// code
});
//============根据符合的类名绑定监听事件============
// JQuery
$(".classname").bind('click',function(){
// code
});
// JQuery Shorthand
$ ( ".classname" ). click ( function () {
// code
});
// Prototype
$$ ( ".classname" ). invoke ( 'observe' , 'click' , function () {
// code
});
//============结束终止事件============
// JQuery
$ ( "#id" ). click ( function () {
//code
return false ;
});
// Prototype
$ ( "id" ). observe ( 'click' , function ( e ) {
//code
Event . stop ( e );
});
//============结束终止事件============
// JQuery
$.get(url,function(data){
alert(data . name );
}, 'JSON' );
// Prototype
new Ajax . Request ( url , {
method : 'get' ,
onSuccess : function ( transport , json ) {
alert ( json . name );
}
});
2.2.3 prototypejs和mootools的区别:
Mootools跟prototypejs相类似,语法几乎一样。但它提供的功能要比prototypejs多,而且更强大。比如增加了动画特效、拖放操作等等。
3、ajax的使用过程:
(1)创建XMLHttpRequest对象用于和服务器交换数据:
var xhr;
if (window.XMLHttpRequest) {//现代主流浏览器
xhr = new XMLHttpRequest();//XMLHttpRequest本身是一个构造函数,可以使用new命令生成实例。它没有任何参数。
} else {// 针对浏览器,比如IE5或IE6
xhr = new ActiveXObject("Microsoft.XMLHTTP");
}
(2)open()准备发送资源请求给服务器(即准备发送请求):
①xhr.open(method,url,async) method包括get 和post,url主要是文件或资源的路径,async参数为true(代表异步)或者false(代表同步)
②xhr.send();使用get方法发送请求到服务器。xhr.send(string);使用post方法发送请求到服务器。
get()和post()的区别:
①get()是从服务器获取数据,且在浏览器退/刷新时是无害的;post()是向服务器传递数据,退回时会再次请求数据。
②get()传送的数据量较小,且不安全,不超过2KB;post()没有限制,且安全性高。
③get()把参数包含在URL中;post()是通过request body传递参数的。
④get()只支持ascll字符;post()没有限制,允许二进制。
//get:准备和执行其实可以称作一步,
xhr.open("GET", "index.html", true);//准备发送
xhr.send();//执行发送
//post
xhr.open("POST", "demo_post.asp", true);
xhr.send();
(3)执行发送:xhr.send()
//======open()方法========
void open(
string method,//GET、POST、PUT、DELETE、HEAD等
string url,//目标地址
optional boolean async,//表示请求是否为异步,默认为true。如果设为false,则send()方法只有等到收到服务器返回了结果,才会进行下一步操作。
optional string user,//表示用于认证的用户名,默认为空字符串。
optional string password //表示用于认证的密码,默认为空字符串。
);
//如果对使用过open()方法的 AJAX 请求,再次使用这个方法,等同于调用abort(),即终止请求
//======send()方法========
//get
var xhr = new XMLHttpRequest();
xhr.open('GET',
'http://www.example.com/?id=' + encodeURIComponent(id),
true
);
xhr.send(null);
//post
var xhr = new XMLHttpRequest();
var data = 'email='
+ encodeURIComponent(email)
+ '&password='
+ encodeURIComponent(password);
xhr.open('POST', 'http://www.example.com', true);
xhr.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');
xhr.send(data);
(4)回调:xhr.onreadystatechange = functiion(){};
//完整例子
var xhr = new XMLHttpRequest();
xhr.onreadystatechange = function(){
// 通信成功时,状态值为4
if (xhr.readyState === 4){
if (xhr.status === 200){
console.log(xhr.responseText);
} else {
console.error(xhr.statusText);
}
}
};
xhr.onerror = function (e) {
console.error(xhr.statusText);
};
xhr.open('GET', '/endpoint', true);
xhr.send(null);
4、如何解决框架之间共享冲突
//方法一:
<html>
<head>
<script src="Mootools.js"></script>
<script src="jquery.js"></script>
<script>
jQuery.noConflict();//释放jquery中$定义,并直接使用jQuery代替平时的$。
jQuery(document).ready(function(){
jQuery("div").hide();
});
$('someid').style.display = 'none';//此处中的$为原Mootools中的$,使用方法不变
</script>
</head>
<body>
</body>
</html>
/**
* noConflict()方法释放 jQuery 对 $ 变量的控制 也可为jQuery 变量规定新的名称。
* style="visibility: hidden;":直接隐藏,但占用的页面空间是不变的。
* style="display:none":后一种方法直接是不显示,因此不占用的页面空间。
*/
//方法二
<html>
<head>
<script src="Mootools.js"></script>
<script src="jquery.js"></script>
<script>
jQuery.noConflict();
//将你使用的jquery代码放到document ready方中
jQuery(document).ready(function($){
// 此处为jQuery的$定义
$("div").hide();
});
//此处为Mootools的定义
$('someid').style.display = 'none';
</script>
</head>
<body>
</body>
</html>
//方法三
<html>
<head>
<script src="Mootools.js"></script>
<script src="jquery.js"></script>
<script>
var $j = jQuery.noConflict();//以$j来替代jQuery中的$,同时区分mootools
$j(document).ready(function(){
$j("div").hide();
});
$('someid').style.display = 'none'; //原mootools中的$照旧使用
</script>
</head>
<body></body>
</html>