ChatGPT解决这个技术问题 Extra ChatGPT

如何创建带有“确定”和“取消”选项的对话框

我将制作一个按钮来执行操作并将数据保存到数据库中。

一旦用户点击按钮,我想要一个 JavaScript 警报来提供“是”和“取消”选项。如果用户选择“是”,则将数据插入数据库,否则不执行任何操作。

如何显示这样的对话框?


E
Edric

您可能正在寻找 confirm(),它会根据用户的决定显示提示并返回 truefalse

if (confirm('Are you sure you want to save this thing into the database?')) { // 保存! console.log('东西已保存到数据库中。'); } else { // 什么都不做! console.log('没有保存到数据库中。'); }


确认有 OK 和 CANCEL 按钮。这些按钮可以设置为是/否吗?
@Owen No. The spec 说您只需提供一条消息。您可以在 HTML 中模拟一个对话框(尽管它不会像内置的那样阻塞)。 jQuery Dialog 是实现这种事情的一个很好的例子。
注意:您可以将 return 放在 else 中,然后您不需要将所有代码包装在确认中! (虽然逐案修复)
@JacobRaccuia 或者干脆if(!confirm('message')) return;
在 React 中使用 confirm 时,我必须使用 window.confirm 以避免出现 Unexpected use of confirm 错误
C
Chuck Norris
var answer = window.confirm("Save data?");
if (answer) {
    //some code
}
else {
    //some code
}

使用 window.confirm 代替警报。这是实现该功能的最简单方法。


您也可以改用 if(confirm("...")){
d
dana

如何使用“内联”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>

最好处理表单的 onsubmit 事件:使用您的代码,如果用户在文本中按 Enter,则无需任何请求即可提交表单!
@p91paul - 这对您来说哪个浏览器失败了?我刚刚尝试在 Windows 上的 IE、Chrome 和 Safari 中按 Enter 键,它按预期工作。 jsfiddle.net/ALjge/1
好吧,我确信我在说什么,但我没有测试过,我错了。对不起!
没问题 :) 通常有不止一种方法可以给猫剥皮。我只是想确认我的方法是有效的。按照您的建议使用 <form onsubmit="..."> 也可以:)
P
Peter Mortensen

避免内联 JavaScript - 改变行为意味着编辑代码的每个实例,而且它并不漂亮!

更简洁的方法是在元素上使用数据属性,例如 data-confirm="Your message here"。我下面的代码支持以下操作,包括动态生成的元素:

a 和按钮点击

表单提交

选项选择

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


我以前没有想到的非常干净的解决方案。不过可以更简洁:$("[data-confirm]").on('click,submit', function() { /* ... */ })
不好意思,忍不住又看了一遍。第一:事件应该用空格分隔。第二:您仍然可以收紧代码 jsfiddle.net/jguEg ;)
@GrimaceofDespair 我已经更新了代码,因为单击并确认 type="button" 然后询问用户是否要提交表单(因为您正在单击表单元素),这显然在再次单击确定后没有发生。
这些都是很好的例子,尽管它们都使用了 confirm() 对话框,所以你不能重命名 Cancel/OK 按钮:|
@rogerdpack 是的,但是使用数据属性的好处是您可以将 confirm() 更改为您想要的任何内容,而无需更改 HTML。
P
Peter Mortensen

您必须创建一个自定义确认框。无法更改确认功能显示的对话框中的按钮。

jQuery 确认框

请参阅此示例: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 确认框

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

也太好了.. 非常简单,纯 javascript 而不是那么多 css。喜欢它:D
按下项目后,确认框应消失。此外,您应该使用类,而不是 ID。
@rogerdpack 我更新了小提琴让我知道我是否需要任何东西:)
@rogerdpack 如果您喜欢回答,那么您可以投票:P
伙计们,你有很好的例子,这是一个 POC。如果您不喜欢它,请适应您的需求,不要责怪作者。注意:jquery confirmBox 示例链接不再起作用。顺便说一句,Pure JS 就是一个很好的例子。
E
Edric

或者简单地说:

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

谢谢!我担心我必须在我的简单 CRUD 应用程序中包含 jQuery 只是为了做一个简单的 are-you-sure-you-want-to-delete 这个。
s
swen

