Ce que je dois finalement faire est d'exécuter un appel $.ajax()
puis après cela, ouvrez une nouvelle fenêtre.
Une utilisation clique sur un bouton "Aperçu" qui enregistre leur formulaire actuel puis ouvre une nouvelle fenêtre qui montre un aperçu de l'élément avec les données qui viennent d'être enregistrées.
Mais en l'état, la fonction window.open
Est bloquée par des bloqueurs de popups.
Voici les parties de base de mon code:
HTML:
<a href="/surveys/185/preview" class="preview" target="_blank">Preview</a>
JavaScript:
$('.preview').live('click', function(event){
save_survey($(this).attr('href'));
event.preventDefault();
});
function save_survey(url) {
$.ajax({
type: "POST",
url: form_url,
dataType: 'json',
data: form_data,
success: function(data) {
window.open(url, '_blank');
}
});
}
J'ai rencontré ce problème récemment et j'ai trouvé cette solution:
1) appelez window.open
juste avant d'appeler $.ajax
et enregistrer la référence de la fenêtre:
var newWindow = window.open(...);
2) lors du rappel, définissez la propriété location
de la référence de fenêtre enregistrée:
newWindow.location = url;
Peut-être que cela vous aidera aussi.
Les bloqueurs de fenêtres contextuelles fonctionnent généralement en bloquant toutes les fenêtres contextuelles affichées non déclenchées par une action directe de l'utilisateur, comme en cliquant sur un bouton ou un lien.
Si vous utilisez une demande ajax sur votre événement click, la demande est renvoyée de manière asynchrone à partir de l'événement click, c'est pourquoi au moment où la demande ajax a fait son travail et que vous obtenez votre événement avec la réponse de la demande, vous avez perdu votre chance de déclencher un window.open sans que le bloqueur de popup ne gêne, l'événement de clic d'origine est mort depuis longtemps.
Selon cela ce message , il semble que vous devriez ouvrir votre fenêtre en réponse directe au clic (pour éviter d'être touché par les bloqueurs de fenêtres contextuelles) plutôt que d'attendre que le AJAX l'appel se termine pour ouvrir la nouvelle fenêtre.
J'ai résolu mon cas en rendant l'appel Ajax synchrone. Par exemple. (avec jQuery):
$("form").submit(function(e){
e.preventDefault();
$.ajax({
async: false,
url: ...,
data: ...,
success: function(results){
if(results.valid){
window.open(...);
}
}
});
return false;
});