2010-11-23 5 views
2

en essayant d'avoir un lien pour un téléchargement de fichier et en même temps soumettre un formulaire de post sur ajax. ressemble un peu à ceci:

problème
<form action="" method="post" id="form"> 
    <input type="text" name="email" id="email" value="" /> 
    <input type="hidden" name="subscriber" id="subscriber" value="newsletter" /> 
    <a href="/files/application.exe" id="download">trial download</a> 
</form> 
<script type="text/javascript" src="jquery"></script> 
<script type="text/javascript"> 
    // prevent default submit action caused by enter key etc. 
    $("#form").bind('submit',function(event){event.preventDefault();}); 
    $('#download').click(function(){ 
     $.post(location.href, $('#form').serialize(), function(){ 
      $('#form').hide(); 
     }); 
    }); 
</script> 

est que les feux de téléchargement et il montre la boîte de dialogue de téléchargement - ce qui est correct - il déclenche également l'événement click et serait même journal de la console dans la fonction d'événement de clic, sur le dessus déclenche même la demande de publication, mais la demande de publication ne se termine jamais sur le serveur. J'ai eu le fichier journal d'accès sur tail -f et il montre seulement le GET sur l'application.exe mais pas de POST à ​​partir du $ .post(). dans firebug il montre le POST http://ip/folder/ donné par la location.href et son marqué en rouge avec un petit X et un champ de réponse vide. difficile pour firebug on dirait qu'il a été envoyé au serveur ...

mon explication pour cela est que le href supprime le vent de $ .post() et avant qu'il ne soit renvoyé il redirige le navigateur vers le téléchargement fichier. ne change pas la page elle-même, mais arrête l'action de poster sur XHR ...

Est-ce que quelqu'un sait une bonne solution de contournement pour cela? J'ai vraiment besoin du lien href natif à l'application pour ne pas provoquer IE pour élever cette barre d'avertissement de téléchargement de fichier stupide et en même temps j'ai besoin de l'ajax pour soumettre le formulaire ...

merci!

Répondre

2

Refactor comme suit, retour false pour empêcher le comportement de clic de lien par défaut:

$('#download').click(function(){ 
    var href = $(this).attr('href'); 
    $.post(location.href, $('#form').serialize(), function(){ 
     $('#form').hide(); 
     document.location.href= href; 
    }); 
    return false; 
}); 
+0

que pour certaines raisons fonctionnent sur le côté de la poste, mais ne déclenche pas la fonction de succès ... hmm. – Tobias

+0

oui, pour une raison quelconque, le rappel de succès ne se fait pas virer. le serveur retourne die ('{success: 1}'); maintenant tout ce qui vient dans ajax ... je vois la réponse dans firebug mais le callback de succès n'est pas appelé du tout ... bizarre. – Tobias

+0

J'ai supprimé l'en-tête ('Content-Type: application/json'); de la réponse et maintenant son tir le rappel de succès ... w.f. – Tobias

0

pour donner une réponse qui travaille à ma propre question:

$('#download').click(function(){ 
    setTimeout(function(){ 
     $.post(location.href, $('#form').serialize(), function(){ 
      $('#form').hide(); 
     }); 
    },1000); 
}); 

le délai d'attente déclenche le .post après la demande de téléchargement est tirée ... sortof fonctionne ... mais je ne sais pas si c'est une bonne solution ou si cela pourrait échouer 50% du temps & navigateur ...