Wie erstelle ich einen Dialog mit den Optionen "Ja" und "Nein"?

657

Ich werde eine Schaltfläche erstellen, um eine Aktion auszuführen und die Daten in einer Datenbank zu speichern.

Sobald der Benutzer auf die Schaltfläche klickt, möchte ich, dass eine JavaScript-Warnung die Optionen "Ja" und "Abbrechen" bietet. Wenn der Benutzer "Ja" wählt, werden die Daten in die Datenbank eingefügt, andernfalls werden keine Maßnahmen ergriffen.

Wie zeige ich einen solchen Dialog an?

Crchin
quelle
2
@Szenis Ziemlich einfach und nett Stil ja / nein. Ich hasse auch die XUL-Dialoge, weil sie so viele Dinge einfrieren. Ich danke dir sehr.
m3nda

Antworten:

1245

Sie suchen wahrscheinlich nach confirm(), was eine Eingabeaufforderung anzeigt und zurückgibt trueoder falsebasierend auf dem, was der Benutzer entschieden hat:

if (confirm('Are you sure you want to save this thing into the database?')) {
  // Save it!
  console.log('Thing was saved to the database.');
} else {
  // Do nothing!
  console.log('Thing was not saved to the database.');
}

s4y
quelle
125
Bestätigen hat OK und CANCEL. Können diese Tasten auf JA / NEIN gesetzt werden?
Owen
16
@Owen Nein. Die Spezifikation besagt, dass Sie nur eine Nachricht bereitstellen müssen. Sie können einen Dialog in HTML emulieren (obwohl er nicht wie der integrierte blockiert). jQuery Dialog ist ein gutes Beispiel für die Implementierung dieser Art von Dingen.
s4y
3
Hinweis: Sie können ein returnelse in das else einfügen und müssen dann nicht Ihren gesamten Code in die Bestätigung einschließen! (Fall für Fall
behoben
21
@ JacobRaccuia Oder einfachif(!confirm('message')) return;
Aaron
1
@Dimple gibt es derzeit keine Möglichkeit, es anzupassen. Aus diesem Grund verwenden einige Websites benutzerdefinierte In-Page-Dialoge anstelle der nativen.
s4y
90
var answer = window.confirm("Save data?")
if (answer) {
    //some code
}
else {
    //some code
}

Verwenden Sie window.confirmanstelle von Alarm. Dies ist der einfachste Weg, um diese Funktionalität zu erreichen.

Chuck Norris
quelle
15
Sie können if(confirm("...")){stattdessen auch mit gehen
Nicolas Bouliane
75

So geht's mit Inline-JavaScript:

<form action="http://www.google.com/search">
  <input type="text" name="q" />
  <input type="submit" value="Go"
    onclick="return confirm('Are you sure you want to search Google?')"
  />
</form>
Dana
quelle
5
Es ist besser, das Ereignis onsubmit des Formulars zu behandeln: Wenn der Benutzer mit Ihrem Code die Eingabetaste drückt, wird das Formular ohne Aufforderung gesendet!
p91paul
1
@ p91paul - Welcher Browser schlägt für Sie fehl? Ich habe gerade versucht, die Eingabetaste in IE, Chrome und Safari unter Windows zu drücken, und es hat wie erwartet funktioniert. jsfiddle.net/ALjge/1
dana
Nun, ich war mir sicher, was ich sagte, aber ich habe nicht getestet und ich habe mich geirrt. Es tut uns leid!
p91paul
1
Kein Problem :) Normalerweise gibt es mehr als einen Weg, eine Katze zu häuten. Ich wollte nur bestätigen, dass mein Ansatz funktioniert. Die Verwendung der <form onsubmit="...">von Ihnen vorgeschlagenen funktioniert auch :)
Dana
41

Vermeiden Sie Inline-JavaScript - eine Änderung des Verhaltens würde bedeuten, dass jede Instanz des Codes bearbeitet wird, und es ist nicht schön!

