2010-07-15 9 views
3

Je sais qu'il existe de nombreux threads sur la façon de vaincre les bloqueurs de fenêtres contextuelles. Dans ce cas, je n'essaie pas vraiment de faire ça. Par défaut, les navigateurs ne bloquent pas tous les pop-ups. Les légitimes tels que lorsque les utilisateurs cliquent dessus sont autorisés. Ceci est un bon test: http://www.popuptest.com/goodpopups.html (fonctionne dans IE, Firefox, Chrome, Opera)Lancement d'une fenêtre contextuelle légitime sur l'utilisateur, cliquez sur

Comment le site de test ci-dessus autorise les fenêtres pop-up légitimes est de coupler directement l'événement onclick au lancement d'une nouvelle fenêtre.

Dans mon cas, je ne peux pas simplement lancer la fenêtre pop-up. Je dois vérifier si l'entrée de l'utilisateur, un code alphanumérique, est valide. Comment j'ai fait est l'entrée est vérifiée via ajax et si elle est valide, window.open() sera appelée pour lancer la fenêtre. Hélas, tous les bloqueurs de pop-up bloquent cela.

Existe-t-il un autre moyen de le faire? Je ne veux pas lancer une fenêtre si l'entrée est invalide. Si l'entrée n'est pas valide, le message d'erreur s'affiche sur la page immédiate et non sur la nouvelle fenêtre contextuelle. C'est idiot de lancer une fenêtre juste pour dire à l'utilisateur que c'est invalide.

Avez-vous des idées ou des suggestions sur la façon de vérifier l'entrée et d'afficher une fenêtre contextuelle légitime?

Merci.

Edité pour inclure mon code

formulaire HTML (simplifié):

<form id="form-passcode"> 
<input id="input-passcode" type="text" name="input-passcode" /><a class="submit" onclick="javascript:passcode_check(); return false;" href="javascript:">Go</a> 
</form> 

Javascript (en utilisant jQuery):

function passcode_check() { 
    var refPasscode = $('#input-passcode'); 
    var data = $('#form-passcode').serialize(); 
    $.ajax({ 
     url: check_passcode.php', 
     data: data, 
     dataType: 'json', 
     type: 'post', 
     success: function (j) { 
     if (j.status == 1) { 
      newwindow = window.open('http://google.com','Google','menubar=no,height=500,width=300,resizable=no,toolbar=no,location=no,status=no'); 
      if (window.focus) {newwindow.focus()} 
     } 
     else { 
      // show error to end-user 
     } 
     } 
    }); 
} 

}

J'ai aussi expérimenté avec une alternative moins idéale, dans laquelle lors de la vérification via ajax si l'entrée est valide, je vais insérer un lien par exemple. <a href="http://google.com" onclick="newwin(this.href);return false" onfocus="this.blur()">Launch</a> via $('#form-passcode').html(); dans lequel l'utilisateur va ensuite cliquer sur pour lancer la pop-up. Cela fonctionne dans tous les navigateurs, bien que j'aimerais encore pour le rendre plus transparente pour l'utilisateur ..

Merci encore, :)

Répondre

4

Pourquoi ne pas déplacer le code de validation dans votre événement onclick? Par exemple: onclick = "javascript: validateInput();" Puis, dans validateInput(), si le mot de passe est valide, vous ouvrirez la nouvelle fenêtre.

De même, assurez-vous de ne pas affecter dynamiquement le gestionnaire onclick à jQuery. Il doit être spécifié de manière statique en tant qu'attribut HTML.

+1

Merci. J'ai juste essayé votre méthode, en déplaçant tout à la fonction onclick, en désactivant tous les gestionnaires de jquery pour le formulaire et les boutons. Il fonctionne maintenant dans IE8, mais la popup est toujours bloquée dans Chrome et Firefox :(. – Lyon

+0

@Lyon: Chrome et FireFox peuvent regarder juste un niveau de profondeur, ou juste quelques déclarations dans le chemin du code.Afficher du code, et nous –

+0

@Jeroen Merci :) Comme conseillé, j'ai modifié ma question pour inclure le code .. – Lyon

4

D'accord avec dacris. Le code qui appelle window.open doit être plus proche du gestionnaire de clic sur le bouton. Si vous effectuez un appel AJAX sur le serveur avec un gestionnaire de réponse asynchrone, vous avez découplé l'appel window.open du gestionnaire de clic sur le bouton. Les navigateurs ne peuvent suivre que quelques niveaux de profondeur de pile (une seule profondeur d'appel, d'autres quelques profondeurs) pour voir si l'appel à window.open est fait depuis le contexte d'exécution d'un événement utilisateur. Le gestionnaire async AJAX s'exécute longtemps après que le gestionnaire de clic sur le bouton a été exécuté et renvoyé à son appelant.Une solution pour résoudre votre problème consiste peut-être à inverser le problème: ouvrez d'abord la fenêtre contextuelle dans le gestionnaire de clic, puis effectuez votre appel AJAX async pour valider l'entrée, puis mettez à jour l'URL de la fenêtre contextuelle en fonction au résultat de l'appel AJAX dans le gestionnaire asynchrone.