从HTTP URL获取jQuery Ajax响应文本

30

不是:

var response = $.ajax({
    type: "GET",   
    url: "http://www.google.de",   
    async: false,
    success : function() {
        alert (this);
    }
});

或者:

var response2 = $.get("http://www.google.de", function(data) {
    alert("Data Loaded: " + data);
});

给我一个对象。我怎样才能访问responseText

10个回答

36

你必须像这样重新编写它:

var response = '';
$.ajax({ type: "GET",   
         url: "http://www.google.de",   
         async: false,
         success : function(text)
         {
             response = text;
         }
});

alert(response);

1
为什么会是空的, 没有响应呢? - stephan
3
跨域 Ajax 无法正常工作,除非该域启用了 JSONP,而谷歌并没有启用。 - karim79
即使使用jsonp兼容的API,这也不起作用,因为似乎jQuery不想对其他域执行同步ajax请求...所以请求是异步的。这真的很无聊... :-/ - p4bl0
这并没有更好,唯一的区别在于您向用户发出变量值的警报的位置。此外,OP列出的第二个选项使用了默认情况下是异步的$.get。如果他使用了您的逻辑,并将警报放在事件处理程序之外,那么无论请求是否成功,它都将始终返回''。 - sillyMunky
这甚至不是正确的jsonp语法。为了让jQuery使用JSONP,它期望在URL中有一个回调参数,而这个例子没有。 - jamesmortensen
如果你移除了 async: false,那么响应会为空,而这正是你需要纠正的。 - Seabizkit

30

正如Karim所说,跨域Ajax不起作用,除非服务器允许。在这种情况下,Google不允许,但是在许多情况下有一个简单的技巧可以解决此问题。只需让您的本地服务器通过HTTP或HTTPS传递检索到的内容即可。

例如,如果您使用PHP,可以执行以下操作:

创建名为web_root/ajax_responders/google.php的文件:

<?php
  echo file_get_contents('http://www.google.de');
?>

然后修改你的代码,使其连接到该域名而不是直接连接到Google的域名。

var response = $.ajax({ type: "GET",   
                        url: "/ajax_responders/google.php",   
                        async: false
                      }).responseText;
alert(response);

4

首先,您需要下载一个jQuery插件来允许跨域请求。在此处下载:https://github.com/padolsey/jQuery-Plugins/downloads

将名为query.xdomainsajax.js的文件导入到您的项目中,并使用以下代码引入它:

<script type="text/javascript" src="/path/to/the/file/jquery.xdomainajax.js"></script>

为了以文本形式获取外部网页的html,您可以编写以下代码:
$.ajax({
    url: "http://www.website.com",
    type: 'GET',
    success: function(res) {
        var text = res.responseText;
        // then you can manipulate your text as you wish
    }
});

完全与这个问题无关,但我认为你可能会发现这个JSFiddle很有趣。它与你昨天发布的问题有关。 - IgnisErus

3
在jQuery Ajax函数中,成功回调的签名为:
function (data, textStatus) {
  // data could be xmlDoc, jsonObj, html, text, etc...
  this; // the options for this ajax request
}

根据您请求的数据类型,使用“dataType”参数,您将获得“data”参数。

来自文档:

dataType(字符串)默认值:智能猜测(xml或html)。 您希望从服务器返回的数据类型。如果未指定,则jQuery会根据响应的MIME类型智能地传递responseXML或responseText到成功回调函数中。

可用的类型(以及作为成功回调的第一个参数传递的结果)为:

“xml”:返回可以通过jQuery处理的XML文档。

“html”:以纯文本形式返回HTML;插入DOM时会评估包含的脚本标记。

“script”:将响应作为JavaScript进行评估并将其作为纯文本返回。除非使用选项“cache”,否则禁用缓存。注意:这将将POST转换为GET以进行远程域请求。

“json”:将响应作为JSON进行评估并返回JavaScript对象。

“jsonp”:使用JSONP加载JSON块。将在URL的末尾添加额外的“?callback =?”以指定回调。(在jQuery 1.2中添加)

“text”:纯文本字符串。

http://docs.jquery.com/Ajax/jQuery.ajax#options


抱歉,我没有看到与翻译相关的其他评论或Google HTML文本。请提供需要翻译的英文文本以便我为您进行翻译。 - stephan

2

1

0

由于jQuery AJAX请求在跨域时会失败,因此您可以使用cURL(在PHP中)设置代理服务器。

假设一个PHP文件responder.php具有以下内容:

$url = "https://www.google.com";
$ch      = curl_init( $url );
curl_set_opt($ch, CURLOPT_RETURNTRANSFER, "true")
$response= curl_exec( $ch );
curl_close( $ch );
return $response;

你的AJAX请求应该发送到这个responder.php文件,以便执行跨域请求。


0

这个怎么样?

$.get(some-url, some-data, function(d, s, x){
    // d is text response data
    // s is text status
    // x is a XMLHttpRequest object
    // so... you can code like that:

    console.log(x.responseText);
})

祝您玩得愉快!:)


-1
这个可能很老了,但希望对某些人有所帮助。我正在发送不同错误代码的响应,这是我找到的唯一有效的解决方案。
$.ajax({
    data: {
        "data": "mydata"
    },
    type: "POST",
    url: "myurl"
}).done(function(data){
    alert(data);
}).fail(function(data){
    alert(data.responseText)
});

自从JQuery弃用了successerror函数,现在需要使用donefail,并且在fail中访问数据时需要使用data.responseText,而在done中只需使用data


-2

试一下这个

alert( data['responseText'] );

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