Eine viel sauberere Möglichkeit besteht darin, ein Datenattribut für das Element zu verwenden, z data-confirm="Your message here". Mein Code unten unterstützt die folgenden Aktionen, einschließlich dynamisch generierter Elemente:

  • aund buttonklickt
  • form reicht ein
  • option wählt aus

jQuery:

$(document).on('click', ':not(form)[data-confirm]', function(e){
    if(!confirm($(this).data('confirm'))){
        e.stopImmediatePropagation();
        e.preventDefault();
    }
});

$(document).on('submit', 'form[data-confirm]', function(e){
    if(!confirm($(this).data('confirm'))){
        e.stopImmediatePropagation();
        e.preventDefault();
    }
});

$(document).on('input', 'select', function(e){
    var msg = $(this).children('option:selected').data('confirm');
    if(msg != undefined && !confirm(msg)){
        $(this)[0].selectedIndex = 0;
    }
});

HTML:

<!-- hyperlink example -->
<a href="http://www.example.com" data-confirm="Are you sure you want to load this URL?">Anchor</a>

<!-- button example -->
<button type="button" data-confirm="Are you sure you want to click the button?">Button</button>

<!-- form example -->
<form action="http://www.example.com" data-confirm="Are you sure you want to submit the form?">
    <button type="submit">Submit</button>
</form>

<!-- select option example -->
<select>
    <option>Select an option:</option>
    <option data-confirm="Are you want to select this option?">Here</option>
</select>

JSFiddle-Demo

rybo111
quelle
2
Sehr saubere Lösung, an die ich noch nie gedacht habe. Kann aber noch prägnanter sein:$("[data-confirm]").on('click,submit', function() { /* ... */ })
Grimasse der Verzweiflung
Entschuldigung, ich konnte nicht widerstehen, es mir noch einmal anzusehen. Erstens: Die Ereignisse sollten durch ein Leerzeichen getrennt werden. Zweitens: Sie können den Code jsfiddle.net/jguEg immer noch verschärfen ;)
Grimace of Despair
@GrimaceofDespair Ich habe den Code aktualisiert, weil ich auf geklickt und bestätigt habe und type="button"dann gefragt habe, ob der Benutzer das Formular senden möchte (weil Sie auf ein Formularelement klicken), was offensichtlich nicht passiert ist, nachdem Sie erneut auf OK geklickt haben.
Rybo111
Dies sind gute Beispiele, obwohl sie alle das Bestätigungsdialogfeld () verwenden, sodass Sie die Schaltflächen Abbrechen / OK nicht umbenennen können: |
Rogerdpack
@rogerdpack Ja, aber das Schöne an der Verwendung von Datenattributen ist, dass Sie confirm()nach Belieben ändern können , ohne den HTML- Code zu ändern.
Rybo111
22

Sie müssen eine benutzerdefinierte Bestätigungsbox erstellen . Es ist nicht möglich, die Schaltflächen in dem von der Bestätigungsfunktion angezeigten Dialogfeld zu ändern.

Jquery verifyBox


Siehe dieses Beispiel: https://jsfiddle.net/kevalbhatt18/6uauqLn6/

<div id="confirmBox">
    <div class="message"></div>
    <span class="yes">Yes</span>
    <span class="no">No</span>
</div>

function doConfirm(msg, yesFn, noFn)
{
    var confirmBox = $("#confirmBox");
    confirmBox.find(".message").text(msg);
    confirmBox.find(".yes,.no").unbind().click(function()
    {
        confirmBox.hide();
    });
    confirmBox.find(".yes").click(yesFn);
    confirmBox.find(".no").click(noFn);
    confirmBox.show();
}

Nennen Sie es mit Ihrem Code:

doConfirm("Are you sure?", function yes()
{
    form.submit();
}, function no()
{
    // do nothing
});

** Reine JavaScript-Bestätigungsbox **


Beispiel : http://jsfiddle.net/kevalbhatt18/qwkzw3rg/127/

<div id="id_confrmdiv">confirmation
    <button id="id_truebtn">Yes</button>
    <button id="id_falsebtn">No</button>
