jquery.la forme et les demandes inter-domaine
Je vais avoir un moment difficile essayer de faire jquery.formulaire avec une demande de domaines. Je vais avoir des problèmes avec Firefox et Chrome (n'essayez même pas IE encore).
Explication: mon site est situé à l'intérieur de http://www.mysite.com. Cependant, mon formulaire de contact est sur un autre serveur, référencé par http://contact.mysite.com . J'ai pensé que de le mettre sur un sous-domaine serait pas de côté les questions concernant les demandes inter-domaine, mais apparemment, ce n'est pas le cas. http://contact.mysite.com est mis en œuvre dans Sinatra.
Mon javascript le programme d'installation n'a rien de fantaisiste. La forme de points d'action pour http://contact.mysite.com et la méthode est POST:
<form id="contact" action="http://contact.mysite.com/" method="post">
jquery.la forme est configuré avec une ajaxForm appel:
$(document).ready(function() {
$('#contact').ajaxForm({
success: function() { $('#success').fadeIn("slow"); },
error: function() { $('#error').fadeIn("slow"); }
});
});
Le premier problème que j'ai rencontré était avec Firefox 3.5 - apparemment, il envoie une requête OPTIONS attend une réponse du serveur. J'ai utilisé cette question pour configurer mon Sinatra app ainsi, il a fait ce qui était attendu (il semble que les versions plus récentes de sinatra inclure des options verbe):
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
Avec jquery 1.4.3, j'ai vu sur firebug une demande d'OPTIONS suivies par une requête POST (état 200. Le courriel a été envoyé). Avec jquery 1.3.2 ou 1.5, la demande d'OPTIONS a été montré (l'e-mail n'a pas été envoyé).
Néanmoins, la error
rappel est toujours tiré avec toutes les versions de jquery, j'ai essayé. J'ai tracé jusqu'à la $.ajax(...)
appeler, donc je ne suis pas sûr de savoir si ce problème vient de jquery.forme ou jquery lui-même.
J'ai essayé de vous déconnecter l'information en provenance de l'erreur:
$('#contact').ajaxForm({
success: function() { $('#success').fadeIn("slow"); },
error: function(jqXHR, textStatus, errorThrown) {
console.log(jqXHR.status);
console.log(jqXHR.statusText);
}
});
Sortie sur jquery 1.4.3 (après les OPTIONS & POST demandes sont envoyées, à la fois avec le statut de 200):
0
(empty string)
Sortie sur jquery 1.5 (après les OPTIONS de retour avec un statut 200; POST n'est jamais envoyé)
302
error
Je suis vraiment perdu.
- Est-il un plugin qui gère cela?
- Ai-je raté quelque chose quelque part?
Toute aide sera grandement appréciée.
OriginalL'auteur kikito | 2011-02-21
Vous devez vous connecter pour publier un commentaire.
Requêtes AJAX ne peut pas être exécuté inter-domaine (UPD: pas vrai, tous les navigateurs modernes soutien De la SCRO), mais vous pouvez utiliser JSONP à la place. Bien que JSONP œuvres de la croix-domaine, il ne peut pas être utilisé pour les requêtes POST, et vous aurez besoin de vous changer la forme de la méthode de
get
et utiliser ceci:La solution ci-dessus repose sur votre serveur répond avec un valide jsonp de réponse, sinon
success
gestionnaire ne sera pas exécutée. e.g:response.write(request.callback + '(' + result.to_json + ')')
Dernières versions de jQuery peut sérialiser les formes sans les
ajaxForm
plugin. Si vous n'avez pas besoin de téléchargement de fichiers vous pouvez utiliser ceci:Vous savez quoi, j'ai regardé l' $.ajaxForm source et je pense que ça peut le faire. Je ne peux pas essayer de l'exemple maintenant, mais j'espère que cela fonctionne.
Voir ma nouvelle mise à jour, je l'ai testé et il fonctionne très bien si vous nous retournez un json valide la réponse de votre serveur.
JSONP fonctionne en ajoutant un <script src=> élément du DOM, avec l'url externe de la src cible. C'est une simple inclusion de script, ce qui est toujours une requête GET. Plus d'infos ici: west-wind.com/weblog/posts/107136.aspx
Votre solution fonctionne à merveille. J'ai fini par amerrissage forcé de jquery.la forme et à l'aide de getJSON directement (vous devez remplacer la
+ '/' +
par+ '?' +
bien; j'ai changé que dans votre réponse)OriginalL'auteur Alexey Lebedev
Je pense que JSONP la seule requête AJAX qui peuvent traverser domaine.
http://en.wikipedia.org/wiki/JSON#JSONP
OriginalL'auteur Mark Holland
Vous pouvez également utiliser un proxy local URL pour effectuer la demande que les serveurs peuvent généralement faire de la croix-domaine des appels en utilisant quelque chose comme HttpRequest ou cURL. Donc, fondamentalement, vous faites un appel à l'aide d'ajax vers une URL sur le domaine local et transmet ensuite la demande à la croix-URL de domaine et de passer à la réponse de la HttpRequest/cURL dos au navigateur dans la réponse à partir du domaine local.
nps 😉
OriginalL'auteur Rob
Après beaucoup de combats, j'ai enfin fini par conquérir ce, avec l'aide d'Alexeï. Voici ma solution pour l'instant:
Javascript (à l'aide de jquery directement, sans jquery.le formulaire):
Avec Sinatra, j'ai utilisé le sinatra-jsonp gem. Je fais le obtenez l'action renvoie "true" ou "false" selon que les e-mails peuvent être envoyés ou non (par exemple, pour une adresse email non valide).
OriginalL'auteur kikito