【发布时间】:2011-07-01 06:34:54
【问题描述】:
我很难通过跨域请求创建jquery.form。我在使用 Firefox 和 Chrome 时遇到问题(甚至还没有尝试过 IE)。
解释:我的整个网站都位于http://www.mysite.com 内。但是,我的联系表格在另一台服务器上,由 http://contact.mysite.com 引用。我认为将它放在子域上会回避有关跨域请求的问题,但显然事实并非如此。 http://contact.mysite.com 在 Sinatra 中实现。
我的 javascript 设置没有什么花哨的。表单的action指向http://contact.mysite.com,方法是POST:
<form id="contact" action="http://contact.mysite.com/" method="post">
jquery.form 配置了ajaxForm 调用:
$(document).ready(function() {
$('#contact').ajaxForm({
success: function() { $('#success').fadeIn("slow"); },
error: function() { $('#error').fadeIn("slow"); }
});
});
我遇到的第一个问题是 Firefox 3.5 - 显然它发送了一个 OPTIONS 请求,期望服务器提供特定的答案。我使用this question 来配置我的 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
我真的迷路了。
- 是否有插件可以处理这个问题?
- 我是否在某处遗漏了什么?
任何帮助将不胜感激。
【问题讨论】:
标签: javascript jquery ajax jquery-plugins cross-domain