跨域请求的方式有很多种,
1,iframe
2,document.domain
3,window.name
4,script
5,XDomainRequest (IE8+)
6,XMLHTTPRequest (Firefox3.5+)
7,postMessage (HTML5)
8,后台代理
...
1.jsonp
其实 jsonp 是个很简单的一个东西。
主要是利用了 <script/> 标签对 javascript 文档的动态解析来实现。(其实也可以用eval函数)
<html xmlns="http://www.w3.org/1999/xhtml" >
<head>
<title>Test Jsonp</title>
<script type="text/javascript">
function jsonpCallback(result)
{
alert(result.msg);
}
</script>
<script type="text/javascript" src="http://uefirst.com/jsonServerResponse?jsonp=jsonpCallback"></script>
</head>
<body>
</body>
</html>
其中 jsonCallback 是客户端注册的,获取跨域服务器上的json数据后,回调的函数。 uefirst.com/jsonServerResponse?jsonp=jsonpCallback 这个 url 是跨域服务器取 json 数据的接口,参数为回调函数的名字,返回的格式为
jsonpCallback({msg:'this is json data'})Jsonp原理:
首先在客户端注册一个callback, 然后把callback的名字传给服务器。
此时,服务器先生成 json 数据。
然后以 javascript 语法的方式,生成一个function , function 名字就是传递上来的参数 jsonp.
最后将 json 数据直接以入参的方式,放置到 function 中,这样就生成了一段 js 语法的文档,返回给客户端。
客户端浏览器,解析script标签,并执行返回的 javascript 文档,此时数据作为参数,传入到了客户端预先定义好的 callback 函数里.(动态执行回调函数)
2.动态加载js
动态加载js数据
例如数据服务器有个页面a.com/1.php输出数据如下:
Summary:{pages:1,page:1,total:1,hqtime:"20110422150108"},
Column:{id:0,code:1,name:2,lcp:3,np:4,hlp:5,pl:6,scnt:7,ta:8,tm:9},
HqData:[
["1208","1208","黑龙江省",12.48,12.42,-0.06,-0.47,33,2182408,224596.97]
]
};
调取页面b.com/1.html
function GetJsData(src,callback){var head=document.getElementsByTagName("head")[0];
var js=document.createElement("script");
js.setAttribute("src",src);
js.onload=js.onreadystatechange=function(){
if(!this.readyState||this.readyState=="loaded"||this.readyState=="complete"){
head.removeChild(js);
if(callback) callback();
}
}
head.appendChild(js);
}
GetJsData('http://a.com/1.php',function(){
//加载完成...
if(hqs2){
var total = hqs2.Summary.total;
alert(hqs2.HqData[0][hqs2.Column.name]);
}
});
//返回:黑龙江省
3.通过服务器中转
如asp.net服务端1.aspx
public static string getContent(string url){
string strContent = "";
WebResponse response = null;
Stream stream = null;
StreamReader reader = null;
HttpWebRequest requestiid = null;
try
{
requestiid = (HttpWebRequest)WebRequest.Create(url);
requestiid.Timeout = 30000;
response = requestiid.GetResponse();
stream = response.GetResponseStream();
reader = new StreamReader(stream, System.Text.Encoding.Default);
strContent = reader.ReadToEnd().ToString();
}
catch (Exception ex)
{
//return null;
}
finally
{
if (reader != null) reader.Close();
if (stream != null) stream.Close();
if (response != null) response.Close();
if (requestiid != null) requestiid.Abort();
}
return strContent;
}
Response.Write("http://a.com/1.js");
这样就可以用普通ajax方式读取1.aspx了
本文链接
1、英文字母自动换行:
本文链接
MergeJSAndCss
git地址:https://github.com/wyzwhp/MergeJSAndCss/
网站前端优化,主要功能是动态的合并js和css 基本原理是把多个js文件(或者css文件)合并成一个文件,网页访问的时侯减少js和css文件的请求,同时把文件内容进行必要的压缩。
测试地址: js合并 http://localhost:3000/js?file=http://x.libdd.com/farm1/a05baa/fde6509f/jquery.mousewheel-3.0.6.pack.js,http://x.libdd.com/farm1/08871e/95134743/jquery.fancybox-buttons.js&type=&host= css合并 http://localhost:3000/css?file=http://common.cnblogs.com/Skins/LessIsMore/style.css?id=20121228,http://news.sina.com.cn/css/stencil_v2/public_101122.css|gbk&type=&host=
参数说明: file 是需要合并的文件路径地址,多个文件之间用“,”分割,另外有可能出现文件乱码的问题,对于非utf-8编码的页面可以增加编码字符串,例子:http://news.sina.com.cn/css/stencil_v2/public_101122.css|gbk type type有两个值debug和release,debug只是单纯的文件合并,release是是否压缩另存到服务器上 host host对于没有指定域名的文件起作用,多数情况可以不用,除非在QueryString字符串超长的时候可以用它来减少一下长度
另外该程序在cache方面还有优化的余地,现在是读取的硬盘文件不是读取cache,以后再优化,也欢迎大家多提宝贵意见,谢谢。
备注:在代码运行的时候需要增加个ts的文件夹,否则在release的就报错了。
本文链接