jQuery Ajax读取状态0,响应文本为空,状态码为0,状态信息为错误。

16

我在使用这个代码:url(http://www.tutorialspoint.com/prototype/prototype_ajax_response.htm) 时,遇到了以下错误:jquery ajax readystate 0 responsetext status 0 statustext error。但是当我在本地主机上使用 url(localhost:""/embparse_page) 时,它却能够正常工作。

我已经尝试使用在谷歌搜索中找到的头文件,并使用了beforeSend:"",但仍然无法正常工作。

我认为主要问题是:"XMLHttpRequest cannot load http://www.tutorialspoint.com/prototype/prototype_ajax_response.htm. Origin "local server" is not allowed by Access-Control-Allow-Origin.",但我不明白这是什么意思。

请问有人能向我解释一下这个问题吗?因为我还比较新手。

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns:ng="http://angularjs.org">
<head>
    <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />
    <meta Access-Control-Allow-Origin="*" />
    <title>Page Parsing</title>
    <script type="text/javascript" src="/js/jquery-1.9.1.min.js"></script>
    <script>
    getit=function(){
        jQuery.support.cors = true;
        $.ajax({
            type:"GET",
            url:"http://www.tutorialspoint.com/prototype/prototype_ajax_response.htm",
            dataType:"html",
            crossDomain:true,
            beforeSend: function(xhr) {
                xhr.overrideMimeType('text/plain;charset=UTF-8');
            },
            success:function(XMLHttpRequest,jqXHR ,data) {
                //alert(data.title);
                var starttitl=data.lastIndexOf('<title>');
                var endtitl=data.lastIndexOf('</title>');
                var title1=data.substring(starttitl+7,endtitl);
                alert(title1);
            },
            error:function(errorStatus,xhr) {
                alert("Error"+JSON.stringify(errorStatus));
            }
        });
    }   
    </script>
</head>
<body>
    <div id="siteloader">
        <input type="button" onclick="getit()" />
    </div>
</body>
</html>

5
一个提示:不要使用alert,因为这是最烦人的调试方式。尝试使用console.log,并在Chrome中按下F12或在Firefox中按下Ctrl + Shift + K打开控制台。您可以在那里使用许多工具,例如设置断点和检查带有请求和响应标头的请求。 - HMR
感谢您的建议,先生。 - Dhirender Tyagi
这篇帖子中排名最高的答案非常深入:https://dev59.com/tmUp5IYBdhLWcg3w1qMi - Adrian
3
如果你在iOS设备上进行测试而没有Mac进行任何形式的远程调试,@HMR,在没有警报的情况下,你建议采用什么方法? - Ads
5个回答

21
我遇到了这个错误,但在我的情况下并不是由于同源策略。我从这个链接得到了一些帮助。其他可能的原因可以在这里中看到。
我的情况是,我有一个链接按钮,但我没有使用e.PreventDefault()
ASPX
<asp:LinkButton ID="lnkSearch" runat="server" CssClass="DockCmdSearch" CommandName="Search" OnClientClick="return VerifySearch(this, event);" />

JavaScript
function VerifySearch(sender, e) {        
    e.preventDefault();
    $.ajax({
                type: 'POST',
    .............
    }
    return false;
}

这篇帖子中排名最高的答案非常深入:https://dev59.com/tmUp5IYBdhLWcg3w1qMi - Adrian

0

同源策略。当您处于某个网站时,浏览器不允许访问其他来源的内容。

http://site1.com

连接到:

site2.com
sub.site1.com
site1:99.com
https://site1.com (not sure about this one)

这样可以防止site1窃取site2的内容并将其假扮为site1的内容。解决方法是使用JSONP(我认为Google Maps使用了它)和让site2提供cors头,但是jQuery 1.*(也许2.*也不支持)不支持cors,因为IE在实现它时存在一些问题。在这两种情况下,您需要site2与您的站点合作,以便您的站点可以显示其内容。

如果只有您自己使用,则可以使用Firefox并安装forcecors插件。要激活,可以选择查看=>工具栏=>添加栏,并单击屏幕右下角的“cors”文本。


但是我们可以通过使用cURL()在php中实现这个概念(可以从site1访问site2的内容)。因此,如果JavaScript中有类似的东西,请告诉我。 - Dhirender Tyagi
是的,您可以通过您的服务器代理请求,但这样做会侵犯您获取内容的网站的IP属性。一些大型超市网站曾经这样做,当另一个网站检测到时,他们向超市网站提供虚假信息,包括被切断头部的图片等。这是一种有趣而有效的方式,但也可能会有律师敲门找你。 - HMR
@DhirenderTyagi 如果site2不想让你的网站显示它的内容,或者想要但不在乎创建JSON API,那么通过php代理是一个选项。这不能在JavaScript中完成,因为JavaScript在浏览器中运行,而正是浏览器执行同源策略来保护站点免受其内容被其他站点获取和呈现的影响。至少使用代理方法,site2可以检测到来自相同IP的大量请求。 - HMR
同源策略并非为了保护知识产权而存在,它是一项总体安全特性。更多信息请参见此处:http://security.stackexchange.com/questions/8264/why-is-the-same-origin-policy-so-important - Andy Groff

0

我在使用Nginx(服务器端)和AngularJs(用户端)时遇到了同样的问题,就像其他开发者所说的那样,这是一个跨域问题。在这里,我想分享一下我是如何解决这个问题的,希望能对大家有所帮助;)
首先,我在我的Nginx配置文件中添加了以下几行代码(在Linux中 -> /etc/nginx/sites-available/your domain):

    add_header Access-Control-Allow-Origin *;
    add_header 'Access-Control-Allow-Credentials' 'true';
    add_header 'Access-Control-Allow-Methods' 'GET, POST, OPTIONS';
    add_header 'Access-Control-Allow-Headers' 'DNT,X-CustomHeader,Keep-Alive,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type';

使用AngularJS发送请求的方式如下:

        $http({
            method: "POST",
            data: { //params},
            url: "//address",
            headers: { //if its form data
                "Accept": "application/json",
                "Content-Type": "application/x-www-form-urlencoded",
                "Cache-Control": "no-cache"
            },
            crossDomain: true,
            contentType: false,
            processData: false
        }).then(function mySucces(response) {
            alert(JSON.stringify(response));
        }, function myError(response) {
            alert("error");
        });


0

我在我的Ajax调用中遇到了这个错误,解决方法就是加上'return false'。


-3

我正在测试读取一个txt/XML文件,以获取json/xml数据,并出现了错误...读取的值为:Status[0] & readyState[0]StatusText[error];。这在Internet Explorer上成功运行,但在Chrome上却不行,因为域名需要相同

以下是解决方法:

前往C:\WINDOWS\system32\drivers\etc\hosts

为您的本地主机应用程序命名:

127.0.0.1   SampleSiteName.com

现在在Chrome中打开代码,网址为http://SampleSiteName.com/YourAjaxFileName.htm(如果它打开了,那么说明您已经正确输入了主机名) 进入您的HTML文件,并给出您要读取的文件的相对地址(如果FileToBeRead.txtYourAjaxFileName.htm在同一个文件夹中,则只需输入url:“/FileToBeRead.txt”)

现在您的代码也可以在Chrome上运行。


我不明白如何从远程网站获取内容。您的ajax请求将会回路到您的本地机器,因为它会将远程域名解析为127.0.0.1。 - Adrian
1
在stackoverflow上,如果你想在你的帖子中换行,你可以使用<br>或者输入两个新行。请参考我的编辑。 - Ali Bdeir
抱歉,我太晚了。 - Adrian

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接