Jak utworzyć okno dialogowe z opcjami „tak” i „nie”?

658

Mam zamiar zrobić przycisk i zapisać dane w bazie danych.

Gdy użytkownik kliknie przycisk, chcę, aby alert JavaScript oferował opcje „tak” i „anuluj”. Jeśli użytkownik wybierze „tak”, dane zostaną wstawione do bazy danych, w przeciwnym razie nie zostaną podjęte żadne działania.

Jak wyświetlić takie okno dialogowe?

crchin
źródło
2
@Szenis Całkiem nieźle prosty i ładny styl tak / nie. Nienawidzę też okien dialogowych XUL, ponieważ zamraża tak wiele rzeczy. Dziękuję bardzo.
m3nda

Odpowiedzi:

1246

Prawdopodobnie szukasz confirm(), która wyświetla monit i zwraca truelub falsena podstawie decyzji podjętej przez użytkownika:

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
źródło
125
potwierdź ma OK i ANULUJ przyciski. Czy te przyciski można ustawić na TAK / NIE?
Owen,
16
@On Nie . Specyfikacja mówi, że po prostu dostaniesz wiadomość. Możesz emulować okno dialogowe w HTML (choć nie będzie blokować tak jak wbudowane). jQuery Dialog jest dobrym przykładem implementacji tego rodzaju rzeczy.
s4y
3
Uwaga: możesz umieścić returnwewnątrz innego, a następnie nie musisz zawijać całego kodu w potwierdzeniu! (poprawka po przypadku)
Jacob Raccuia
21
@JacobRaccuia Lub po prostuif(!confirm('message')) return;
Aaron
1
@Dimple obecnie nie ma możliwości dostosowania. Dlatego niektóre witryny używają niestandardowych okien dialogowych na stronie zamiast rodzimych.
s4y
90
var answer = window.confirm("Save data?")
if (answer) {
    //some code
}
else {
    //some code
}

Użyj window.confirmzamiast ostrzeżenia. To najprostszy sposób na osiągnięcie tej funkcjonalności.

Chuck Norris
źródło
15
Można również udać się if(confirm("...")){zamiast
Nicolas Bouliane
75

Jak to zrobić za pomocą „wbudowanego” 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
źródło
5
Lepiej jest obsłużyć zdarzenie onsubmit formularza: za pomocą kodu, jeśli użytkownik naciśnie klawisz Enter w tekście, formularz zostanie przesłany bez żadnego żądania!
p91paul
1
@ p91paul - Która przeglądarka nie działa dla Ciebie? Właśnie próbowałem nacisnąć Enter w IE, Chrome i Safari w systemie Windows i działało to zgodnie z oczekiwaniami. jsfiddle.net/ALjge/1
dana
Cóż, byłem pewien, co mówię, ale nie testowałem i się myliłem. Przepraszam!
p91paul
1
Nie ma problemu :) Zwykle istnieje więcej niż jeden sposób na skórowanie kota. Chciałem tylko potwierdzić, że moje podejście działa. Używanie <form onsubmit="...">jak sugeruje prace też :)
Dana
41

Unikaj wbudowanego JavaScript - zmiana zachowania oznaczałaby edycję każdego wystąpienia kodu i nie jest ładna!

Znacznie czystszym sposobem jest użycie atrybutu danych na elemencie, takiego jak data-confirm="Your message here". Mój kod poniżej obsługuje następujące działania, w tym elementy generowane dynamicznie:

  • ai buttonkliknięcia
  • form przesyła
  • option wybiera

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>

Demo JSFiddle

