Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/qt/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何使用JavaScript从另一台服务器获取数据?_Javascript_Cross Domain - Fatal编程技术网

如何使用JavaScript从另一台服务器获取数据?

如何使用JavaScript从另一台服务器获取数据?,javascript,cross-domain,Javascript,Cross Domain,如何使用用户浏览器中的JavaScript向其他服务器发出请求(即从任何所需服务器获取页面)?对于像XMLHttpRequest这样的方法,有一些限制可以防止出现这种情况,有没有办法绕过它们或其他方法 这是一个一般性的问题,特别是我想检查一系列随机网站,看看它们是否包含某个元素,因此我需要一个网站的HTML内容,而无需下载任何其他文件;所有这些都在JavaScript文件中,服务器上没有任何转发或代理机制 (注意:一种方法是使用Greasemonkey及其GMxmlHttpRequest。)您应

如何使用用户浏览器中的JavaScript向其他服务器发出请求(即从任何所需服务器获取页面)?对于像XMLHttpRequest这样的方法,有一些限制可以防止出现这种情况,有没有办法绕过它们或其他方法

这是一个一般性的问题,特别是我想检查一系列随机网站,看看它们是否包含某个元素,因此我需要一个网站的HTML内容,而无需下载任何其他文件;所有这些都在JavaScript文件中,服务器上没有任何转发或代理机制

(注意:一种方法是使用Greasemonkey及其GMxmlHttpRequest。)

您应该查看。它有一个丰富的基础,可以给你的权力做这一切。您可以加载一个外部页面,并用直观的方式解析它的HTML内容

使用
$.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");
?>