<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>节点进行调用,然后在加载时进行回调?我知道我将无法获得结果(因为它是跨域的),但是没关系;我只想打通电话。这是一个错误,还是我做错了什么?

评论

可能是跨域的cos。例如,如果您在文件File:// PATH_TO_WEBSITE上,而不是使用localhost / WEBSITE_LINK

#1 楼

根据MDN,


预检请求

与简单请求(如上所述)不同,“预检”请求首先发送
向其发送HTTP OPTIONS请求标头其他
域上的资源,以确定实际请求是否可以安全发送。跨站点请求这样被预检,因为它们可能会影响用户数据。特别是,如果出现以下情况,则对请求进行预检:


它使用GET或POST以外的方法。另外,如果使用POST发送
请求内容类型为
application / x-www-form-urlencoded,multipart / form-data或text / plain以外的Content-Type的请求数据,
例如如果POST请求使用
application / xml或text / xml将XML有效负载发送到服务器,则该请求被预检。
它在请求中设置自定义标头(例如,请求使用诸如
X-PINGOTHER之类的标头)



评论


这解决了我们的问题,从“ application / json”更改为“ text / plain”停止了可怕的选项请求

– Keeno
13年7月12日在9:44

我不明白的是为什么浏览器要求使用OPTIONS方法只是为了检查实际请求是否可以安全发送。但是在什么意义上呢?我的意思是服务器还可以对某些响应标头设置限制,所以为什么需要这样做?

– Hardik
2014年7月3日下午13:36

@hardik记住,通过添加CORS,您可能会接受任何人的请求,他们可以通过请求(POST,PUT,DELETE等)操纵服务器上的数据。在这种情况下,例如使用自定义标头时,浏览器仅在向服务器检查服务器是否愿意在发送请求之前接受该请求,因为向服务器发送未经请求的请求可能对您的数据真的很危险,并且如果服务器不希望接受有效负载,则浏览器中的该点将发送可能较大的有效负载,因此需要进行飞行前OPTIONS检查。

– davidnknight
2014年8月19日在9:25

@davidnknight如果将数据发送到服务器可能很危险,这意味着服务器可能受到威胁,那么恶意服务器当然会以“确定,将其全部发送!”响应您的OPTIONS请求。这种安全性如何? (诚​​实的问题)

–马特
16年6月30日在2:58

“飞行前的要求不是安全的事情。相反,它们是不改变规则的事情。” -请参阅对实施飞行前请求的动机的答案

–FMJaguar
17年1月20日在18:53

#2 楼

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

#3 楼

如果您要发布POST

,请确保JSON.stringify您的表单数据并以text/plain的形式发送。

<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"
    });
}


#4 楼

我不认为给定这样的URL时jQuery会自然地发出JSONP请求。但是,当您告诉它用于回调的参数时,它将执行JSONP请求:

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


完全由接收脚本来使用参数(不必称为“ jsoncallback”),因此在这种情况下将永远不会调用该函数。但是,既然您说过只希望执行metaward.com上的脚本,那就可以了。

评论


我的回调仍会被通知脚本元素已完全加载吗?我只想确保更新发生在查询API之前。

– Paul Tarjan
09年8月10日在21:38

如果接收脚本支持JSONP,并且愿意调用您标识的函数,则将执行。如果脚本什么都不做,但是只生成一个没有其他行为的JSON数据块,则您将无法知道何时完成加载。如果必须告知何时完成加载,则可以考虑在自己的服务器上实现充当代理的脚本。

–VoteyDisciple
09年8月11日在11:25

#5 楼

实际上,出于安全原因,不允许跨域AJAX(XMLHttp)请求(请考虑从客户端获取“受限制的”网页并将其发送回服务器,这是一个安全问题)。

唯一的解决方法是回调。这是:创建一个新的脚本对象,并将src指向端JavaScript,这是带有JSON值(myFunction({data})的回调,myFunction是对数据执行某些操作的函数(例如,存储它在变量中)。

评论


是的,但是我可以将其加载到