根据jQuery:
crossDomain (default: false for same-domain requests, true for cross-domain requests)
类型:Boolean如果你想强制a 在同一个域上的crossDomain请求(例如JSONP),设置值 of CrossDomain为true。这允许,例如,服务器端 重定向到另一个域。 (版本增加:1.5)
我不明白上述情况。
如果代码是
$(document).ready(function ()
{
$.ajax(
{
url: 'http://es3.com/Handlers/MyHandler.ashx',
cache: false,
dataType: "jsonp",
...
...
});
});
function aaa(json)
{
alert(json.result);
}
我指定datatype:jsonp
,然后响应将是application / javascript mime typed,因为它是一个将在我的浏览器中运行的脚本。
当我在相同的域下运行此代码时,我没有看到任何理由为什么它不会那样。 (因此 - 我没有看到这个属性的用法)。
我做了一个样本
我有2个(主机调整)域名。 es2.com
和es3.com
。
(注意,代码中的网址始终为 es3.com )
测试#1:
从es3.com
运行代码:(左侧窗格)
从es2.com
运行代码:(右窗格)
crossDomain:false
(缺少时默认)。
看看差异:(http://i.stack.imgur.com/RKyZp.jpg)
测试#2:
从es3.com
运行代码:(左侧窗格)
从es2.com
运行代码:(右窗格)
crossDomain:true
< ---通知
(http://i.stack.imgur.com/xEcyd.jpg)
我认为没有任何区别。
问题:
为什么/何时我是否需要设置crossDomain
属性?
答案 0 :(得分:10)
对于同域请求,为false,对于跨域请求,则为true
根据data-type
设置的值,crossDomain
的解释会有所不同:
" json":将响应评估为JSON并返回JavaScript 宾语。跨域" json"请求转换为" jsonp"除非 请求在其请求选项中包含jsonp:false
因为您使用的是jsonp
而不是json
,所以您不会发现测试中存在任何差异。
我什么时候需要设置crossDomain属性?
如果您要进行相同的域json
请求,和您的网站可能会将请求重定向到另一个域以提供响应(通过HTTP 3XX),那么您应该设置{ {1}}属性为true,因此您的调用脚本可以读取响应。
这使您可以在进行相同的原始请求时检索JSON,并在进行跨源请求时检索JSONP的功能。如果CORS在您重定向到的域上处于活动状态,则可以在请求选项中设置crossDomain
。
jsonp: false
自动设为true。crossDomain
。结果:example.org返回的JSONP。
jsonp
自动设置为false。crossDomain
。结果: example.com返回的JSONP。
jsonp
自动设为true。crossDomain
。结果:example.org返回的JSONP。
json
自动设置为false。crossDomain
。结果: example.com返回的JSON。
json
自动设为true。crossDomain
。json
设置为false。结果:浏览器返回的CORS错误。
jsonp
手动设置为true。crossDomain
。结果:example.edu返回的JSONP。
json
自动设为true。crossDomain
。json
设置为false。结果: example.org返回的JSON。
jsonp
自动设置为false。crossDomain
。结果:浏览器返回的CORS错误。
答案 1 :(得分:4)
假设您有另一个域名spanish.es2.com
,该域名为您网站的西班牙语用户提供服务。
您有以下要求:
在es2.com
在es2.com
上调用api并向其传递一些用户信息(或cookie),并获取一些用户数据。但如果是用户
是西班牙语,spanish.es2.com
上的api需要被调用相同的数据。
当您使用jQuery从es2.com到es2.com执行ajax请求时,对于西班牙语用户:
(a)禁用crossdomain
:您的es2.com
api会发现用户是西班牙语,因此http重定向到spanish.es2.com
,由于ajax相同而无效域策略和ajax将失败。重定向到ajax网址 - >禁止。
(b)启用crossdomain
:您的es2.com api的jsonp响应实际上是作为包含在函数中的脚本标记加载的,因此http重定向到其他域无关紧要,内容仍然是加载,因此ajax工作。
重定向脚本标记的src - >允许的。
希望这说清楚。
答案 2 :(得分:2)
据我所知,操作是正确的。将dataType设置为jsonp将创建JSONP类型请求;将结果写入脚本块并运行。因此,通过将跨域设置为true来强制JSONP似乎是多余的。
然而。文档说“如果你想强制执行跨域请求,例如JSONP”,那么暗示可能存在其他可能需要强制跨域行为的情况。我不确定那些情况可能是什么。
答案 3 :(得分:1)
丢失时不是默认的假。如果缺少它,则默认为true,如果域不相同(如上面的第一个示例中所示)。我认为你可以在几乎所有情况下将其保留为默认值。
此外,在设置跨域参数时,JQuery默认尝试使用CORS,而不是JSONP。
以下是JQuery来源的一些相关摘录:https://github.com/jquery/jquery/blob/master/src/ajax/xhr.js
变量“xhrSupported”......
xhrSupported = jQuery.ajaxSettings.xhr();
..用于检查CORS支持....
support.cors = !!xhrSupported && ( "withCredentials" in xhrSupported );
..在进行AJAX调用时检查....
jQuery.ajaxTransport(function( options ) {
var callback;
// Cross domain only allowed if supported through XMLHttpRequest
if ( support.cors || xhrSupported && !options.crossDomain )
希望这有帮助!
答案 4 :(得分:0)
如果您已经指定了JSONP,那么crossDomain参数不会做太多。它只是告诉jQuery要求JSONP,即使它是一个本地域。
假设您正在使用返回JSON或JSONP的本地服务处理您的计算机。您可以使用普通的$.ajax()
来电,这样可以正常使用。但是,在生产中,如果您遇到某些特殊情况,服务器会将您的请求重定向到其他域。 Prod需要请求JSONP,因为有时响应来自域外。
在没有$.ajax()
或crossDomain: true
的情况下进行datatype: 'jsonp'
调用将假定响应可以是普通的JSON,因此代码将在生产中失败。
您还可以通过像loading cross-domain XML through JSONP with YQL这样的预先判断来获取跨域XML,这实际上只是将其包装在JSONP中。
答案 5 :(得分:0)
你的问题对我理解我在使用jsonp jQuery时遇到的问题非常有帮助。
就我而言,我需要对外部域进行JSONP调用
但是网址需要从我们的域构建。
例如,在这里,我假设我的网站在es2.com下
JSONP呼叫 es2.com
es2.com 重定向到 es3.com?newConstructedUrl=someRandomValue
es3.com?newConstructedUrl=NewCoolValue 重定向至 es2.com
es2.com 回复在回复中设置新Cookie
代码在localhost中工作正常,但我们在 es2 环境中没有cookie。
看到调试器,请求是在 es2 环境中的XHR中完成的
然后我们需要将crossDomain参数设置为true。然后,即使在 es2.com
希望我的用例很清楚!