</div>

<button onclick="doSomething()">submit</button>

Skript :

<script>

function doSomething(){
document.getElementById('id_confrmdiv').style.display="block"; //this is the replace of this line


document.getElementById('id_truebtn').onclick = function(){
   //do your delete operation
    alert('true');
};

document.getElementById('id_falsebtn').onclick = function(){
     alert('false');
   return false;
};
}
</script>

CSS :

body { font-family: sans-serif; }
#id_confrmdiv
{
    display: none;
    background-color: #eee;
    border-radius: 5px;
    border: 1px solid #aaa;
    position: fixed;
    width: 300px;
    left: 50%;
    margin-left: -150px;
    padding: 6px 8px 8px;
    box-sizing: border-box;
    text-align: center;
}
#id_confrmdiv button {
    background-color: #ccc;
    display: inline-block;
    border-radius: 3px;
    border: 1px solid #aaa;
    padding: 2px;
    text-align: center;
    width: 80px;
    cursor: pointer;
}
#id_confrmdiv .button:hover
{
    background-color: #ddd;
}
#confirmBox .message
{
    text-align: left;
    margin-bottom: 8px;
}

Keval Bhatt
quelle
2
So schön auch .. ziemlich einfach, reines Javascript und nicht so viel CSS. Gefällt
mir
Bestätigungsfelder sollten verschwinden, sobald ein Element gedrückt wird. Außerdem sollten Sie Klassen verwenden, keine IDs.
Rybo111
@rogerdpack Ich habe Geige aktualisiert. Lass es mich wissen, wenn ich etwas von meiner Seite brauche :)
Keval Bhatt
@rogerdpack, wenn Sie Antwort mögen, dann können Sie abstimmen: P
Keval Bhatt
@ KevinBhatt, ich mag deine 'pure JS'-Version. Gibt es eine Möglichkeit, den Dialog direkt nach dem Drücken einer Schaltfläche zu entfernen / auszublenden / was auch immer? Wenn ich setze, wird document.getElementById('id_confrmdiv').style.display="none";der Dialog ausgeblendet, nachdem alle Befehle in der Methode für eine Schaltfläche ausgeführt wurden.
Andrii Muzychuk
13

Dieses Plugin kann Ihnen helfen, einfach zu bedienen

$.confirm({
    title: 'Confirm!',
    content: 'Simple confirm!',
    confirm: function(){
        alert('Confirmed!');
    },
    cancel: function(){
        alert('Canceled!')
    }
});
ibrahim ozboluk
quelle
8

Oder einfach:

<a href="https://some-link.com/" onclick="return confirm('Are you sure you want to go to that link?');">click me!</a>
JavaRunner
quelle
1
Vielen Dank! Ich befürchtete, ich müsste jQuery in meine einfache CRUD-App aufnehmen, um dies einfach zu tun, wenn Sie sicher sind, dass Sie dies löschen möchten.
Will Matheson
7

Sie können das onSubmitEreignis abfangen, das JS ist. Rufen Sie dann eine Bestätigungsbenachrichtigung an und rufen Sie das Ergebnis ab.

marcelo-ferraz
quelle
5

Ein anderer Weg, dies zu tun:

$("input[name='savedata']").click(function(e){
       var r = confirm("Are you sure you want to save now?");

       //cancel clicked : stop button default action 
       if (r === false) {
           return false;
        }

        //action continues, saves in database, no need for more code


   });
Aris
quelle
5

Dies ist eine vollständig reaktionsfähige Lösung mit Vanille-Javascript:

// Call function when show dialog btn is clicked
document.getElementById("btn-show-dialog").onclick = function(){show_dialog()};
var overlayme = document.getElementById("dialog-container");

function show_dialog() {
 /* A function to show the dialog window */
    overlayme.style.display = "block";
}

// If confirm btn is clicked , the function confim() is executed
document.getElementById("confirm").onclick = function(){confirm()};
function confirm() {
 /* code executed if confirm is clicked */   
    overlayme.style.display = "none";
}

