web-dev-qa-db-de.com

Warum wird in der Benachrichtigungsbox die Meldung "Diese Seite darf keine zusätzlichen Dialoge erstellen" angezeigt?

In meiner Rails 3-Anwendung mache ich:

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

Unter dieser Fehlermeldung (im selben Warnfeld) sehe ich manchmal: "Diese Seite kann keine zusätzlichen Dialoge erstellen" und ein Kontrollkästchen.

Was bedeutet das ?

Kann der zusätzliche Text und das Kontrollkästchen nicht angezeigt werden?

Ich benutze Firefox 4.

25
Misha Moroshko

Es ist eine Browserfunktion, mit der Websites angehalten werden, die immer wieder lästige Warnfelder anzeigen.

Als Webentwickler können Sie es nicht deaktivieren.

27
Marcel Korpel

Was bedeutet das ?

Dies ist eine Sicherheitsmaßnahme am Ende des Browsers, um zu verhindern, dass eine Seite den Browser (oder die aktuelle Seite) einfriert, indem modale Meldungen (Alert/Confirm) in einer Endlosschleife angezeigt werden. Siehe z. hier für Firefox.

Sie können dies nicht ausschalten. Der einzige Weg, es zu umgehen, ist die Verwendung von benutzerdefinierten Dialogen wie JQuery-Benutzeroberflächen .

10
Pekka 웃

Sie können ein benutzerdefiniertes Benachrichtigungsfeld mithilfe von Java-Skript erstellen. Der folgende Code überschreibt die Standardbenachrichtigungsfunktion

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'
    });
};
3
Arun

Die Verwendung der Dialogfelder von JQuery UI ist nicht immer eine Lösung. Alert und Confirm ist meines Wissens die einzige Möglichkeit, die Ausführung eines Skripts an einem bestimmten Punkt zu stoppen. Als Workaround können wir einen Mechanismus bereitstellen, der den Benutzer informiert, dass eine Anwendung einen Alarm aufrufen und bestätigen muss. Dies kann beispielsweise wie folgt durchgeführt werden (wobei showError ein jQuery-Dialogfeld oder ein anderes Mittel zur Kommunikation mit dem Benutzer verwendet):

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;
  };
};
0
mozey

Ich habe diese Funktion entworfen, um hoffentlich das Kontrollkästchen in meinen Web-Apps zu umgehen.

Während der Ausführung werden alle Funktionen auf der Seite blockiert (vorausgesetzt, es sind weniger als drei Sekunden vergangen, seit der Benutzer das letzte Dialogfeld geschlossen hat). Ich bevorzuge jedoch eine rekursive oder setTimeout-Funktion, da ich nicht für die Möglichkeit eines anderen Codes programmieren muss geklickt oder ausgelöst werden, während gewartet wird, bis der Dialog angezeigt wird.

Ich benötige es am häufigsten, wenn Fehler/Aufforderungen/Bestätigungen zu Berichten angezeigt werden, die bereits in Modalbox enthalten sind. Ich könnte ein div für zusätzliche Dialoge hinzufügen, aber das erscheint einfach zu unordentlich und unnötig, wenn eingebaute Dialoge verwendet werden können.

Beachten Sie, dass dies wahrscheinlich zu einem Bruch führen würde, wenn dom.successive_dialog_time_limit auf einen Wert größer als 3 geändert wird. Außerdem weiß ich nicht, ob Chrome den gleichen Standard wie Firefox hat. Aber es ist zumindest eine Option.

Wenn jemand etwas verbessern kann, tun Sie dies bitte!

// 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();
} 

verwendungszweck: 

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
}
0
Queue

Dies ist eine Browserfunktion.

Wenn Sie könnten, versuchen Sie http://bootboxjs.com/ zu verwenden, obwohl Sie diese Bibliothek verwenden können 

alert("Empty message sent");

schriftlich

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

Sie erhalten auch eine schöne Benutzeroberfläche!

0
zeppaman