Javascript 为什么jQuery.ajax不会引发错误?

Javascript 为什么jQuery.ajax不会引发错误?,javascript,ajax,jquery,Javascript,Ajax,Jquery,今天早上我们遇到了一个有趣的问题——问题本身的细节在这里并不相关,我已经解决了它,但我确实遇到了一些奇怪的事情,对我来说,关于jQuery 我正在构建的站点只在https上运行,因此Apache被设置为将任何入站http请求重定向到其https等价物。这个重定向工作正常。但是,我的软件中有一个bug,我试图发送以下ajax请求: jQuery.ajax({ type: "PUT", url: "http://somewhere.com/cmdt/

今天早上我们遇到了一个有趣的问题——问题本身的细节在这里并不相关,我已经解决了它,但我确实遇到了一些奇怪的事情,对我来说,关于jQuery

我正在构建的站点只在https上运行,因此Apache被设置为将任何入站http请求重定向到其https等价物。这个重定向工作正常。但是,我的软件中有一个bug,我试图发送以下ajax请求:

jQuery.ajax({  type:       "PUT",
           url:        "http://somewhere.com/cmdt/todo_lists/8457/toggle",
           data:       { deployment_id: 827},
           dataType:   "script"});

我知道这会失败——我同意jQuery不想遵循重定向。但实际的行为甚至更奇怪:我从未看到xhr请求发出!而且没有javascript错误!它只是默默地失败了。如果我将url更改为https,或者更改为相对路径,那么它可以正常工作,没有问题。我的问题是,为什么它以前没有发出请求?为什么它没有引发错误?

您没有失败的原因是因为它是一个跨站点请求,因此它实际上不是使用
XMLHttpRequest
,而是生成一个HTML
标记并将其放入DOM中,然后使用该机制加载文件


这相当不错(考虑到这完全是对错误的浏览器“安全”概念的攻击),但遗憾的是,jQuery无法在这一点上捕获错误。如果打开了开发人员模式,您可能会遇到浏览器错误,但仅此而已。

如果您从
https
的url运行该模式,并尝试打开等效的
http
页面,则由于它们使用的协议不同,您会遇到跨域问题。看一看。

这可能是单一来源地政策开始实施,并悄无声息地失败了。在Chrome这样的浏览器中应该会出现错误,虽然这不是jQuery不想遵循重定向,这是跨域策略在起作用:您不能(使用Ajax)从
http
页面请求
https
资源,反之亦然。如果检测到它是跨域的,您确定它会使用脚本标记吗?这似乎很奇怪,我认为它会尝试发送它,让浏览器拒绝它。我相信jsonp是按照您所描述的方式工作的,但我不认为它会自动对跨域非jsonp请求执行相同的操作。@kingjiv:我非常肯定
script
,jQuery为开发人员省去了痛苦并检测到了错误。对于
json
/
jsonp
您必须明确。