这个插件可以帮助您jquery-confirm易于使用

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

P
Peter Mortensen

您可以使用 JavaScript 拦截 onSubmit 事件。

然后调用确认警报,然后获取结果。


A
Alouani Younes

这是一个使用 vanilla javascript 的完整响应式解决方案:

// 点击显示对话框 btn 时调用函数 document.getElementById("btn-show-dialog").onclick = function(){show_dialog()}; var overlayme = document.getElementById("dialog-container"); function show_dialog() { /* 显示对话窗口的函数 */ overlayme.style.display = "block"; } // 如果点击了确认btn,则执行函数confim() document.getElementById("confirm").onclick = function(){confirm()}; function confirm() { /* 点击确认时执行的代码 */ overlayme.style.display = "none"; } // 如果点击取消btn,则执行函数cancel() document.getElementById("cancel").onclick = function(){cancel()}; function cancel() { /* 单击取消时执行的代码 */ overlayme.style.display = "none"; } .popup { 宽度:80%;填充:15px;左:0;左边距:5%;边框:1px 纯色 rgb(1,82,73);边框半径:10px;颜色:RGB(1,82,73);背景:白色;位置:绝对;最高:15%;盒子阴影:5px 5px 5px #000; z-索引:10001;字体粗细:700;文本对齐:居中; } .overlay { 位置:固定;宽度:100%;顶部:0;左:0;右:0;底部:0;背景:rgba(0,0,0,.85); z 指数:10000;显示:无; } @media (min-width: 768px) { .popup { 宽度: 66.66666666%;左边距:16.666666%; } } @media (min-width: 992px) { .popup { 宽度: 80%;左边距:25%; } } @media (min-width: 1200px) { .popup { 宽度: 33.33333%;左边距:33.33333%; } } .dialog-btn { 背景色:#44B78B;白颜色;字体粗细:700;边框:1px 实心#44B78B;边框半径:10px;高度:30px;宽度:30%; } .dialog-btn:hover { 背景色:#015249;光标:指针; }

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.


A
Aris

另一种方法:

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


   });

x
xia xiongjun

xdialog 提供了一个简单的 API xdialog.confirm()。代码片段如下。可以找到更多演示here

