web-dev-qa-db-fra.com

popup popup window.open bloqué pendant l'événement de clic

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');
    }
  });
}
26
Shpigford

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.

66
Igor Dymov

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.

12
albertein

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.

3
jfriend00

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;
  });
2
Stewie