How to create a dialog with “Ok” and “Cancel” options
I am going to make a button to take an action and save the data into a database. Once the user clicks on the button, I want a JavaScript alert to offer “yes” and “cancel” options. If the user selects “yes”, the data will be inserted into the database, otherwise no action will be taken. How do I display such a dialog?
17 Answers 17
You’re probably looking for confirm() , which displays a prompt and returns true or false based on what the user decided:
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.'); >
@Owen No. The spec says that you just get to provide a message. You can emulate a dialog in HTML (though it won’t block like the built-in one). jQuery Dialog is a good example of implementing this kind of thing.
note: you can put a return inside the else and then you don’t need to wrap all of your code in the confirm! (case by case fix though)
var answer = window.confirm("Save data?"); if (answer) < //some code >else < //some code >
Use window.confirm instead of alert. This is the easiest way to achieve that functionality.
How to do this using ‘inline’ JavaScript:
It’s better to handle onsubmit event of the form: with your code, if user presses enter in text, the form gets submitted without any request!
@p91paul — Which browser does this fail for you? I just tried pressing enter in IE, Chrome, and Safari on Windows and it worked as expected. jsfiddle.net/ALjge/1
No problem 🙂 There is usually more than one way to skin a cat. I just wanted to confirm my approach was working. Using the
Avoid inline JavaScript — changing the behaviour would mean editing every instance of the code, and it isn’t pretty!
A much cleaner way is to use a data attribute on the element, such as data-confirm=»Your message here» . My code below supports the following actions, including dynamically-generated elements:
$(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; >>);
Anchor
Very clean solution I haven’t thought of before. Can be even more concise though: $(«[data-confirm]»).on(‘click,submit’, function() < /* . */ >)
Sorry, couldn’t resist to have a look at it again. First: the events should be separated by a space. Second: you can still tighten the code jsfiddle.net/jguEg 😉
@GrimaceofDespair I have updated the code, because clicking and confirming a type=»button» then asked if the user wanted to submit the form (because you are clicking a form element), which obviously didn’t happen after clicking OK again.
These are good examples, though they all use the confirm() dialog so you can’t rename the Cancel/OK buttons 😐
@rogerdpack Yes, but the beauty of using data attributes is you can change confirm() to whatever you want without changing the HTML.
You have to create a custom confirmBox. It is not possible to change the buttons in the dialog displayed by the confirm function.
jQuery confirmBox
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() < alert('Yes'); >, function no() < alert('No'); >);
Pure JavaScript confirmBox
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; >; >
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
confirmation
Guys, you got pretty good examples, this is a POC. If you don’t like it , adapt to your needs and do not blame author. Note: jquery confirmBox example link is not working anymore. By the way, Pure JS is great example.
Thank you! I was afraid I’d have to include jQuery in my simple CRUD app just to do a simple are-you-sure-you-want-to-delete this.
This plugin can help you jquery-confirm easy to use
This a full responsive solution using vanilla javascript :
// Call function when show dialog btn is clicked document.getElementById("btn-show-dialog").onclick = function(); 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(); 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(); 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
Lorem ipsum dolor sit amet. Aliquam erat volutpat. Maecenas non tortor nulla, non malesuada velit.
Aliquam erat volutpat. Maecenas non tortor nulla, non malesuada velit. Nullam felis tellus, tristique nec egestas in, luctus sed diam. Suspendisse potenti.
This will be saved. Continue ?
You can intercept the onSubmit event using JavaScript.
Then call a confirmation alert and then grab the result.
$("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 >);
xdialog provides a simple API xdialog.confirm(). Code snippet is following. More demos can be found here
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!'); >>); >
You gotta describe what you mean by // do work here.. . Do the functions for YES TEXT and NO TEXT go there?
You can add an oncancel option to the last parameter options of xdialog.confirm(text, onyes, options) . For more details see: xdialog default-options
Made super simple, tiny vanilla js confirm dialog with Yes and No buttons.
It’s a pity we can’t customize the native one.
Another solution apart from the others is to use the new dialog element. You need to make use of show or showModal methods based on interactivity with other elements. close method can be used for closing the open dialog box.
const dialogEl = document.querySelector("dialog"); const openDialog = document.querySelector("button.open-dialog"); const yesBtn = document.querySelector(".yes"); const noBtn = document.querySelector(".no"); const result = document.querySelector(".result"); openDialog.addEventListener("click", () => < dialogEl.showModal(); >); yesBtn.addEventListener("click", () => < // Below line can be replaced by your DB query result.textContent = "This could have been your DB query"; dialogEl.close(); >); noBtn.addEventListener("click", () => < result.textContent = ""; dialogEl.close(); >);
@import url('https://fonts.googleapis.com/css2?family=Roboto:wght@300&display=swap'); body < font-family: "Roboto"; >button < background: hsl(206deg 64% 51%); color: white; padding: 0.5em 1em; border: 0 none; cursor: pointer; >dialog < border: 0 none; >.result
Right now the compatibility is great with all the modern browsers.
I’m currently working on a web workflow which already has it’s own notifications/dialog boxes, and I recently (like, today) created a tiny, custom (and tailored to the project needs) YES/NO dialog box.
All dialog boxes appeard over a modal layer. Full user attention is required.
I define the options configurations in this way. This options are used to define the buttons text, and the values associated to each button when there clicked:
The use of the function goes something like this:
const answer = await notifier.showDialog('choose an option', options.config); if (answer) < // 'Yes' was clicked >else < // 'No' was clicked! >
What I do, it’s simply creating a async event handler for each option, it means, there is a simple handler assigned to each button. Each handler returns the value of the option. The handlers are pushed inside an array. The array is then passed to Promise.race , and that is the return value of the showDialog method, which will correspond to the value ‘s actual value (the one returned by the handler).
Can’t provide too much code. As I said it’s a very specific case, but the idea may be usefull for other implementations. Twenty lines of code or so.
A vanilla JavaScript option with a class for creating the custom modal dialog which includes a text box:
.modal_dialog
Some content /** Encapsulates a custom modal dialog in pure JS */ class CustomModalDialog < /** * Constructs the modal content * @param htmlContent - content of the HTML dialog to show * @param okayControlElementId - elementId of the okay button, image or control * @param cancelControlElementId - elementId of the cancel button, image or control * @param insertionElementId - elementId of the or whatever tag to * insert the html at within the document * @param callbackOnOkay - method to invoke when the okay button or control is clicked. * @param callbackOnCancel - method to invoke when the cancel button or control is clicked. * @param callbackTag (optional) - to allow object to be passed to the callbackOnOkay * or callbackOnCancel methods when they're invoked. */ constructor(htmlContent, okayControlElementId, cancelControlElementId, insertionElementId, callbackOnOkay, callbackOnCancel, callbackTag) < this.htmlContent = htmlContent; this.okayControlElementId = okayControlElementId; this.cancelControlElementId = cancelControlElementId; this.insertionElementId = insertionElementId; this.callbackOnOkay = callbackOnOkay; this.callbackOnCancel = callbackOnCancel; this.callbackTag = callbackTag; >/** shows the custom modal dialog */ show() < // must insert the HTML into the page before searching for ok/cancel buttons var insertPoint = document.getElementById(this.insertionElementId); insertPoint.innerHTML = this.htmlContent; var okayControl = document.getElementById(this.okayControlElementId); var cancelControl = document.getElementById(this.cancelControlElementId); okayControl.addEventListener('click', event =>< this.callbackOnOkay(event, insertPoint, this.callbackTag); >); cancelControl.addEventListener('click', event => < this.callbackOnCancel(event, insertPoint, this.callbackTag); >); > // end: method /** hide the custom modal dialog */ hide() < var insertPoint = document.getElementById(this.insertionElementId); var okayControl = document.getElementById(this.okayControlElementId); var cancelControl = document.getElementById(this.cancelControlElementId); insertPoint.innerHTML = ""; okayControl.removeEventListener('click', this.callbackOnOkay, false ); cancelControl.removeEventListener('click', this.callbackOnCancel, false ); >// end: method /** sets the focus to given element id */ setFocus(elementId) < var focusElement = document.getElementById(elementId); focusElement.focus(); if (typeof focusElementstr === "HTMLInputElement") focusElement.select(); >> // end: class
диалоговое окно да /нет
Привет. Есть функция удаления чего то из базы. Она внесена на страницу, хочу сделать так, чтобы при нажатии на ту кнопку появлялось окошко, которое спрашивало уверен ли пользователь в этом действии. кнопки да и нет, должны обрабатываться так, чтобы при нажатии да действительно происходило удаление, а при нет просто попадем на ту же страницу например. Как это реализовать? куда копать, желательно примеры! 🙂 но буду рад любой информации!
диалоговое окно с кнопками «да» и «нет»
Создать веб-страницу,которая вызывает диалоговое окно,содержащее сообщение и 2 кнопки "ДА"и"НЕТ".
Диалоговое окно с кнопками «да» и «нет»
Подскажите как сделать, когда жмешь на картинку, что бы выходило диалоговое окно с кнопкоми да и.
Диалоговое окно
Как вывести диалоговое окно "Да — Нет" в браузере?
Диалоговое окно!
При нажатии на ссылку появляется вопрос удалить объявление да нет! Если да то делаем переход по.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30
DOCTYPE html> html> body> p>Click the button to display a confirm box.p> button onclick="myFunction()">Try itbutton> p id="demo">p> script> function myFunction() { if (confirm("Choose Yes or Not")) { alert("You pressed OK!"); //тут удаление записи из базы } else { alert("You pressed Cancel!"); //тут просто остаемся на странице } } script> body> html>
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31
html> body> p>Click the button to display a confirm box./p> button onclick="myFunction()">Try it/button> p id="demo">/p> script> function myFunction() < if (confirm("Choose Yes or Not")) < alert("You pressed OK!"); (); ?> //тут удаление записи из базы > else < alert("You pressed Cancel!"); //тут просто остаемся на странице >> /script> /body> /html>
Vovan-VE, в смысле? если вы тыкаете кого-то мордой в грязь, делайте это поинформативнее, чтобы человек хотя бы понял в какую сторону ему копать.
Сообщение от VladSharikov
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31
html> body> p>Click the button to display a confirm box./p> button onclick="myFunction()">Try it/button> p id="demo">/p> script> function myFunction() < if (confirm("Choose Yes or Not")) < alert("You pressed OK!"); (); ?> //тут удаление записи из базы > else < alert("You pressed Cancel!"); //тут просто остаемся на странице >> /script> /body> /html>
от того что Вы кинули это работать не стало и прояснятся тоже не стало. в чем ошибка?
такой код благополучно завершился удалением записи еще при загрузке страницы.
Сообщение от VladSharikov
я это и написал постом выше.
Дак в итоге возвращаемся к первому посту
Сообщение от VladSharikov
Сообщение от VladSharikov
Vovan-VE, перечитал еще раз, в первый раз не заострил на этом внимание т.к. итак это понимаю.
я это и написал постом выше.
Дак в итоге возвращаемся к первому посту
я не говорю, что это должен быть чистый JS, аякс или jquery возможно.
Исходя из вашего вопроса я написал простой javascript через confirm box который обработает ваш запрос. Я подразумевал что вы знаете следующее:
1. Вы знаете как работает браузер.
2. Вы знаете что такое php.
3. Вы знаете что такое база данных.
4. Вы знаете как работает синхронный/асинхронный запрос.
5. Вы знаете как работает javascript.
6. Вы знаете как работает пункт 5 в связке с пунктом 2.
Потому недостаточно информировал Вас. Я могу помочь только при наличии большего количества данных. А именно: конкретизации проблемы(ибо первый пост говорит только о том что нужен пункт5).
P.S критика граждан постами выше вполне уместная,ибо Вы действительно недостаточно охарактеризовали проблему.