主题:[原创]解决跨域post提交表单、Ajax跨域、无刷新(Asp.net,IE8为例)
现在www.a.com有luck.html 这个页面要获取 www.b.com 某些数据, 可以通过JS 的src 属性获得
1、获取数据
在luck.html 页面的body 标签之间写入
<script charset="utf-8" id="cmscript" src="http://www.b.com/super.js" ></script>
charset 这个是编码 根据个人需要修改.
super.js 是b.com下自己需知道的相关数据提取途径的JS文件, 因为JavaScript的src属性是不存在跨域的,所以用他来跨域获取数据是非常方便的。
这样就可以获取b.com 的数据了,当然这两个域名页面如何传参,用什么文件你是要知道的。(都是你开发的差不多吧)
获取数据是比较简单的,但是提交数据呢?
2、提交数据
2.1 Ajax 跨域提交
假设super.js 这个文件返回给luck.html 页面的是评论框,像我们在博客里,论坛里,对文章的可以评论的那个输入内容及发表评论的按钮。
有2个非常简单的jQuery方法,也是我在网上我搜的结果出现最多的。jQuery.getScript() JQuery.getJSON()
这两个都可以跨域只是返回的数据格式不一样。
以下例子
super.js
jQuery.getScript("http://www.b.com/super.aspx?评论内容='aaaa'", function () {
alert(json.msg);
});
json.msg 是哪里来的呢?
super.aspx
protected void Page_Load(object sender, EventArgs e)
{
Response.Write("var json = {msg:'" + rmsg +"'}");
Response.End();
}
json.msg 就是处理页面输出的.
这样就可以返回你想要的数据了.当然这里我是以aspx为处理文件 你可以改ashx为处理文件。
getScript 也是可以返回JSON格式的..(不了解Json格式上网找找哦)
getJSON 也是一样的.
或者你不想返回JSON 只需返回一个值
在super.js 下 定义一个变量 如 var temp;
在super.aspx
Response.Write("var temp=5");
Response.End();
就可以了。
http://www.b.com/super.aspx?评论内容='aaaa'
这个是提交数据的url。
现在了解到的是完全可以跨域从将a.com 的数据提交到b.com并且返回数据的。
问题是url的长度是有限制的,
假设
评论内容='aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa'
甚至更多,服务器就收不到了。
因为getScript getJSON 是以get 方式提交的,get是有限制的。
2.2 post提交表单
2.1中的情况可以满足几百字节数据的跨域提交但是超过就不行了。
所以现在需要用post提交。
开始也跟大家说了 super.js是返回评论输入框和发表按钮。所以在写代码当然是在super.js下修改如何提交的代码。
主要就是发表按钮的onclick事情。
document.getElementById("formtextarea").value = encodeURI(o_txt);
document.getElementById("form1").action ="请求地址";
document.getElementById("form1").submit();
jQuery.getScript("请求地址", function () {
if(json.msg=='ok')
{
//do something
window.location.href.reload; //后面讲解
}
});
当submit之后 你的post数据已经发到处理页面(super.aspx),将post的数据是否成功的代码 1成功 2 失败 存进session
注意: post 后是获取不了返回的数据的。有另外一种方式比较麻烦而且不实用我就不多说了。
所以在次跨域请求,这次请求是判断刚session的数据是1或者2,获取返回数据输出就可以了。
form1 是在super.js 输出给luck.html 页面的form . 这里有个重点,表单form提交之后会进行跳转刷新,如果你不想刷新。
在这里你必须在super.js 输出的时候定义一个隐藏的iframe 将form 的target 属性指向你定义的iframe
<iframe name="framesubmit" id="framesubmit" style="display:none" width="1" height="1" ></iframe>
<form method="post" target="framesubmit" name="form1" id="form1" style="display:none"></form>
最后会发现虽然可以 但是每次都会弹出一个提示框 告诉你 ,如果要提交的话比较按确定刷新之类的提示。
因为是postback的问题,你也没有刷新,必须刷新ie才知道你提交过。
所以window.location.href.reload; 这句话就是解决这个问题。。
完毕..
当然针对不同浏览器大家都需要注意的..
1、获取数据
在luck.html 页面的body 标签之间写入
<script charset="utf-8" id="cmscript" src="http://www.b.com/super.js" ></script>
charset 这个是编码 根据个人需要修改.
super.js 是b.com下自己需知道的相关数据提取途径的JS文件, 因为JavaScript的src属性是不存在跨域的,所以用他来跨域获取数据是非常方便的。
这样就可以获取b.com 的数据了,当然这两个域名页面如何传参,用什么文件你是要知道的。(都是你开发的差不多吧)
获取数据是比较简单的,但是提交数据呢?
2、提交数据
2.1 Ajax 跨域提交
假设super.js 这个文件返回给luck.html 页面的是评论框,像我们在博客里,论坛里,对文章的可以评论的那个输入内容及发表评论的按钮。
有2个非常简单的jQuery方法,也是我在网上我搜的结果出现最多的。jQuery.getScript() JQuery.getJSON()
这两个都可以跨域只是返回的数据格式不一样。
以下例子
super.js
jQuery.getScript("http://www.b.com/super.aspx?评论内容='aaaa'", function () {
alert(json.msg);
});
json.msg 是哪里来的呢?
super.aspx
protected void Page_Load(object sender, EventArgs e)
{
Response.Write("var json = {msg:'" + rmsg +"'}");
Response.End();
}
json.msg 就是处理页面输出的.
这样就可以返回你想要的数据了.当然这里我是以aspx为处理文件 你可以改ashx为处理文件。
getScript 也是可以返回JSON格式的..(不了解Json格式上网找找哦)
getJSON 也是一样的.
或者你不想返回JSON 只需返回一个值
在super.js 下 定义一个变量 如 var temp;
在super.aspx
Response.Write("var temp=5");
Response.End();
就可以了。
http://www.b.com/super.aspx?评论内容='aaaa'
这个是提交数据的url。
现在了解到的是完全可以跨域从将a.com 的数据提交到b.com并且返回数据的。
问题是url的长度是有限制的,
假设
评论内容='aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa'
甚至更多,服务器就收不到了。
因为getScript getJSON 是以get 方式提交的,get是有限制的。
2.2 post提交表单
2.1中的情况可以满足几百字节数据的跨域提交但是超过就不行了。
所以现在需要用post提交。
开始也跟大家说了 super.js是返回评论输入框和发表按钮。所以在写代码当然是在super.js下修改如何提交的代码。
主要就是发表按钮的onclick事情。
document.getElementById("formtextarea").value = encodeURI(o_txt);
document.getElementById("form1").action ="请求地址";
document.getElementById("form1").submit();
jQuery.getScript("请求地址", function () {
if(json.msg=='ok')
{
//do something
window.location.href.reload; //后面讲解
}
});
当submit之后 你的post数据已经发到处理页面(super.aspx),将post的数据是否成功的代码 1成功 2 失败 存进session
注意: post 后是获取不了返回的数据的。有另外一种方式比较麻烦而且不实用我就不多说了。
所以在次跨域请求,这次请求是判断刚session的数据是1或者2,获取返回数据输出就可以了。
form1 是在super.js 输出给luck.html 页面的form . 这里有个重点,表单form提交之后会进行跳转刷新,如果你不想刷新。
在这里你必须在super.js 输出的时候定义一个隐藏的iframe 将form 的target 属性指向你定义的iframe
<iframe name="framesubmit" id="framesubmit" style="display:none" width="1" height="1" ></iframe>
<form method="post" target="framesubmit" name="form1" id="form1" style="display:none"></form>
最后会发现虽然可以 但是每次都会弹出一个提示框 告诉你 ,如果要提交的话比较按确定刷新之类的提示。
因为是postback的问题,你也没有刷新,必须刷新ie才知道你提交过。
所以window.location.href.reload; 这句话就是解决这个问题。。
完毕..
当然针对不同浏览器大家都需要注意的..