Как создать диалог с опциями «да» и «нет»?


658

Я собираюсь сделать кнопку, чтобы выполнить действие и сохранить данные в базе данных.

Когда пользователь нажимает кнопку, я хочу, чтобы в JavaScript-сообщении предлагались варианты «да» и «отмена». Если пользователь выбирает «да», данные будут вставлены в базу данных, в противном случае никаких действий предприниматься не будет.

Как отобразить такой диалог?


2
@Szenis Довольно мертвый простой и красивый стиль да / нет. Я тоже ненавижу диалоги XUL, потому что так много зависает. Огромное спасибо.
m3nda

Ответы:


1248

Вы, вероятно, ищете confirm(), который отображает подсказку и возвращает trueили в falseзависимости от того, что решил пользователь:

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
Подтверждение имеет кнопки ОК и ОТМЕНА. Можно ли установить эти кнопки на YES / NO?
Оуэн

16
@ Спецификация говорит, что вы просто должны предоставить сообщение. Вы можете эмулировать диалог в HTML (хотя он не будет блокироваться, как встроенный). jQuery Dialog - хороший пример реализации такого рода вещей.
s4y

3
примечание: вы можете поместить returnвнутрь else, и тогда вам не нужно оборачивать весь ваш код в подтверждение! (хотя исправление в каждом конкретном случае)
Джейкоб Раккуя

21
@JacobRaccuia Или простоif(!confirm('message')) return;
Аарон

1
@ В настоящее время нет способа настроить его. Вот почему некоторые веб-сайты используют собственные, внутристраничные диалоги вместо собственных.
s4y

90
var answer = window.confirm("Save data?")
if (answer) {
    //some code
}
else {
    //some code
}

Используйте window.confirmвместо предупреждения. Это самый простой способ достичь этой функциональности.


15
Вы также можете пойти if(confirm("...")){вместо этого
Николас Булиан

75

Как это сделать с помощью встроенного 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
Лучше обрабатывать событие отправки формы: с вашим кодом, если пользователь нажимает ввод текста, форма отправляется без запроса!
p91paul

1
@ p91paul - Какой браузер у вас не работает? Я просто попытался нажать Enter в IE, Chrome и Safari в Windows, и это сработало, как и ожидалось. jsfiddle.net/ALjge/1
Dana

ну, я был уверен в том, что я говорил, но я не проверял, и я был неправ. Извините!
p91paul

1
Нет проблем :) Обычно существует более одного способа кожи кошки. Я просто хотел подтвердить, что мой подход работает. Использование, <form onsubmit="...">как вы предложили, тоже работает :)
Дана

41

Избегайте встроенного JavaScript - изменение поведения будет означать редактирование каждого экземпляра кода, и это не красиво!

Гораздо более чистый способ - использовать атрибут данных элемента, например data-confirm="Your message here". Мой код ниже поддерживает следующие действия, включая динамически генерируемые элементы:

  • aи buttonщелкает
  • form вносит представление
  • option выбирает

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


2
Очень чистое решение, о котором я раньше не думал. Может быть еще более кратким , хотя:$("[data-confirm]").on('click,submit', function() { /* ... */ })
гримаса отчаяния

Извините, не удержался, чтобы взглянуть на это снова. Первое: события должны быть разделены пробелом. Второе: вы все еще можете затянуть код jsfiddle.net/jguEg ;)
Гримаса Отчаяния

@GrimaceofDespair Я обновил код, потому что нажав и подтвердив type="button" он спросил, хочет ли пользователь отправить форму (потому что вы щелкаете элемент формы), что, очевидно, не произошло после повторного нажатия OK.
rybo111

Это хорошие примеры, хотя все они используют диалог подтверждения (), поэтому вы не можете переименовать кнопки Отмена / ОК: |
rogerdpack

@rogerdpack Да, но прелесть использования атрибутов данных в том, что вы можете изменить их confirm()на любое, не изменяя HTML.
rybo111

22

Вы должны создать обычное поле подтверждения , невозможно изменить кнопки в диалоговом окне, отображаемом функцией подтверждения.

Jquery confirmBox


посмотрите этот пример: 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();
}

Назовите это своим кодом:

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

** Чистый JavaScript подтвердите Box **


Пример : 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>

скрипт :

<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
Так хорошо тоже .. довольно просто, чистый javascript и не так много CSS. Понравилось: D
m3nda

Поля подтверждения должны исчезнуть после нажатия на элемент. Кроме того, вы должны использовать классы, а не идентификаторы.
rybo111

@rogerdpack Я обновил скрипку, дайте мне знать, если что-нибудь понадобится с моей стороны :)
Кевал Бхатт

@rogerdpack, если вам нравится ответ, то вы можете проголосовать: P
Кевал Бхатт

@KevalBhatt, мне нравится твоя версия "чистого JS". Есть ли способ удалить / скрыть / любой диалог сразу после нажатия кнопки? Если я поставлю, document.getElementById('id_confrmdiv').style.display="none";диалог скрыт после всех команд, выполненных в методе для кнопки.
Андрей Музычук


8

Или просто:

<a href="https://some-link.com/" onclick="return confirm('Are you sure you want to go to that link?');">click me!</a>

1
Спасибо! Я боялся, что мне придется включить jQuery в мое простое приложение CRUD, просто чтобы просто удалить это.
Уилл Мэтсон

7

Вы можете перехватить onSubmitсобытие JS. Затем вызовите подтверждение и захватите результат.


5

Еще один способ сделать это:

$("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

Это полностью адаптивное решение с использованием ванильного 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>


3

xdialog предоставляет простой API xdialog.confirm () . Фрагмент кода следующий. Больше демоверсий можно найти здесь

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>


Ты должен описать, что ты имеешь в виду // do work here... Есть ли функции для YES TEXTи NO TEXTтуда?
к

1
@kev, обратный вызов будет выполнен, когда пользователь выберет кнопку ОК.
Ся Сюнцзюнь

и где логика NO TEXT?
к

Вы можете добавить oncancelопцию к последним параметрам параметра xdialog.confirm(text, onyes, options). Для получения более подробной информации смотрите: 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';       
   }
});

Прости, испанский?
Zixuan
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.