<script src="http://ajax.googleapis.com/ajax/libs/jquery/1.3.2/jquery.js" type="text/javascript"></script>
<script>
$.get("http://example.com/", function(data) {
     alert(data);
});
</script>

它对那个URL做一个OPTIONS请求,然后回调永远不会被调用任何东西。

当它不是跨域时,它工作得很好。

jQuery不应该只是调用一个<script>节点,然后在它加载时做回调吗?我知道我将无法得到的结果(因为它是跨域),但这是可以的;我只想让电话接通。这是bug,还是我做错了什么?


当前回答

我也有同样的问题。我的修复是添加头到我的PHP脚本,只有在开发环境中才会出现。

这允许跨域请求:

header("Access-Control-Allow-Origin: *");

这告诉preflight请求,客户端可以发送任何它想要的头文件:

header("Access-Control-Allow-Headers: *");

这样就不需要修改请求了。

如果您的开发数据库中有可能泄露的敏感数据,那么您可能要三思。

其他回答

根据MDN,

Preflighted requests Unlike simple requests (discussed above), "preflighted" requests first send an HTTP OPTIONS request header to the resource on the other domain, in order to determine whether the actual request is safe to send. Cross-site requests are preflighted like this since they may have implications to user data. In particular, a request is preflighted if: It uses methods other than GET or POST. Also, if POST is used to send request data with a Content-Type other than application/x-www-form-urlencoded, multipart/form-data, or text/plain, e.g. if the POST request sends an XML payload to the server using application/xml or text/xml, then the request is preflighted. It sets custom headers in the request (e.g. the request uses a header such as X-PINGOTHER)

我也有同样的问题。我的修复是添加头到我的PHP脚本,只有在开发环境中才会出现。

这允许跨域请求:

header("Access-Control-Allow-Origin: *");

这告诉preflight请求,客户端可以发送任何它想要的头文件:

header("Access-Control-Allow-Headers: *");

这样就不需要修改请求了。

如果您的开发数据库中有可能泄露的敏感数据,那么您可能要三思。

OPTIONS来自http://www.w3.org/TR/cors/,请参阅http://metajack.im/2010/01/19/crossdomain-ajax-for-xmpp-http-binding-made-easy/了解更多信息

如果你想POST

确保JSON。Stringify您的表单数据和发送文本/纯。

<form id="my-form" onSubmit="return postMyFormData();">
    <input type="text" name="name" placeholder="Your Name" required>
    <input type="email" name="email" placeholder="Your Email" required>
    <input type="submit" value="Submit My Form">
</form>

function postMyFormData() {

    var formData = $('#my-form').serializeArray();
    formData = formData.reduce(function(obj, item) {
        obj[item.name] = item.value;
        return obj;
    }, {});
    formData = JSON.stringify(formData);

    $.ajax({
        type: "POST",
        url: "https://website.com/path",
        data: formData,
        success: function() { ... },
        dataType: "text",
        contentType : "text/plain"
    });
}

我不相信jQuery会在给定URL时自然地执行JSONP请求。然而,当你告诉它回调使用什么参数时,它会做一个JSONP请求:

$.get("http://metaward.com/import/http://metaward.com/u/ptarjan?jsoncallback=?", function(data) {
     alert(data);
});

完全由接收脚本来使用该参数(不一定要称为“jsoncallback”),因此在这种情况下,函数将永远不会被调用。但是,因为你说你只是想在metaward.com脚本执行,这将使它。