如何使用JavaScript从另一台服务器获取数据?
如何使用用户浏览器中的JavaScript向其他服务器发出请求(即从任何所需服务器获取页面)?对于像XMLHttpRequest这样的方法,有一些限制可以防止出现这种情况,有没有办法绕过它们或其他方法 这是一个一般性的问题,特别是我想检查一系列随机网站,看看它们是否包含某个元素,因此我需要一个网站的HTML内容,而无需下载任何其他文件;所有这些都在JavaScript文件中,服务器上没有任何转发或代理机制 (注意:一种方法是使用Greasemonkey及其GMxmlHttpRequest。)您应该查看。它有一个丰富的基础,可以给你的权力做这一切。您可以加载一个外部页面,并用直观的方式解析它的HTML内容 使用如何使用JavaScript从另一台服务器获取数据?,javascript,cross-domain,Javascript,Cross Domain,如何使用用户浏览器中的JavaScript向其他服务器发出请求(即从任何所需服务器获取页面)?对于像XMLHttpRequest这样的方法,有一些限制可以防止出现这种情况,有没有办法绕过它们或其他方法 这是一个一般性的问题,特别是我想检查一系列随机网站,看看它们是否包含某个元素,因此我需要一个网站的HTML内容,而无需下载任何其他文件;所有这些都在JavaScript文件中,服务器上没有任何转发或代理机制 (注意:一种方法是使用Greasemonkey及其GMxmlHttpRequest。)您应
$.get()的示例代码>
对于外部域,我必须编写一个作为中间人的本地PHP脚本。jQuery将调用本地PHP脚本作为参数传入另一台服务器的URL,本地PHP脚本将收集数据,jQuery将从本地PHP脚本读取数据
$.get("middleman.php", {"site":"http://www.google.com"}, function(results){
alert(results); // middleman gives Google's HTML to jQuery
});
给middleman.php一些类似于
<?php
// Do not use as-is, this is only an example.
// $_GET["site"] set by jQuery as "http://www.google.com"
print file_get_contents($_GET["site"]);
?>
您需要在服务器上编写一个代理才能执行此操作。所有请求都将发送到您的服务器,然后您的服务器将加载html并将其发送回客户端。而且没有好的方法仅通过javascript实现这一点。
jQuery包含使用XmlHttpRequest加载JSON数据或外部脚本的功能,但此功能不能用于html页面。您还可以检查jQuery邮件列表。编写一个代理脚本,从您的域沿http请求转发,这将绕过XMLHttpRequest限制
如果您使用的是PHP,只需使用cURL来请求和读取页面,然后简单地吐出html,就像它来自您的域一样。您还可以使用iframe来模拟ajax请求。这就省去了为前端问题编写后端解决方案的麻烦。以下是一个例子:
function setUploadEvent(typeComponet){
var eventType = "";
var iframe = document.getElementById("iframeId");
try{
/* for Mozilla / Opera9 */
if (/(?!.*?compatible|.*?webkit)^mozilla|opera/i.test(navigator.userAgent)) {
eventType = "onload";
}else{
/* IE */
eventType = "onreadystatechange";
}
iframe[eventType] = function(){
var doc = iframe.contentDocument || iframe.contentWindow.document;
var response = doc.body.innerHTML; /* or what ever content you are looking for */
}
}
catch(e){
alert("Error loading content")}
}
这应该能奏效。请注意,浏览器检测行不是最干净的,您绝对应该使用所有最常见的JS框架(Prototype、JQuery等)中提供的检测行。
您可以将数据以数组、JSON或类似形式添加到中的hello.js中。例子:
var daysInMonth=新数组(31,28,31,30,31,30,31,31,30,31)
从另一台服务器获取JavaScript并不简单…:-)
2018年更新:
您只能在以下4个条件下跨域访问
- 响应标头具有访问控制允许原点:
演示
$.ajax({
网址:'https://api.myjson.com/bins/bq6eu',
成功:功能(响应){
log(response.string);
},
错误:函数(响应){
log('server error');
}
})
这很容易。。。如果你知道这个“秘密”把戏,几乎没有人会分享
它叫Yahoo yql
因此,为了重新获得“用户的权力”(并回到方便的咒语:“永远不要接受不”),只需使用(而不是php?代理服务器端脚本)。jQuery并不是严格需要的 示例1:
使用类似SQL的命令:
select * from html
where url="http://stackoverflow.com"
and xpath='//div/h3/a'
下面的链接将为最新的问题(绕过跨域安全bull$#!7)提供答案:如您所见,这将返回一个JSON数组(也可以选择xml)并调用回调函数:
cbfunc
事实上,作为一种“奖励”,您还可以在每次不需要从“标记汤”中提取正则表达式数据时使用它
你听到你内心的疯狂科学家开始咯咯地笑了吗
然后查看更多信息(不要忘记更多示例的注释)
祝你好运 非常感谢,这真是个好把戏。我是这样做的: test.html
<!DOCTYPE html>
<html>
<head>
<script>
function loadXMLDoc()
{
if (window.XMLHttpRequest)
{// code for IE7+, Firefox, Chrome, Opera, Safari
xmlhttp=new XMLHttpRequest();
}
else
{// code for IE6, IE5
xmlhttp=new ActiveXObject("Microsoft.XMLHTTP");
}
xmlhttp.onreadystatechange=function()
{
if (xmlhttp.readyState==4 && xmlhttp.status==200)
{
document.getElementById("myDiv").innerHTML=xmlhttp.responseText;
}
}
xmlhttp.open("GET","sp.php",true);
xmlhttp.send();
}
</script>
</head>
<body>
<h2>Using the XMLHttpRequest object</h2>
<div id="myDiv"></div>
<button type="button" onclick="loadXMLDoc()">Change Content</button>
</body>
</html>
函数loadXMLDoc()
{
if(window.XMLHttpRequest)
{//IE7+、Firefox、Chrome、Opera、Safari的代码
xmlhttp=新的XMLHttpRequest();
}
其他的
{//IE6、IE5的代码
xmlhttp=新的ActiveXObject(“Microsoft.xmlhttp”);
}
xmlhttp.onreadystatechange=函数()
{
if(xmlhttp.readyState==4&&xmlhttp.status==200)
{
document.getElementById(“myDiv”).innerHTML=xmlhttp.responseText;
}
}
open(“GET”,“sp.php”,true);
xmlhttp.send();
}
使用XMLHttpRequest对象
更改内容
sp.php
<?php
print file_get_contents("http://your.url.com/you-can-use-cross-domain");
?>
@mmattax,检查我的最后一段。你提到“在某些情况下”-其他情况是什么?(注意:我已经更新了问题,排除了中间人服务器脚本。)@petersidor,有些网站不允许来自其他域的javascript访问。所以你需要合并file_get_contents()或其他类似的方法来获取他们的HTML。@乔纳森:更正,任何网站都不允许来自另一个[top-level]域的javascript访问。对于一般问题,这似乎是一个可接受的解决方案,所以我对此投了赞成票;不幸的是,它没有完全涵盖我的具体问题,因此我无法将其标记为最终解决方案。您需要服务器端代码来实现这一点,跨域请求是一个安全漏洞,不仅难以避免这种情况,而且您根本不应该这样做。使用一个简单的后端,比如PHP,甚至像Sinatra。现在,这看起来更像它-将试用并报告,已经投票通过了。它可能看起来很粗糙,但有时,越简单越好试验;不幸的是,浏览器不允许从其他服务器访问带有网站的iframe的属性。因此,这与XMLHttpRequest的问题基本相同,因此,我的问题似乎不可能解决想要的是一种使用JavaScript脚本从另一台服务器获取数据的方法,但很有趣。:)请参阅我关于如何向ex添加数据的更新
<?php
print file_get_contents("http://your.url.com/you-can-use-cross-domain");
?>