POST de formulaire dans un iframe sans affecter l'histoire
Est-il possible d'envoyer un formulaire dans une iframe sans affecter l'historique du navigateur?
J'ai mis en place l'envoi d'une croix domaine de la requête POST. Il utilise Javascript pour créer et soumettre un formulaire à l'intérieur d'un iframe. Il fonctionne, mais chaque demande, ajoute un élément de l'historique du navigateur.
Quelqu'un connait un moyen de contourner cela? J'ai essayé de créer l'iframe avec les deux innerHTML et createElement. Je n'ai pas vu de différence si loin.
PS - j'aimerais utiliser XMLHtttpRequest ("Ajax"), mais il ne prend pas en charge l'envoi de données dans tous les domaines. Et j'aimerais utiliser GET au lieu de post, mais j'ai besoin d'envoyer plus de 2k de données.
Voici une version de mon code. J'ai essayé beaucoup de variations et ont cherché partout, butI n'arrive pas à trouver une solution qui n'affecte pas l'historique du navigateur. Je crois qu'il n'est pas possible, quelqu'un peut confirmer?
<html>
<head>
<script type="text/javascript">
function submit(params) {
var div = document.createElement('div');
div.innerHTML = '<iframe height="50" width="50"></iframe>';
document.body.appendChild(div);
var iframe = div.firstChild;
var iframeDocument = iframe.contentDocument || iframe.contentWindow.document;
iframeDocument.open();
iframeDocument.close();
var form = iframeDocument.createElement('form');
iframeDocument.body.appendChild(form);
form.setAttribute('action', 'http://some-other-domain.com/submit-here');
form.setAttribute('method', 'POST');
for (param in params) {
var field = iframeDocument.createElement('input');
field.setAttribute('type', 'hidden');
field.setAttribute('name', param);
field.setAttribute('value', params[param]);
form.appendChild(field);
}
form.submit();
}
window.onload = function() {
document.getElementById('button').onclick = function() {
submit({
'x' : 'Some Value',
'y' : 'Another Value',
'z' : new Date().getTime()
});
}
}
</script>
</head>
<body>
<h1>Example of using Javascript to POST across domains...</h1>
<input id="button" type="button" value="click to send">
</body>
</html>
J'ai besoin de mettre de la croix de domaine. Ajax (XMLHttpRequest) POSTE ne prend pas en charge l'envoi de données à un domaine qui est différente de la page hôte.
Je pense que vous pouvez envoyer une requête POST vis de l'ajax. Voir ma réponse mis à jour. J'espère que cela aide.
Je pense que c'est pas possible .. (même si c'était en quelque sorte, il serait susceptible d'être spécifiques à un navigateur).
La solution finale a été de 1) insérer un iframe hébergé sur mon domaine 2) utilisez la fenêtre.nom de hack pour envoyer des données à partir de la page d'hôte (sur un autre domaine) de l'iframe et 3) envoyer une requête Ajax requête POST vers le serveur sur mon domaine.
OriginalL'auteur Brian | 2009-10-20
Vous devez vous connecter pour publier un commentaire.
Ça marche pour utiliser JS pour ajouter une IFRAME dont la src est hébergé sur votre site (le domaine auquel le tiers hébergé par le script a besoin d'envoyer des données?) Cette IFRAME pourraient inclure le besoin de Javascript pour faire un XMLHttpRequest pour votre/son domaine. Et comme pour obtenir les données réelles de cette IFRAME à partir du tiers-site - essayez: http://softwareas.com/cross-domain-communication-with-iframes . C'est une jolie solution intelligente est caractérisé par l'évolution des identificateurs de fragment (#) à la fin de l'IFRAME URL, que vous pouvez ensuite lire via JS à l'intérieur de l'IFRAME.
Également une supposition, mais si vous tack ce passé, ALORS la solution à une histoire semblable problème (en utilisant l'emplacement.remplacer) sur le dessus de ce j'espère que devrait vous permettre de faire le point d'ancrage-modification de la partie, sans perturber l'histoire de la pile.
Complètement travaillé, et je suis maintenant en mesure d'utiliser Ajax dans l'iframe.
Heureux d'entendre ça! Merci pour le compte rendu ici, je vois tout à fait probable que vous ayez à utiliser cette approche moi-même dans un avenir proche.
J'ai peut-être parlé trop vite. Safari ne pas enregistrer l'iframe de l'histoire, mais les autres navigateurs n'. Encore de travail. tagneto.org/blogcode/xframe/ui.html
La solution finale a été de 1) insérer un iframe hébergé sur mon domaine 2) utilisez la fenêtre.nom de hack pour envoyer des données à partir de la page d'hôte (sur un autre domaine) de l'iframe et 3) envoyer une requête Ajax requête POST vers le serveur sur mon domaine.
OriginalL'auteur Ben Regenspan
Vous devriez utiliser un AJAX POST.
Les appels AJAX, ne sont pas enregistrées dans l'historique de navigation.
c'était un peu difficile d'amour. De toute façon, a ajouté les informations pertinentes que Brian besoins.
Ajax POSTE ne fonctionne pas dans tous les domaines. La page sera hébergé sur un domaine et envoyer des données à un autre. En outre, les données sont de plus de 2k, donc OBTENIR ne fonctionne pas.
OriginalL'auteur Esteban Küber
Si votre serveur peut exécuter du code, vous pourriez probablement faire une requête ajax à un "proxy" de la page sur votre serveur, ce serait alors lui-même d'exécuter la requête sur le serveur à distance et de retourner les résultats de votre page.
Je vois. Une rapide recherche semble indiquer qu'il est possible de le faire à l'aide d'un flash proxy (voir blog.monstuff.com/archives/000280.html). Si vous ne voulez pas aller dans cette voie, je ne suis pas sûr si c'est possible.
Flash est un peu lourd, mais c'est une bonne idée. Je vais certainement envisager.
En fait, le poids de flash n'est pas la question. La raison pour laquelle je ne peux pas l'utiliser qu'il ne fonctionne pas sur l'iPhone.
OriginalL'auteur David Thibault
(?) Je ne vois pas une bonne raison que vous êtes en utilisant un élément iframe. (Étant donné que c'était une ancienne question, peut-être vous ont été tester en 1997-vintage HTML 4. BTW, ignorer les "XML" dans le nom de l'objet - c'est un report de l'année 2000 et les versions ultérieures de [X]HTML - pas de XML requis.)
Si vous envoyer la requête HTTP à partir de JavaScript plutôt que de partir d'éléments dans le document, rien ne sera ajouté à l'histoire.
- Je utiliser les liens symboliques ("ln -s..."), de sorte que les formes peuvent être soumis au même domaine que le document, donc dans mon cas le "/soumettez-là" est un URI relatif.
OriginalL'auteur Rob at TVSeries.com
Comme dans les commentaires, la solution à ce problème est de faire une requête AJAX à partir de votre serveur au lieu d'essayer de soumettre la page normalement. W3schools a vraiment une bonne introduction à AJAX que vous pouvez trouver ici: http://www.w3schools.com/Ajax/Default.Asp
Essentiellement, AJAX utilise javascript pour envoyer une requête au serveur et affiche la réponse et parce qu'il arrive à l'aide de javascript et ensuite, la page ne se recharge pas et l'histoire n'est pas affecté. Ce qui sonne comme exactement ce que vous voulez.
Edit: AJAX ne pouvez pas poster de données.
En fait, je pense qu'il peut; ou, au moins, il y a quelques solutions qui vous permettent de publier des données. Voir ici:
http://www.captain.at/howto-ajax-form-post-request.php
Qui semble le faire de manière relativement simple et directe. Voir le code en bas de la page. Plus précisément:
OriginalL'auteur Robert Massaioli