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?


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


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.


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>

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


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


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

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>

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.


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


   });

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>


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>


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

Przepraszam, hiszpański?
zixuan
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.