说说大家是多少公共预算收入入笔吧,又是什么电脑抱回家吧

jquery中ajax处理跨域的三大方式
投稿:lijiao
字体:[ ] 类型:转载 时间:
这篇文章主要介绍了jquery中ajax处理跨域的三大方式,感兴趣的小伙伴们可以参考一下
由于JS同源策略的影响,因此js只能访问同域名下的文档。因此要实现跨域,一般有以下几个方法:
一、处理跨域的方式:
HTML5中提供的XMLHTTPREQUEST Level2(及XHR2)已经实现了跨域访问。但ie10以下不支持
只需要在服务端填上响应头:
header("Access-Control-Allow-Origin:*");
/*星号表示所有的域都可以接受,*/
header("Access-Control-Allow-Methods:GET,POST");
&ajax本身是不可以跨域的,
通过产生一个script标签来实现跨域。因为script标签的src属性是没有跨域的限制的。
其实设置了dataType: 'jsonp'后,$.ajax方法就和ajax XmlHttpRequest没什么关系了,取而代之的则是JSONP协议。JSONP是一个非官方的协议,它允许在服务器端集成Script tags返回至客户端,通过javascript callback的形式实现跨域访问。
&ajax的跨域写法:
(其余写法和不跨域的一样):
/*当前网址是localhost:3000*/
type:"get",
url:"http://localhost:3000/showAll",/*url写异域的请求地址*/
dataType:"jsonp",/*加上datatype*/
jsonpCallback:"cb",/*设置一个回调函数,名字随便取,和下面的函数里的名字相同就行*/
success:function(){
/*而在异域服务器上,*/
app.get('/showAll',students.showAll);/*这和不跨域的写法相同*/
/*在异域服务器的showAll函数里,*/
var db = require("./database");
exports.showAll = function(req,res){
/**设置响应头允许ajax跨域访问**/
res.setHeader("Access-Control-Allow-Origin","*");
/*星号表示所有的异域请求都可以接受,*/
res.setHeader("Access-Control-Allow-Methods","GET,POST");
var con = db.getCon();
con.query("select * from t_students",function(error,rows){
if(error){
console.log("数据库出错:"+error);
/*注意这里,返回的就是jsonP的回调函数名+数据了*/
res.send("cb("+JSON.stringify(r)+")");
二、解决ajax跨域访问、 JQuery 的跨域方法
&JS的跨域问题,我想很多程序员的脑海里面还认为JS是不能跨域的,其实这是一个错误的观点;有很多人在网上找其解决方法,教其用IFRAME去解决的文章很多,真有那么复杂吗?其实很简单的,如果你用JQUERY,一个GETJSON方法就搞定了,而且是一行代码搞定。
下面开始贴出方法。
//跨域(可跨所有域名)
$.getJSON(".cn/getregion.aspx?id=0&jsoncallback=?",function(json){
//要求远程请求页面的数据格式为: ?(json_data) //例如: //?([{"_name":"湖南省","_regionId":134},{"_name":"北京市","_regionId":143}]) alert(json[0]._name);
$.getJSON(".cn/getregion.aspx?id=0&jsoncallback=?",function(json){
//要求远程请求页面的数据格式为: ?(json_data) //例如: //?([{"_name":"湖南省","_regionId":134},{"_name":"北京市","_regionId":143}]) alert(json[0]._name);
&注意,getregion.aspx中,在输出JSON数据时,一定要用Request.QueryString["jsoncallback"],将获取的内容放到返回JSON数据的前面,假设实际获取的值为,那么返回的值就是 ([{"_name":"湖南省","_regionId":134},{"_name":"北京市","_regionId":143}])
因为getJSON跨域的原理是把?随机变一个方法名,然后返回执行的,实现跨域响应的目的。
下面一个是跨域执行的真实例子:
&script src="/script/jquery.js" type="text/javascript"&&/script&
&script type="text/javascript"&
//跨域(可跨所有域名)
$.getJSON(".cn/tools/ajax.aspx?jsoncallback=?", { id: 0, action: 'jobcategoryjson' }, function(json) { alert(json[0].pid); alert(json[0].items[0]._name); }); 
&script src="/script/jquery.js" type="text/javascript"&&/script&
&script type="text/javascript"&
//跨域(可跨所有域名)
$.getJSON(".cn/tools/ajax.aspx?jsoncallback=?", { id: 0, action: 'jobcategoryjson' }, function(json) { alert(json[0].pid); alert(json[0].items[0]._name); }); 
jQuery跨域原理:
浏览器会进行同源检查,这导致了跨域问题,然而这个跨域检查还有一个例外那就是HTML的&Script&标记;我们经常使用&Script&的src属性,脚本静态资源放在独立域名下或者来自其它站点的时候这里是一个这个url响应的结果可以有很多种,比如JSON,返回的Json值成为&Script&标签的src属性值.这种属性值变化并不会引起页面的影响.按照惯例,浏览器在URL的查询字符串中提供一个参数,这个参数将作为结果的前缀一起返回到浏览器;
看下面的例子:
&script type="text/javascript" src="/getjson?jsonp=parseResponse"& &/script&
响应值:parseResponse({"Name": "Cheeso", "Rank": 7})
&script type="text/javascript" src="/getjson?jsonp=parseResponse"& &/script&
响应值:parseResponse({"Name": "Cheeso", "Rank": 7})
这种方式被称作JsonP;(如果链接已经失效请点击这里:JSONP);即:JSON with padding 上面提到的前缀就是所谓的“padding”。那么jQuery里面是怎么实现的呢?
貌似并没有&Script&标记的出现!?OKay,翻看源码来看:
页面调用的是getJSON:
getJSON: function( url, data, callback ) {
return jQuery.get(url, data, callback, "json");
get: function( url, data, callback, type ) {
// shift arguments if data argument was omited
if ( jQuery.isFunction( data ) ) {
type = type ||
callback =
return jQuery.ajax({
type: "GET",
data: data,
success: callback,
dataType: type
跟进jQuery.ajax,下面是ajax方法的代码片段:
// Build temporary JSONP function
if ( s.dataType === "json" && (s.data && jsre.test(s.data) || jsre.test(s.url)) ) {
jsonp = s.jsonpCallback || ("jsonp" + jsc++);
// Replace the =? sequence both in the query string and the data
if ( s.data ) {
s.data = (s.data + "").replace(jsre, "=" + jsonp + "$1");
s.url = s.url.replace(jsre, "=" + jsonp + "$1");
// We need to make sure
// that a JSONP style response is executed properly
s.dataType = "script";
// Handle JSONP-style loading
window[ jsonp ] = window[ jsonp ] || function( tmp ) {
success();
complete();
// Garbage collect
window[ jsonp ] =
delete window[ jsonp ];
} catch(e) {}
if ( head ) {
head.removeChild( script );
if ( s.dataType === "script" && s.cache === null ) {
if ( s.cache === false && type === "GET" ) {
var ts = now();
// try replacing _= if it is there
var ret = s.url.replace(rts, "$1_=" + ts + "$2");
// if nothing was replaced, add timestamp to the end
s.url = ret + ((ret === s.url) ? (rquery.test(s.url) ? "&" : "?") + "_=" + ts : "");
// If data is available, append data to url for get requests
if ( s.data && type === "GET" ) {
s.url += (rquery.test(s.url) ? "&" : "?") + s.
// Watch for a new set of requests
if ( s.global && ! jQuery.active++ ) {
jQuery.event.trigger( "ajaxStart" );
// Matches an absolute URL, and saves the domain
var parts = rurl.exec( s.url ),
remote = parts && (parts[1] && parts[1] !== location.protocol || parts[2] !== location.host);
// If we're requesting a remote document
// and trying to load JSON or Script with a GET
if ( s.dataType === "script" && type === "GET" && remote ) {
var head = document.getElementsByTagName("head")[0] || document.documentE
var script = document.createElement("script");
script.src = s.
if ( s.scriptCharset ) {
script.charset = s.scriptC
// Handle Script loading
if ( !jsonp ) {
var done =
// Attach handlers for all browsers
script.onload = script.onreadystatechange = function() {
if ( !done && (!this.readyState ||
this.readyState === "loaded" || this.readyState === "complete") ) {
success();
complete();
// Handle memory leak in IE
script.onload = script.onreadystatechange =
if ( head && script.parentNode ) {
head.removeChild( script );
// Use insertBefore instead of appendChild to circumvent an IE6 bug.
// This arises when a base node is used (#2709 and #4378).
head.insertBefore( script, head.firstChild );
// We handle everything using the script element injection
上面的代码第1行到第10行:判断是JSON类型调用,为本次调用创建临时的JsonP方法,并且添加了一个随机数字,这个数字源于用日期值;
&关注第14行,这一行相当关键,注定了我们的结果最终是&Script& ;然后是构造Script片段,第95行在Head中添加该片段,修成正果;
&不仅仅是jQuery,很多js框架都是用了同样的跨域方案,这就是getJSON跨域的原理。
更多精彩内容,请点击,进行深入学习和研究。
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。
您可能感兴趣的文章:
大家感兴趣的内容
12345678910
最近更新的内容
常用在线小工具温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!&&|&&
主要从事软件项目的从前端到数据库全流程开发,熟练使用oracle、mysql等数据库以及radis缓存技术。
LOFTER精选
网易考拉推荐
用微信&&“扫一扫”
将文章分享到朋友圈。
用易信&&“扫一扫”
将文章分享到朋友圈。
阅读(4143)|
用微信&&“扫一扫”
将文章分享到朋友圈。
用易信&&“扫一扫”
将文章分享到朋友圈。
历史上的今天
在LOFTER的更多文章
loftPermalink:'',
id:'fks_',
blogTitle:'Ajax跨域问题浏览器兼容性的模拟和解决',
blogAbstract:'\r\nOrigin null is not allowed by Access-Control-Allow-Origin.Uncaught SyntaxError: Unexpected token在跨域问题中,这个提示基本没有作用,除了查看网上的解决方案我们还有必要进行的是模拟相应的环境。&Origin null is not allowed by Access-Control-Allow-Origin. 提示这是一个跨域访问的问题。&一般在IE浏览器下采用ajax提交不会出现该问题,有很多人提出用jsonp来实现,我是没有成功的,&最终的仍旧采用一个简单的ajax进行实现(其实我一直怀疑后台存在的问题在形象前台的兼容性):\r\n&跨域的问题困了我将近一天,最后决定进行模拟,找出前台和后台寻在的一些问题,事实证明确实找到了。',
blogTag:'javascript,ajax,跨域访问,jquery',
blogUrl:'blog/static/',
isPublished:1,
istop:false,
modifyTime:1,
publishTime:7,
permalink:'blog/static/',
commentCount:0,
mainCommentCount:0,
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:'主要从事软件项目的从前端到数据库全流程开发,熟练使用oracle、mysql等数据库以及radis缓存技术。',
hmcon:'1',
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跨域问题的实例
解决ajax跨域问题的实例
要解决ajax跨域问题,网上给出的方法有二:
1是构建服务器端的代理。简而言之,就是ajax中调用的实质还是本机的url,而服务器端替js去取回远端地址。
2.利用script标记,生成一个标签。在js加载完成后,再执行后续操作。
就是将原来新建xmlHTTPrequest对象的操作改成了新建script标签的操作.
这里给出一个例子:
var& Ajah=function(url,varname,handleSuccess,handleFailure){ &&&&&&& /** &&&&&&& * handleSuccess,handleFailure must be functions &&&&&&& * */ &&&&&&& script = document.createElement(&script&); &&&&&&& script.src= &&&&&&& var handler = function(str) &&&&&&& { &&&&&&&&&&&&&&& handleSuccess(str); &&&&&&& } &&&&&&& script.onload = function() &&&&&&& { &&&&&&&&&&&&&&& var json=eval(varname); &&&&&&&&&&&&&&& handler(json); &&&&&&& } &&&&&&& if(window.ie) &&&&&&& { &&&&&&&&&&&&&&& script.onreadystatechange = function() &&&&&&&&&&&&&&& { &&&&&&&&&&&&&&&&&&&&&&& if(script.readyState=='complete'||script.readyState== 'loaded') &&&&&&&&&&&&&&&&&&&&&&& { &&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& var json=eval(varname); &&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& if(typeof json != 'undefined') &&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& { &&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& handler(json); &&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& } &&&&&&&&&&&&&&&&&&&&&&& } &&&&&&&&&&&&&&& } &&&&&&& } &&&&&&& document.body.appendChild(script); }
而在网页中应这样调用:
#demo.html
&pre& &!DOCTYPE html PUBLIC &-//W3C//DTD HTML 3.2//EN&& &html& &head& & &meta name=&generator& content= & &HTML Tidy for Linux (vers 1 September 2005), see www.w3.org&& & & &title&&/title& &&&&&&& &script src=&mootools.js&&&/script& &&&&&&& &script src=&ajah.js&&&/script& &/head& & &body& &script& var ajah=new Ajah(&data.js&,&json198&,function(str){ &&&&&&& console.debug(&returned:&); &&&&&&& console.debug(str); }, function(str){}); &/script& &/body& &/html& &/pre&
被调用的数据文件如下
var json198=&hello,this is json198&;funciton Ajah(url,varname,handleSuccess,handleFailure){&}Ajah这个构造函数调用四个参数:url:远端地址varname:远端返回数据的变量名handleSuccess:加载完毕后加载的函数handleFailure:暂时没用上
Copyright & 2016 phpStudy2108人阅读
& &接下来写的都是我自己学习中的一点小经验,如果有不对的地方或者有什么好的建议或意见,请前辈们指点一下~
& &Ajax跨域和不跨域这个问题,几乎2个星期才搞出来,没办法,用到的知识全部自学的,只能百度一点点解决问题。
& &前端页面我是用html5+css3写的,引进jquery&mobile,这个我也要百度慢慢学习。
& &大学四年白学习了,一直以为前端页面不能调式,每次写代码都是很认真,不敢出错,因为一旦出错,很难发现原因,以前少了一个逗号,我花了一天时间才找到,唉~
& &一、调试前端页面
& & & &在浏览器中运行页面,然后按“F12”,就可以对自己写的页面进行调试了。具体怎么调试,自己摸索一下就可以了,真得是方便多了,真恨自己没有早点知道。
& 二、Ajax不跨域
& & & Ajax中的不跨域问题很好解决的,百度上有很多方法,但是对于新手来说,看了之后可能会一头雾水,现在给出我的具体解决方法。
& & & 在myEclipse中建一个web项目:html页面传参数到jsp页面,jsp页面返回值(注意:此处返回值是1或0,不是json数据类型)
&userLogin.html
&index.jsp
简单的跨域就这样实现了~
& 三、Ajax跨域
& & & &什么是跨域?我暂时是这样理解的,就是在不同的域名下实现数据交互。现在我的userLogin.html 页面是放在Eclipse下的Android项目下的,index.jsp位置不
变。对跨域中两个页面稍作改变就可以解决跨域问题了。
1、userLogin.html页面中js部分做如下改变:
2、index.jsp页面中修改两个地方就可以了
(1)加上这一句 &&
& & ..................................
/** 获取jsonp的回调函数名 **/
//String callback = request.getParameter(&callback&);
...............
(2)返回值的类型改成json类型,这个地方就是我一直没有成功的原因,后来百度知道了要将返回值改成json类型,也有人告诉我不是json类型也可以实现跨域,但是我没有成功。
.............
if(b!=0){out.println(callback+&('1')&); //返回值json类型}else{ out.println(callback+&('0')&); //返回值json类型}............Ajax跨域的问题也就这样解决了。希望大家多多指点~
&&相关文章推荐
参考知识库
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:2389次
排名:千里之外

我要回帖

更多关于 待报解预算收入 的文章

 

随机推荐