废话不说,直接进入主题吧:
第一种:代理
具体做法是在本地服务器建立一个代理脚本(如PHP),这个脚本可以将接收到的数据(GET或者POST)通过CURL(或者还有其他的方式)发送到目的服务器。
第二种:隐藏框架
现在通常使用的是iframe。
第三种:动态IMG标签
这种方法简单,适合那种只是需要往服务器端发送信息的场合(如PV统计,点击统计等)
- var tmp = new Image();
- tmp.src = "{your url}";
第四种:动态SCRIPT标签
具体做法看下面的代码:
- function JSONscriptRequest(fullUrl) {
-
- this.fullUrl = fullUrl;
-
- this.noCacheIE = '&noCacheIE=' + (new Date()).getTime();
-
- this.headLoc = document.getElementsByTagName("head").item(0);
-
- this.scriptId = 'JscriptId' + JSONscriptRequest.scriptCounter++;
- }
- JSONscriptRequest.scriptCounter = 1;
- JSONscriptRequest.prototype.buildScriptTag = function () {
-
- this.scriptObj = document.createElement("script");
-
-
- this.scriptObj.setAttribute("type", "text/javascript");
- this.scriptObj.setAttribute("charset", "utf-8");
- this.scriptObj.setAttribute("src", this.fullUrl + this.noCacheIE);
- this.scriptObj.setAttribute("id", this.scriptId);
- }
-
- JSONscriptRequest.prototype.removeScriptTag = function () {
-
- this.headLoc.removeChild(this.scriptObj);
- }
- JSONscriptRequest.prototype.addScriptTag = function () {
-
- this.headLoc.appendChild(this.scriptObj);
- }
一个使用的例子:
- function callbackfunc(jsonData) {
- alert('Latitude = ' + jsonData.ResultSet.Result[0].Latitude +
- ' Longitude = ' + jsonData.ResultSet.Result[0].Longitude);
- aObj.removeScriptTag();
- }
- request = 'http:
- output=json&callback=callbackfunc&location=78704';
- aObj = new JSONscriptRequest(request);
- aObj.buildScriptTag();
- aObj.addScriptTag();
经过测试,上面的方法的确可以进行跨域访问,但是有几个问题:
1,请求的时候需要调用三个方法,而这三个方法显然是可以封装在一起的。
2,在callback函数中居然还要调用removeScriptTag方法,这是我最不希望看到的。
3,在遨游浏览器中callback无效。(在IE7上没有问题,但是一切换到遨游上测试就无效,至今还搞不清楚是怎么回事。后来延迟一下执行请求的函数居然就可以了,相当于延迟执行上面的第9~11行代码)
4,学习了jQuery的源码之后,显然对这种写法很不满。
自己尝试封装如下(注:还没有经过充分测试,呵呵):(点击下载)
使用方法如下:
- function callback(data){
-
- }
- url = 'your url';
- JSRQuery(url,callback);
这样使用起来就简单多了。
PS:在jquery源码里有出现过很多jsonp,上网一查据说是JSON with Padding的简称(见:http://www.cn-cuckoo.com/2008/09/13/the-origin-of-jsonp-262.html)