jAn*_*ndy 65 javascript ajax jquery json jsonp
我知道AJAX跨域策略.因此,我不能仅通过ajax HTTP请求调用" http://www.google.com "并在我的网站上的某处显示结果.
我尝试使用dataType"jsonp",它实际上会工作,但我得到一个语法错误(显然因为收到的数据不是JSON格式化)
是否还有其他可能从外部域接收/显示数据?iFrame遵循相同的政策?
Tat*_*nen 66
使用AJAX获取跨域数据的唯一(简单)方法是使用服务器端语言作为代理,如Andy E所述.这里有一个小例子如何使用jQuery实现它:
jQuery部分:
$.ajax({
url: 'proxy.php',
type: 'POST',
data: {
address: 'http://www.google.com'
},
success: function(response) {
// response now contains full HTML of google.com
}
});
Run Code Online (Sandbox Code Playgroud)
和PHP(proxy.php):
echo file_get_contents($_POST['address']);
Run Code Online (Sandbox Code Playgroud)
就那么简单.请注意您对刮削数据的能力或不能做什么.
alu*_*nny 19
您需要在引用数据的页面中动态插入脚本标记.使用JSONP,您可以在脚本加载时执行一些回调函数.
JSONP上的维基百科页面有一个简洁的例子; 脚本标签:
<script type="text/javascript" src="http://domain1.com/getjson?jsonp=parseResponse">
</script>
Run Code Online (Sandbox Code Playgroud)
将返回包含在调用中的JSON数据parseResponse:
parseResponse({"Name": "Cheeso", "Rank": 7})
Run Code Online (Sandbox Code Playgroud)
(取决于getjsondomain1.com上脚本的配置)
动态插入标记的代码如下:
var s = document.createElement("script");
s.src = "http://domain1.com/getjson?jsonp=parseResponse";
s.type = "text/javascript";
document.appendChild(s);
Run Code Online (Sandbox Code Playgroud)
小智 16
您可以使用YQL来执行请求,而无需托管您自己的代理.我做了一个简单的函数,以便更容易运行命令:
function RunYQL(command, callback){
callback_name = "__YQL_callback_"+(new Date()).getTime();
window[callback_name] = callback;
a = document.createElement('script');
a.src = "http://query.yahooapis.com/v1/public/yql?q="
+escape(command)+"&format=json&callback="+callback_name;
a.type = "text/javascript";
document.getElementsByTagName("head")[0].appendChild(a);
}
Run Code Online (Sandbox Code Playgroud)
如果你有jQuery,你可以改用$ .getJSON.
样本可能是这样的:
RunYQL('select * from html where url="http://www.google.com/"',
function(data){/* actions */}
);
Run Code Online (Sandbox Code Playgroud)
And*_*y E 11
不幸的是(或者幸运的是)没有.跨域策略是有原因的,如果它很容易解决它,那么它作为安全措施就不会非常有效.除了JSONP之外,唯一的选择是使用您自己的服务器代理页面.
使用iframe,它们受制于相同的政策.当然,您可以显示来自外部域的数据,您无法操纵它.
| 归档时间: |
|
| 查看次数: |
135189 次 |
| 最近记录: |