129 votes

Window.open et passer des paramètres par la méthode post

Avec la méthode window.open, j'ouvre un nouveau site avec des paramètres que je dois passer par la méthode post. Voici mon code :

<script  type="text/javascript">    
function openWindowWithPost(url,name,keys,values)
{
    var newWindow = window.open(url, name);

    if (!newWindow) return false;

    var html = "";
    html += "<html><head></head><body><form id='formid' method='post' action='" + url +"'>";

    if (keys && values && (keys.length == values.length))
        for (var i=0; i < keys.length; i++)
            html += "<input type='hidden' name='" + keys[i] + "' value='" + values[i] + "'/>";

    html += "</form><script type='text/javascript'>document.getElementById(\"formid\").submit()</sc"+"ript></body></html>";

    newWindow.document.write(html);
    return newWindow;
}
</script>  

Ensuite, je crée des tableaux :

<script type="text/javascript">    
var values= new Array("value1", "value2", "value3") 
var keys= new Array("a","b","c") 
</script>  

Et appeler la fonction par :

<input id="Button1" type="button" value="Pass values" onclick="openWindowWithPost('test.asp','',keys,values)" />   

Mais, lorsque je clique sur ce bouton, le site test.asp est vide (bien sûr, j'essaie de faire passer des valeurs - Request.Form("b") ).

Comment puis-je résoudre ce problème, pourquoi ne puis-je pas obtenir les valeurs de passage ?

141voto

Guffa Points 308133

Au lieu d'écrire un formulaire dans la nouvelle fenêtre (ce qui est difficile à faire correctement, avec l'encodage des valeurs dans le code HTML), il suffit d'ouvrir une fenêtre vide et d'y poster un formulaire.

Exemple :

<form id="TheForm" method="post" action="test.asp" target="TheWindow">
<input type="hidden" name="something" value="something" />
<input type="hidden" name="more" value="something" />
<input type="hidden" name="other" value="something" />
</form>

<script type="text/javascript">
window.open('', 'TheWindow');
document.getElementById('TheForm').submit();
</script>

Editer :

Pour définir les valeurs du formulaire de manière dynamique, vous pouvez procéder comme suit :

function openWindowWithPost(something, additional, misc) {
  var f = document.getElementById('TheForm');
  f.something.value = something;
  f.more.value = additional;
  f.other.value = misc;
  window.open('', 'TheWindow');
  f.submit();
}

Pour afficher le formulaire, vous appelez la fonction contenant les valeurs, comme par exemple openWindowWithPost('a','b','c'); .

Remarque : j'ai modifié les noms des paramètres par rapport aux noms des formulaires pour montrer qu'il n'est pas nécessaire qu'ils soient identiques. En général, il est préférable qu'ils soient similaires pour faciliter le suivi des valeurs.

77voto

Mercenary Points 542

Puisque vous voulez que tout le formulaire soit dans le javascript, au lieu de l'écrire dans des balises, vous pouvez faire ceci :

let windowName = 'w_' + Date.now() + Math.floor(Math.random() * 100000).toString();
var form = document.createElement("form");
form.setAttribute("method", "post");
form.setAttribute("action", "openData.do");

form.setAttribute("target", windowName);

var hiddenField = document.createElement("input"); 
hiddenField.setAttribute("type", "hidden");
hiddenField.setAttribute("name", "message");
hiddenField.setAttribute("value", "val");
form.appendChild(hiddenField);
document.body.appendChild(form);

window.open('', windowName);

form.submit();

34voto

BiS Points 101

Je suis tout à fait d'accord avec mercenaire La réponse de l'auteur de l'article ci-dessus a permis de créer cette fonction qui fonctionne pour moi. Ce n'est pas une réponse, c'est un commentaire sur le post ci-dessus par mercenaire

function openWindowWithPostRequest() {
  var winName='MyWindow';
  var winURL='search.action';
  var windowoption='resizable=yes,height=600,width=800,location=0,menubar=0,scrollbars=1';
  var params = { 'param1' : '1','param2' :'2'};         
  var form = document.createElement("form");
  form.setAttribute("method", "post");
  form.setAttribute("action", winURL);
  form.setAttribute("target",winName);  
  for (var i in params) {
    if (params.hasOwnProperty(i)) {
      var input = document.createElement('input');
      input.type = 'hidden';
      input.name = i;
      input.value = params[i];
      form.appendChild(input);
    }
  }              
  document.body.appendChild(form);                       
  window.open('', winName,windowoption);
  form.target = winName;
  form.submit();                 
  document.body.removeChild(form);           
}

30voto

Même si j'ai 3 ans de retard, pour simplifier l'exemple de Guffa, il n'est même pas nécessaire d'avoir le formulaire sur la page :

$('<form method="post" action="test.asp" target="TheWindow">
       <input type="hidden" name="something" value="something">
       ...
   </form>').submit();

Édité :

$('<form method="post" action="test.asp" target="TheWindow">
       <input type="hidden" name="something" value="something">
       ...
   </form>').appendTo('body').submit().remove();

Peut-être un conseil utile pour quelqu'un :)

13voto

Pier Points 1326

Vous pouvez simplement utiliser target="_blank" sur le formulaire.

<form action="action.php" method="post" target="_blank">
    <input type="hidden" name="something" value="some value">
</form>

Ajoutez des entrées cachées de la manière que vous préférez, puis soumettez simplement le formulaire avec JS.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X