AJAX 教程
AJAX = Asynchronous JavaScript and XML(异步的 JavaScript 和 XML)。
在应用时主要是创建XMLHttpRequest对象,调用指定服务地址。
但是IE中各个版本支持的不太一样,所以在创建次对象时可能要特殊处理下。
一般如下:
function createXMLHttpRequest(){
var xmlhttp;
try{
xmlhttp = new XMLHttpRequest();//ie7及以上,其他浏览器
}catch(e){
try{
xmlhttp = new ActiveXObject("Msxml2.XMLHTTP");//ie6
}catch(e){
try{
xmlhttp = new ActiveXObject("Microsoft.XMLHTTP");//ie6以下
}catch(e){
throw "创建AJAX对象失败!";
}
}
}
return xmlhttp;
}
var xmlhttp = createXMLHttpRequest();
xmlhttp.open("GET","http://localhost:8080/SimpleBlog/AjaxTest",true);
xmlhttp.send(null);
xmlhttp.onreadystatechange = function(result){
if(xmlhttp.readyState==4 && xmlhttp.status == 200){
alter(result.test);
}
};
但是浏览器再执行javascript代码时,有个著名的同源策略,这使得跨域请求就不是那么方便了。
那一般都是用什么方式支持跨域呢?
1、通过中间代理服务器,获取要跨域请求的数据。
2、通过iframe内嵌带请求域的页面,来解决跨域访问问题。
3、通过jsonp方式。
4、不过现在已经提出了XMLHttpRequest Level2(XHR2)允许跨域请求,不过要在server的返回头中显示声明允许跨域请求(浏览器的支持情况:http://caniuse.com/#feat=xhr2)。
下面简单说下jsonp与xtr2。
jsonp:
jsonp简单的说就是利用<script>标签来实现跨域请求的调用,因为浏览器中脚本的加载是不受同源策略影响的。
function get() {
var url = 'http://localhost:8080/SimpleBlog/AjaxTest"type","text/javascript");
script.src = url;
document.body.appendChild(script);
}
function callback(va){
alert(va.test);
}
服务端(java):
boolean jsonP = false;
String cb = this.request.getParameter("callback");
if (cb != null) {
jsonP = true;
response.setContentType("text/javascript");
} else {
response.setContentType("application/x-json");
}
PrintWriter out = response.getWriter();
if (jsonP) {
try {
out.println(cb + "({\"test\":\"1\"})");
out.flush();
out.close();
} catch (Exception e) {
throw e;
}
}
这样就可以实现跨域调用了。
而我们经常用的jquery已经实现了此类方式的封装,使用起来更简单。
$(document).ready(function (){
$('#jqueryajax').bind('click', function(){
$.ajax({
type: 'get',
async: false,
url: 'http://localhost:8080/SimpleBlog/AjaxTest1',
dataType: 'jsonp',
jsonp: 'callback',
success: function(json){
alert(json.result);
},
error: function(){
alert('fail');
}
});
});
});
服务端(java):
我用了struts是这样写的:
public class AjaxTest1 extends ActionSupport {
private String result;
public String getResult() {
return result;
}
public String execute() {
this.result = "1";
return "jqueryajax";
}
}
配置文件:
<action name="AjaxTest1" class="AjaxTest1"> <result name="jqueryajax" type="json"> <param name="callbackParameter">callback</param> </result> </action>
下面说说xtr2:
这个就更简单了,直接创建调用即可。
function createCORSRequest(method,url){
var xhr=new XMLHttpRequest();
if('withCredentials' in xhr){
xhr.open(method,url,true);
}else if(typeof XDomainRequest!='undefined'){
xhr=new XDomainRequest();
xhr.open(method,url);
}else{
xhr=null;
}
return xhr;
}
function xhr2(){
var request=createCORSRequest('GET','http://localhost:8080/SimpleBlog/AjaxTest1');
if(request){
request.onload=function(){
alert(request.responseText);
}
request.onerror=function(e){
alert('error');
}
request.send();
}
}
服务端:其实只要在返回response中设置
httpResponse.addHeader("Access-Control-Allow-Origin", "*");
即可。
Ajax,跨域
免责声明:本站文章均来自网站采集或用户投稿,网站不提供任何软件下载或自行开发的软件! 如有用户或公司发现本站内容信息存在侵权行为,请邮件告知! 858582#qq.com
《魔兽世界》大逃杀!60人新游玩模式《强袭风暴》3月21日上线
暴雪近日发布了《魔兽世界》10.2.6 更新内容,新游玩模式《强袭风暴》即将于3月21 日在亚服上线,届时玩家将前往阿拉希高地展开一场 60 人大逃杀对战。
艾泽拉斯的冒险者已经征服了艾泽拉斯的大地及遥远的彼岸。他们在对抗世界上最致命的敌人时展现出过人的手腕,并且成功阻止终结宇宙等级的威胁。当他们在为即将于《魔兽世界》资料片《地心之战》中来袭的萨拉塔斯势力做战斗准备时,他们还需要在熟悉的阿拉希高地面对一个全新的敌人──那就是彼此。在《巨龙崛起》10.2.6 更新的《强袭风暴》中,玩家将会进入一个全新的海盗主题大逃杀式限时活动,其中包含极高的风险和史诗级的奖励。
《强袭风暴》不是普通的战场,作为一个独立于主游戏之外的活动,玩家可以用大逃杀的风格来体验《魔兽世界》,不分职业、不分装备(除了你在赛局中捡到的),光是技巧和战略的强弱之分就能决定出谁才是能坚持到最后的赢家。本次活动将会开放单人和双人模式,玩家在加入海盗主题的预赛大厅区域前,可以从强袭风暴角色画面新增好友。游玩游戏将可以累计名望轨迹,《巨龙崛起》和《魔兽世界:巫妖王之怒 经典版》的玩家都可以获得奖励。