我在尝试使用跨域请求制作jquery.form时遇到了困难。我在Firefox和Chrome上遇到问题(甚至还没有尝试IE)。
说明:我的整个网站都位于http://www.mysite.com内。但是,我的联系表在另一台服务器上,由http://contact.mysite.com引用。我认为将其放在子域上可以避开有关跨域请求的问题,但显然没有。在Sinatra中实现了http://contact.mysite.com。
我的javascript设置没什么花哨的。表单的操作指向http://contact.mysite.com,方法为POST:
<form id="contact" action="http://contact.mysite.com/" method="post">
使用ajaxForm调用配置jquery.form :
$(document).ready(function() {
$('#contact').ajaxForm({
success: function() { $('#success').fadeIn("slow"); },
error: function() { $('#error').fadeIn("slow"); }
});
});
我遇到的第一个问题是Firefox
3.5-显然,它发送了一个OPTIONS请求,期望服务器提供特定的答案。我用这个问题来配置我的Sinatra应用程序,使其达到了预期的效果(似乎最新版本的sinatra包含一个选项动词):
require 'rubygems'
require 'sinatra'
require 'pony'
# patch sinatra so it handles options requests - see https://stackoverflow.com/questions/4351904/sinatra-options-http-verb
configure do
class << Sinatra::Base
def options(path, opts={}, &block)
route 'OPTIONS', path, opts, &block
end
end
Sinatra::Delegator.delegate :options
end
# respond to options requests so that firefox can do cross-domain ajax requests
options '/' do
response['Access-Control-Allow-Origin'] = '*'
response['Access-Control-Allow-Methods'] = 'POST'
response['Access-Control-Max-Age'] = '2592000'
end
post '/' do
# use Pony to send an email
Pony.mail(...)
end
使用jQuery 1.4.3,我在firebug上看到了一个OPTIONS请求和一个POST请求(状态200。已发送电子邮件)。使用jquery
1.3.2或1.5时,仅显示OPTIONS请求(未发送电子邮件)。
但是,error
回调总是在我尝试过的所有版本的jQuery中触发。我将其追溯到$.ajax(...)
调用,所以我不确定这个问题是来自jquery.form还是jquery本身。
我尝试注销来自错误的信息:
$('#contact').ajaxForm({
success: function() { $('#success').fadeIn("slow"); },
error: function(jqXHR, textStatus, errorThrown) {
console.log(jqXHR.status);
console.log(jqXHR.statusText);
}
});
在jquery 1.4.3上的输出(在发送OPTIONS&POST请求之后,状态均为200):
0
(empty string)
在jQuery 1.5上输出(在OPTIONS返回200状态后;从不发送POST)
302
error
我真的在这里迷路了。
任何帮助将不胜感激。
无法跨域执行AJAX请求( UPD:
不再适用,所有现代浏览器都支持CORS),但是您可以改用JSONP。尽管JSONP可以跨域工作,但是它不能用于POST请求,并且您需要将表单的方法更改为get
并使用此方法:
$('#contact').ajaxForm({
success: function() { $('#success').fadeIn("slow"); },
error: function() { $('#error').fadeIn("slow"); },
dataType: 'jsonp'
});
上面的解决方案依赖于您的服务器以有效的jsonp响应进行响应,否则success
将不执行处理程序。例如:response.write(request.callback + '(' + result.to_json + ')')
jQuery的最新版本可以在没有ajaxForm
插件的情况下序列化表单。如果不需要文件上传,可以使用以下命令:
$('form').submit(function() {
var url = $(this).attr('action')
var params = $(this).serialize()
$.getJSON(url + '?' + params + "&callback=?", function(data) {
// success
})
return false
});
imi 框架内置了一个 OptionsMiddleware 中间件,用于解决使用 application/json 请求时,浏览器会先发送一个 OPTIONS 请求。并且可以解决跨域头问题。 类名:\Imi\Server\Http\Middleware\OptionsMiddleware 别名:OptionsMiddleware 中间件使用方法:https://doc.imiphp.com/com
在浏览器的沙箱环境下,默认只允许js代码请求其所属域的数据,不同域名/ip/协议,都默认禁止. 跨域所需要的是,是响应浏览器发起的OPTIONS,及真正的GET/POST, 共2个请求哦. 所需要的逻辑CrossOriginFilter已经封装好了 如何解决 nutz给出的方案非常简单,仅需要在入口方法上添加CrossOriginFilter即可 @Filters(@By(type=CrossO
跨域请求 如果某个路由或者分组需要支持跨域请求,可以使用 Route::get('new/:id', 'News/read') ->ext('html') ->allowCrossDomain(); 跨域请求一般会发送一条OPTIONS的请求,一旦设置了跨域请求的话,不需要自己定义OPTIONS请求的路由,系统会自动加上。 跨域请求系统会默认带上一些Header,包括: Acces
问题内容: 题: 我正在尝试使用JSON跨域,但是我发现的只是JSON解析器,我不需要… 我已经读到可以使用JSON进行跨域请求,但是到目前为止,我所看到的是使用XMLHttpRequest的实现…- 这意味着您不能使用跨域请求,至少不能在IE 8之外使用… 我去过http://www.json.org/,但是我发现了所有这些是解析器还是没用。 到目前为止,我在google上发现的最好的是 htt
跨域指的是JavaScript通过XMLHttpRequest请求数据时,调用JavaScript的页面所在的域和被请求页面的域不一致。对于网站来说,浏览器出于安全考虑是不允许跨域。另外,对于域相同,但端口或协议不同时,浏览器也是禁止的。下表给出了进一步的说明: URL 说明 是否允许请求 http://a.example.com/ http://a.example.com/a.txt 同域下 允
问题内容: 对于一个项目,我需要获取其他不同域的网页的源代码。我尝试了以下代码: 我仍然没有得到任何结果,只是一个空白的警告框。 问题答案: 默认情况下,所有浏览器都限制跨域请求,您可以使用YQL作为代理来解决此问题。在此处查看指南:http://ajaxian.com/archives/using-yql-as-a- proxy-for-cross-domain-ajax