document.getElementById('test').addEventListener('click', test); function test() { xdialog.confirm('Are you sure?', function() { // 如果选择了 ok/yes,就在这里工作... console.info('Done!'); }, { style: 'width :420px;font-size:0.8rem;', 按钮: { ok: 'yes text', cancel: 'no text' }, oncancel: function() { console.warn('Cancelled!'); } }); }


您必须描述 // do work here.. 的含义。 YES TEXTNO TEXT 的功能在那里吗?
@kev,当用户选择确定按钮时将执行回调。
NO TEXT 的逻辑在哪里?
您可以将 oncancel 选项添加到 xdialog.confirm(text, onyes, options) 的最后一个参数选项。有关详细信息,请参阅:xdialog default-options
A
Alex Sidorenko

使用是和否按钮制作了超级简单、微小的香草 js 确认对话框。很遗憾我们不能自定义原生的。

https://www.npmjs.com/package/yesno-dialog

https://i.stack.imgur.com/nyGCF.png


E
Emilio Grisolía

我目前正在开发一个已经有自己的通知/对话框的网络工作流程,我最近(比如今天)创建了一个小型的自定义(并根据项目需要量身定制)YES/NO 对话框。

所有对话框都出现在模态层上。需要充分的用户关注。

我以这种方式定义选项配置。此选项用于定义按钮文本,以及单击时与每个按钮关联的值:

optionsConfig = [
   { text: 'Yes', value: true },
   { text: 'No', value: false }
]

函数的使用是这样的:

const answer = await notifier.showDialog('choose an option', options.config);
if (answer) {
   // 'Yes' was clicked
} else {
   // 'No' was clicked!
}

我所做的只是为每个选项创建一个 async 事件处理程序,这意味着,每个按钮都有一个简单的处理程序。每个处理程序都返回选项的值。处理程序被推入一个数组中。然后将该数组传递给 Promise.race,这就是 showDialog 方法的返回值,它将对应于 value 的实际值(由处理程序返回的值)。

不能提供太多代码。正如我所说,这是一个非常具体的案例,但这个想法可能对其他实现有用。二十行左右的代码。


m
m4n0

与其他解决方案不同的另一个解决方案是使用新的 dialog 元素。您需要根据与其他元素的交互性来使用 showshowModal 方法。 close 方法可用于关闭打开的对话框。

<dialog>
  <button class="yes">Yes</button>
  <button class="no">No</button>
</dialog>

const dialogEl = document.querySelector("dialog"); const openDialog = document.querySelector("button.open-dialog"); const yesBtn = document.querySelector(".yes"); const noBtn = document.querySelector(".no");常量结果 = document.querySelector(".result"); openDialog.addEventListener("点击", () => { dialogEl.showModal(); }); yesBtn.addEventListener("click", () => { // 下面的行可以替换为您的数据库查询 result.textContent = "这可能是您的数据库查询"; dialogEl.close(); }); noBtn.addEventListener("click", () => { result.textContent = ""; dialogEl.close(); }); @import url('https://fonts.googleapis.com/css2?family=Roboto:wght@300&display=swap');身体 { 字体系列:“机器人”; } 按钮 { 背景: hsl(206deg 64% 51%);白颜色;填充:0.5em 1em;边框:0 无;光标:指针; } 对话框 { 边框:0 无; } .result { 边距顶部:1em; }

Can I use?

现在与所有现代浏览器的兼容性都很好。


C
Craig D

一个带有类的 vanilla JavaScript 选项,用于创建包含文本框的自定义模式对话框:

jsfiddle:

https://jsfiddle.net/craigdude/uh82mjtb/2/

html:

<!DOCTYPE html>
<html>


<style>
.modal_dialog
{
    box-sizing: border-box;
    background-color: #ededed;
    border-radius: 5px;
    border: 0.5px solid #ccc;
    font-family: sans-serif;    
    left: 30%;
    margin-left: -50px;
    padding: 15px 10px 10px 5px;
    position: fixed;
    text-align: center;
    width: 320px;
}

</style>

<script src="./CustomModalDialog.js"></script>

<script>
var gCustomModalDialog = null;


/** this could be static html from the page in an "invisible" state */
function generateDynamicCustomDialogHtml(){
    
    var html = "";
    html += '<div id="custom_modal_dialog" class="modal_dialog">';
    html += 'Name: <input id="name" placeholder="Name"></input><br><br>';
    html += '<button id="okay_button">OK</button>';
    html += '<button id="cancel_button">Cancel</button>';
    html += '</div>';
    return html;
}

function onModalDialogOkayPressed(event) {
    
    var name = document.getElementById("name");
    alert("Name entered: "+name.value);
}

function onModalDialogCancelPressed(event) {
    
    gCustomModalDialog.hide();
}

function setupCustomModalDialog() {

    var html = generateDynamicCustomDialogHtml();
    gCustomModalDialog = new CustomModalDialog(html, "okay_button", "cancel_button", 
            "modal_position", onModalDialogOkayPressed, onModalDialogCancelPressed);
}


function showCustomModalDialog() {
    
    if (! gCustomModalDialog) {
        setupCustomModalDialog();
    }
    gCustomModalDialog.show();  
    gCustomModalDialog.setFocus("name");
}


</script>

<body>

<button onclick="showCustomModalDialog(this)">Show Dialog</button><br>
Some content
<div id="modal_position">
</div>
Some additional content

</body>

</html>

CustomModalDialog.js:

/** 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 <div> 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

H
Hassan Qasim

在点击操作之前询问的最简单方法如下

<a onclick="return askyesno('Delete this record?');" href="example.php?act=del&del_cs_id=<?php echo $oid; ?>">
<button class="btn btn-md btn-danger">Delete </button>
</a>

这个答案是未完成的,并没有真正回答这个问题
如何?它是实现所要求的最快的方法......这其中缺少什么让您理解?
这个答案也使用了问题中没有提到的引导程序......也没有提到PHP
A
A Gupta
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';       
   }
});

对不起,西班牙语?