Я с трудом пытаюсь сделать jquery.form с междоменным запросом. У меня проблемы с Firefox и Chrome (я даже не пробовал IE).
Объяснение: весь мой сайт находится внутри http://www.mysite.com. Однако моя контактная форма находится на другом сервере, на который ссылается http://contact.mysite.com. Я думал, что размещение его на поддомене обойдёт проблемы, связанные с междоменными запросами, но, очевидно, это не так. http://contact.mysite.com реализовано в Синатра .
Моя настройка JavaScript не является чем-то необычным. Действие формы указывает на 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, ожидая конкретного ответа от сервера. Я использовал этот вопрос для настройки моего приложения Sinatra, чтобы оно выполняло то, что ожидалось (кажется, что более поздние версии sinatra включают глагол параметров):
require 'rubygems'
require 'sinatra'
require 'pony'
# patch sinatra so it handles options requests - see /3218614/sinatra-optsii-http-glagol
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
Я действительно потерян здесь.
- Есть ли плагин, который обрабатывает это?
- Я что-то упустил?
Любая помощь будет принята с благодарностью.