我使用这段代码进行跨域ajax调用,我希望它能在这里提供更多帮助。我使用的是prototype library,您也可以使用jquery或dojo或其他任何工具:
步骤1:创建一个新的js文件并将这个类放入其中,我将其称为xss_ajax.js
var WSAjax = Class.create ({
initialize: function (_url, _callback){
this.url = _url ;
this.callback = _callback ;
this.connect () ;
},
connect: function (){
var script_id = null;
var script = document.createElement('script');
script.setAttribute('type', 'text/javascript');
script.setAttribute('src', this.url);
script.setAttribute('id', 'xss_ajax_script');
script_id = document.getElementById('xss_ajax_script');
if(script_id){
document.getElementsByTagName('head')[0].removeChild(script_id);
}
// Insert into DOM
document.getElementsByTagName('head')[0].appendChild(script);
},
process: function (data){
this.callback(data) ;
}
}) ;
这个类创建一个动态脚本元素,src attributes以json数据提供程序为目标(事实上,json-p作为远程服务器必须以这种格式提供数据::call_back_function(//json_data_here)::因此,当创建脚本标记时,json将直接作为函数进行求值(我们将在步骤2中讨论将回调方法名传递给服务器的问题,其背后的主要概念是类似脚本的img元素不受sop约束的影响。
第二步:在任何一个html页面中,如果你想异步拉json(我们称之为ajaj~asynchronous javascript+json:-)而不是使用xhttprequest对象的ajax),请执行如下操作
//load Prototype first
//load the file you've created in step1
var xss_crawler = new WSAjax (
"http://your_json_data_provider_url?callback=xss_crawler.process"
, function (_data){
// your json data is _data and do whatever you like with it
}) ;
你还记得第一步的回调吗?因此,我们将它传递给服务器,它将返回嵌入该方法中的json,因此在我们的示例中,服务器将返回一个可评估的javascript代码xss_crawler.process(//the_json_data),请记住xss_crawler是wsajax类的一个实例。服务器代码取决于您(如果是您的话),但是大多数ajax数据提供者允许您像我们一样在参数中指定回调方法。
在ruby on rails中,我刚刚做到了
render :json=>MyModel.all(:limit=>10), :callback => params[:callback],:content_type => "application/json"
仅此而已,您现在可以从应用程序(小部件、地图等)中提取另一个域中的数据,只使用json格式,别忘了。
我希望它是有用的,谢谢你的耐心:-),和平和抱歉的代码格式化,它不太好用。