rybo111
źródło
2
Bardzo czyste rozwiązanie, o którym wcześniej nie myślałem. Może być jeszcze bardziej zwięzły:$("[data-confirm]").on('click,submit', function() { /* ... */ })
Grimace of Despair
Przepraszam, nie mogłem się powstrzymać, żeby na to rzucić okiem. Po pierwsze: zdarzenia powinny być oddzielone spacją. Po drugie: nadal możesz zaostrzyć kod jsfiddle.net/jguEg ;)
Grimace of Despair
@GrimaceofDespair Zaktualizowałem kod, ponieważ kliknięcie i potwierdzenie type="button" zapytałem, czy użytkownik chce przesłać formularz (ponieważ klikasz element formularza), co oczywiście nie nastąpiło po ponownym kliknięciu OK.
rybo111
Są to dobre przykłady, chociaż wszystkie używają okna dialogowego potwierdzenia (), więc nie można zmienić nazwy przycisków Anuluj / OK: |
rogerdpack,
@rogerdpack Tak, ale piękno korzystania z atrybutów danych polega na tym, że możesz zmienić confirm()cokolwiek chcesz bez zmiany HTML.
rybo111,
22

Musisz utworzyć custome confirmBox , zmiana przycisków w oknie dialogowym wyświetlanym przez funkcję potwierdzenia nie jest możliwa.

Jquery confirmBox


zobacz ten przykład: 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();
}

Zadzwoń po swój kod:

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

** Czysty JavaScript confirmBox **


Przykład : 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>

Skrypt :

<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
źródło
2
Tak miło też… całkiem prosty, czysty javascript i nie tyle css. Podoba mi się: D
m3nda
Potwierdź, że pola powinny zniknąć po naciśnięciu elementu. Powinieneś także używać klas, a nie identyfikatorów.
rybo111,
@rogerdpack Zaktualizowałem skrzypce daj mi znać, jeśli
będziesz
@rogerdpack, jeśli podoba Ci się odpowiedź, możesz zagłosować: P
Keval Bhatt
@KevalBhatt, podoba mi się twoja wersja „czystego JS”. Czy jest jakiś sposób na usunięcie / ukrycie / jakiekolwiek okno dialogowe zaraz po naciśnięciu przycisku? Po umieszczeniu document.getElementById('id_confrmdiv').style.display="none";okno dialogowe jest ukryte po wszystkich poleceniach wykonanych metodą dla przycisku.
Andrii Muzychuk
13

Ta wtyczka może pomóc w potwierdzeniu jquery łatwym w użyciu

$.confirm({
    title: 'Confirm!',
    content: 'Simple confirm!',
    confirm: function(){
        alert('Confirmed!');
    },
    cancel: function(){
        alert('Canceled!')
    }
});
ibrahim ozboluk
źródło
8

Lub po prostu:

<a href="https://some-link.com/" onclick="return confirm('Are you sure you want to go to that link?');">click me!</a>
JavaRunner
źródło
1
Dziękuję Ci! Obawiałem się, że będę musiał dołączyć jQuery do mojej prostej aplikacji CRUD, aby zrobić to proste, na pewno chcesz to usunąć.
Will Matheson,
7

Możesz przechwycić onSubmitzdarzenie JS. Następnie zadzwoń do powiadomienia potwierdzającego, a następnie chwyć wynik.

marcelo-ferraz
źródło
5

Inny sposób to zrobić:

$("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
źródło
5

To w pełni responsywne rozwiązanie wykorzystujące javascript waniliowy:

// 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
źródło
3

xdialog zapewnia proste API xdialog.confirm () . Fragment kodu jest następujący. Więcej demonstracji można znaleźć tutaj

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
źródło
Musisz opisać, co masz na myśli // do work here... Czy funkcje YES TEXTi NO TEXTprzejdź tam?
kev
1
@kev, oddzwanianie zostanie wykonane, gdy użytkownik wybierze przycisk OK.
xia xiongjun
i gdzie idzie logika NO TEXT?
kev
Możesz dodać oncancelopcję do ostatnich opcji parametru xdialog.confirm(text, onyes, options). Aby uzyskać więcej informacji, patrz: 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
źródło
Przepraszam, hiszpański?
zixuan