// If cancel btn is clicked , the function cancel() is executed
document.getElementById("cancel").onclick = function(){cancel()};
function cancel() {
 /* code executed if cancel is clicked */  
    overlayme.style.display = "none";
}
.popup {
  width: 80%;
  padding: 15px;
  left: 0;
  margin-left: 5%;
  border: 1px solid rgb(1,82,73);
  border-radius: 10px;
  color: rgb(1,82,73);
  background: white;
  position: absolute;
  top: 15%;
  box-shadow: 5px 5px 5px #000;
  z-index: 10001;
  font-weight: 700;
  text-align: center;
}

.overlay {
  position: fixed;
  width: 100%;
  top: 0;
  left: 0;
  right: 0;
  bottom: 0;
  background: rgba(0,0,0,.85);
  z-index: 10000;
  display :none;
}

@media (min-width: 768px) {
  .popup {
    width: 66.66666666%;
    margin-left: 16.666666%;
  }
}
@media (min-width: 992px) {
  .popup {
    width: 80%;
    margin-left: 25%;
  }
}
@media (min-width: 1200px) {
  .popup {
    width: 33.33333%;
    margin-left: 33.33333%;
  }
}

.dialog-btn {
  background-color:#44B78B;
  color: white;
  font-weight: 700;
  border: 1px solid #44B78B;
  border-radius: 10px;
  height: 30px;
  width: 30%;
}
.dialog-btn:hover {
  background-color:#015249;
  cursor: pointer;
}
<div id="content_1" class="content_dialog">
    <p>Lorem ipsum dolor sit amet. Aliquam erat volutpat. Maecenas non tortor nulla, non malesuada velit.</p>
    <p>Aliquam erat volutpat. Maecenas non tortor nulla, non malesuada velit. Nullam felis tellus, tristique nec egestas in, luctus sed diam. Suspendisse potenti.</p>
</div>

<button id="btn-show-dialog">Ok</button>


<div class="overlay" id="dialog-container">
  <div class="popup">
    <p>This will be saved. Continue ?</p>
    <div class="text-right">
      <button class="dialog-btn btn-cancel" id="cancel">Cancel</button>
      <button class="dialog-btn btn-primary" id="confirm">Ok</button>
    </div>
  </div>
</div>

Alouani Younes
quelle
3

xdialog bietet eine einfache API xdialog.confirm () . Code-Snippet folgt. Weitere Demos finden Sie hier

document.getElementById('test').addEventListener('click', test);

function test() {
  xdialog.confirm('Are you sure?', function() {
    // do work here if ok/yes selected...
    console.info('Done!');
  }, {
    style: 'width:420px;font-size:0.8rem;',
    buttons: {
      ok: 'yes text',
      cancel: 'no text'
    },
    oncancel: function() {
      console.warn('Cancelled!');
    }
  });
}
<link href="https://cdn.jsdelivr.net/gh/xxjapp/xdialog@3/xdialog.min.css" rel="stylesheet"/>
<script src="https://cdn.jsdelivr.net/gh/xxjapp/xdialog@3/xdialog.min.js"></script>
<button id="test">test</button>

xia xiongjun
quelle
Du musst beschreiben, was du meinst // do work here... Machen Sie die Funktionen für YES TEXTund NO TEXTgehen Sie dorthin?
Kev
1
@kev, der Rückruf wird ausgeführt, wenn der Benutzer die Schaltfläche OK auswählt.
Xia Xiongjun
und wohin geht die Logik für NO TEXT?
Kev
Sie können oncancelden letzten Parameteroptionen von eine Option hinzufügen xdialog.confirm(text, onyes, options). Für weitere Details siehe: xdialog default-options
xia xiongjun
-2
document.getElementById("button").addEventListener("click", function(e) {
   var cevap = window.confirm("Satın almak istediğinizden emin misiniz?");
   if (cevap) {
     location.href='Http://www.evdenevenakliyat.net.tr';       
   }
});
alpc
quelle
Es tut mir leid, Spanisch?
Zixuan