Pourquoi la page "Prévenir la création de boîtes de dialogue supplémentaires" apparaît dans la zone d'alerte?

Dans mon dossier Rails 3, je fais:

render :js => "alert(\"Error!\\nEmpty message sent.\");" if ... 

Parfois, en dessous de ce message d'erreur (dans la même zone d'alerte), je vois: "Empêchez cette page de créer des boîtes de dialogue supplémentaires" et une case à cocher.

Qu'est-ce que ça veut dire ?

Est-il possible de ne pas afficher ce texte et cette case à cocher supplémentaires?

J'utilise Firefox 4.

C'est une fonctionnalité de navigateur pour arrêter les sites Web qui montrent des boîtes d'alerte ennuyeuses encore et encore.

En tant que développeur web, vous ne pouvez pas le désactiver.

Qu'est-ce que ça veut dire ?

Il s'agit d'une mesure de sécurité à la fin du navigateur pour empêcher une page de bloquer le navigateur (ou la page en cours) en montrant les messages modaux (alerte / confirmation) dans une boucle infinie. Voir par exemple ici pour Firefox.

Vous ne pouvez pas éteindre cela. Le seul moyen de l'utiliser est d'utiliser des dialogues personnalisés comme les boîtes de dialogue JQuery UI .

Vous pouvez créer une zone d'alerte personnalisée à l'aide du script java, le code ci-dessous remplacera la fonction d'alerte par défaut

 window.alert = function(message) { $(document.createElement('div')) .attr({ title: 'Alert', 'class': 'alert' }) .html(message) .dialog({ buttons: { OK: function() { $(this).dialog('close'); } }, close: function() { $(this).remove(); }, modal: true, resizable: false, width: 'auto' }); }; 

L' utilisation des boîtes de dialogue JQuery UI n'est pas toujours une solution. Pour autant que je sache, l'alerte et la confirmation sont le seul moyen d'arrêter l'exécution d'un script à un certain point. En tant que solution de contournement, nous pouvons fournir un mécanisme permettant à l'utilisateur de savoir qu'une application doit appeler une alerte et confirmer. Cela peut se faire comme ceci par exemple (où showError utilise une boîte de dialogue jQuery ou d'autres moyens pour communiquer avec l'utilisateur):

 var f_confirm; function setConfirm() { f_confirm = confirm; confirm = function(s) { try { return f_confirm(s); } catch(e) { showError("Please do not check 'Prevent this page from creating additional dialogs'"); } return false; }; }; 

J'ai conçu cette fonction pour espérer contourner la case à cocher dans mes applications Web.

Il bloque toutes les fonctionnalités de la page lors de l'exécution (en supposant que moins de trois secondes se soit écoulée depuis que l'utilisateur a fermé la dernière boîte de dialogue), mais je le préfère à une fonction récursive ou setTimeout car je n'ai pas à coder pour la possibilité d'autre chose Être cliqué ou déclenché en attendant que la boîte de dialogue apparaisse.

Je l'exige le plus lorsqu'il affiche des erreurs / invite / confirme des rapports déjà contenus dans Modalbox. Je pourrais ajouter un div pour des boîtes de dialogue supplémentaires, mais cela semble trop désordonné et inutile si des boîtes de dialogue intégrées peuvent être utilisées.

Notez que cela se casserait probablement si dom.successive_dialog_time_limit est changé en une valeur supérieure à 3, et je ne sais pas si Chrome a le même défaut que Firefox. Mais au moins c'est une option.

Aussi, si quelqu'un peut l'améliorer, faites-le!

 // note that these should not be in the global namespace var dlgRslt, lastTimeDialogClosed = 0; function dialog(msg) { var defaultValue, lenIsThree, type; while (lastTimeDialogClosed && new Date() - lastTimeDialogClosed < 3001) { // timer } lenIsThree = 3 === arguments.length; type = lenIsThree ? arguments[2] : (arguments[1] || alert); defaultValue = lenIsThree && type === prompt ? arguments[1] : ''; // store result of confirm() or prompt() dlgRslt = type(msg, defaultValue); lastTimeDialogClosed = new Date(); } 

usage:

 dialog('This is an alert.'); dialog( 'This is a prompt', prompt ); dialog('You entered ' + dlgRslt); dialog( 'Is this a prompt?', 'maybe', prompt ); dialog('You entered ' + dlgRslt); dialog( 'OK/Cancel?', confirm ); if (dlgRslt) { // code if true } 

Il s'agit d'une fonctionnalité de navigateur.

Si vous le pouvez, essayez d'utiliser http://bootboxjs.com/ , avec cette bibliothèque, vous pouvez faire la même chose de

 alert("Empty message sent"); 

en écrivant:

 bootbox.alert("Empty message sent", function(result) { // do something whit result }); 

Vous aurez également une belle interface utilisateur!