วิธีการใช้กล่องโต้ตอบ“ การยืนยัน” ในกล่องโต้ตอบ Jquery UI


148

ฉันพยายามใช้ JQuery UI Dialog เพื่อแทนที่javascript:alert()กล่องน่าเกลียด ในสถานการณ์ของฉันฉันมีรายการสิ่งของและถัดจากแต่ละรายการฉันจะมีปุ่ม "ลบ" สำหรับแต่ละรายการ psuedo html setup จะเป็นดังนี้:

<ul>
    <li>ITEM <a href="url/to/remove"> <span>$itemId</span>
    <li>ITEM <a href="url/to/remove"><span>$itemId</span>
    <li>ITEM <a href="url/to/remove"><span>$itemId</span>
</ul>

<div id="confirmDialog">Are you sure?</div>

ในส่วน JQ เมื่อเอกสารพร้อมฉันจะตั้งค่า div ให้เป็นกล่องโต้ตอบแบบโมดอลด้วยปุ่มที่จำเป็นและตั้งค่า "a" เหล่านั้นให้ยิงเพื่อยืนยันก่อนที่จะลบเช่น:

$("ul li a").click(function() {
  // Show the dialog    
  return false; // to prevent the browser actually following the links!
}

ตกลงนี่คือปัญหา ในช่วงเวลาเริ่มต้นกล่องโต้ตอบจะไม่ทราบว่าใคร (รายการ) จะเปิดใช้งานได้และรหัสรายการ (!) ฉันจะตั้งค่าลักษณะการทำงานของปุ่มยืนยันเหล่านั้นได้อย่างไรหากผู้ใช้ยังคงเลือกใช่มันจะไปตามลิงก์เพื่อลบออก


มีปลั๊กอินที่ใช้งานง่ายให้ทำที่นี่: stackoverflow.com/questions/6457750/form-confirm-before-submit

1
Looooong ค้นหาวิธีแก้ปัญหา: stackoverflow.com/a/18474005/1876355
Pierre

คำตอบ:


166

ฉันแค่ต้องแก้ปัญหาเดียวกัน กุญแจสำคัญในการทำให้สิ่งนี้ทำงานได้คือdialogต้องเริ่มต้นบางส่วนในclickตัวจัดการเหตุการณ์สำหรับลิงก์ที่คุณต้องการใช้ฟังก์ชันการยืนยันด้วย (ถ้าคุณต้องการใช้สิ่งนี้มากกว่าหนึ่งลิงก์) นี่เป็นเพราะ URL เป้าหมายสำหรับลิงค์จะต้องถูกฉีดเข้าไปในตัวจัดการเหตุการณ์สำหรับปุ่มยืนยันคลิก ฉันใช้คลาส CSS เพื่อระบุว่าลิงก์ใดที่ควรมีพฤติกรรมการยืนยัน

นี่คือทางออกของฉันแยกออกมาเพื่อให้เหมาะสำหรับตัวอย่าง

<div id="dialog" title="Confirmation Required">
  Are you sure about this?
</div>

<script type="text/javascript">
  $(document).ready(function() {
    $("#dialog").dialog({
      autoOpen: false,
      modal: true
    });
  });

  $(".confirmLink").click(function(e) {
    e.preventDefault();
    var targetUrl = $(this).attr("href");

    $("#dialog").dialog({
      buttons : {
        "Confirm" : function() {
          window.location.href = targetUrl;
        },
        "Cancel" : function() {
          $(this).dialog("close");
        }
      }
    });

    $("#dialog").dialog("open");
  });
</script>

<a class="confirmLink" href="http://someLinkWhichRequiresConfirmation.com">Click here</a>
<a class="confirmLink" href="http://anotherSensitiveLink">Or, you could click here</a>

ฉันเชื่อว่าสิ่งนี้จะได้ผลสำหรับคุณหากคุณสามารถสร้างลิงก์ของคุณด้วยคลาส CSS ( confirmLinkในตัวอย่างของฉัน)

นี่คือjsfiddle ที่มีโค้ดอยู่ในนั้น

เพื่อประโยชน์ในการเปิดเผยอย่างเต็มรูปแบบฉันจะทราบว่าฉันใช้เวลาสองสามนาทีกับปัญหานี้และฉันก็ให้คำตอบที่คล้ายกับคำถามนี้ซึ่งยังไม่มีคำตอบที่ได้รับการยอมรับในเวลานั้น


2
+1 เกือบจะใช้งานได้ ... แต่ดูคำตอบจาก @lloydphillips เพื่อแก้ไข
rohancragg

มีใครสังเกตเห็นว่าสิ่งนี้จะทำให้การโพสต์แบ็คเต็มรูปแบบภายใน UpdatePanel? คุณจะแก้ไขได้อย่างไร
โฮเมอร์

3
มีบางอย่างเกี่ยวกับคำตอบนี้และ @lloydphillips 'คำตอบที่ไม่ได้ทำเพื่อฉัน คำถามเดิมอ้างอิงจากปุ่ม "ลบ" (ลิงก์) โดยทั่วไปจะไม่สามารถใช้ลิงค์ (HTTP GET) สำหรับการดำเนินการที่เปลี่ยนสถานะ (เช่น DELETE) คำตอบทั้งสองนี้สมมติว่าผู้ใช้เปิดใช้งานจาวาสคริปต์ หากปิดการใช้งานจาวาสคริปต์ลิงก์จะเริ่มทำงานและการลบ (หรือสิ่งอื่น ๆ ) จะเริ่มขึ้นโดยไม่มีการยืนยันซึ่งอาจเป็นความหายนะ ฉันหวังว่าจะได้รับคำตอบที่เกี่ยวข้องกับปัญหานี้
echo

@echo: ฉันคิดเหมือนกัน เพื่อให้เหมาะสมฉันคิดว่าจะต้องมีเพจอื่นที่ขอการยืนยันว่า JS ปิดการใช้งานหรือไม่ หาก JS หน้านี้สามารถละเว้น อาจผ่านพารามิเตอร์รับอื่นเช่นยืนยัน = จริง ยากมากและยุ่งยากในการพิจารณากรณีที่มีและไม่มี JS เข้าบัญชี การพัฒนาเว็บเป็นระเบียบ
robsch

1
@Sree Sure คุณสามารถแยกฟังก์ชั่นที่ใช้ชื่อรหัสเพื่อใช้เป็นพารามิเตอร์และทำการเรียก jQuery เพื่อตั้งค่าตัวจัดการเหตุการณ์สำหรับรหัสผ่าน
Paul Morie

59

ฉันพบว่าคำตอบของ Paul ไม่ทำงานเหมือนอย่างที่เขาตั้งค่าตัวเลือกหลังจากที่กล่องโต้ตอบโต้ตอบกับเหตุการณ์คลิกนั้นไม่ถูกต้อง นี่คือรหัสของฉันที่ใช้งานได้ ฉันไม่ได้ปรับแต่งมันให้ตรงกับตัวอย่างของพอล แต่มันเป็นเพียงความแตกต่างของเคราแมวในแง่ขององค์ประกอบบางอย่างที่มีชื่อแตกต่างกัน คุณควรจะสามารถทำงานออกมาได้ การแก้ไขอยู่ใน setter ของตัวเลือกการโต้ตอบสำหรับปุ่มในเหตุการณ์คลิก

$(document).ready(function() {

    $("#dialog").dialog({
        modal: true,
        bgiframe: true,
        width: 500,
        height: 200,
        autoOpen: false
    });


    $(".lb").click(function(e) {

        e.preventDefault();
        var theHREF = $(this).attr("href");

        $("#dialog").dialog('option', 'buttons', {
            "Confirm" : function() {
                window.location.href = theHREF;
            },
            "Cancel" : function() {
                $(this).dialog("close");
            }
        });

        $("#dialog").dialog("open");

    });

});

หวังว่านี่จะช่วยคนอื่นได้เนื่องจากโพสต์นี้ทำให้ฉันถูกทางฉันคิดว่าฉันควรแก้ไขการโพสต์


1
ฉันไม่เห็นสิ่งที่คุณทำซึ่งแตกต่างจากคำตอบของ Paul
Grant Birchmeier

2
ดูดีกับผม. สิ่งเดียวที่ฉันอยากรู้อยากเห็นก็คือใช้onแทนclickเพราะจะทำงานต่อไปถ้า (ตัวอย่าง) ฟิลด์นี้ถูกวาดใหม่โดยใช้ jQuery - api.jquery.com/on
Aaron Newton

1
ฮ่า "ความแตกต่างของเคราแมว" - ฉันต้องใช้วลีนั้นมากกว่านี้
ชาด Gorshing

27

ฉันได้สร้างฟังก์ชั่นของตัวเองสำหรับข้อความโต้ตอบยืนยัน jquery ui นี่คือรหัส

function myConfirm(dialogText, okFunc, cancelFunc, dialogTitle) {
  $('<div style="padding: 10px; max-width: 500px; word-wrap: break-word;">' + dialogText + '</div>').dialog({
    draggable: false,
    modal: true,
    resizable: false,
    width: 'auto',
    title: dialogTitle || 'Confirm',
    minHeight: 75,
    buttons: {
      OK: function () {
        if (typeof (okFunc) == 'function') {
          setTimeout(okFunc, 50);
        }
        $(this).dialog('destroy');
      },
      Cancel: function () {
        if (typeof (cancelFunc) == 'function') {
          setTimeout(cancelFunc, 50);
        }
        $(this).dialog('destroy');
      }
    }
  });
}

ตอนนี้เพื่อใช้ในรหัสของคุณเพียงแค่เขียนต่อไปนี้

myConfirm('Do you want to delete this record ?', function () {
    alert('You clicked OK');
  }, function () {
    alert('You clicked Cancel');
  },
  'Confirm Delete'
);

ต่อไป.


นี่เป็นวิธีแก้ปัญหาที่ดีมันคล้ายกับของฉันที่ฉันใช้สำหรับ ajax url get และ display ด่วน ... function JQueryDialog (url) {$ ("# dialog"). remove (); $ ("body"). ผนวก ("<div id = 'dialog' title = 'www.mysite.com'> </div>"); $ ("# dialog"). load (url) .dialog ({ปรับขนาดได้: false, width: 770, height: 470, modal: true, ปุ่ม: {"Close": function () {$ (this) .dialog ( "ปิด"); $ ("# dialog"). remove ();}}}); }
ชนะ

6

ทางออกที่ง่ายและสั้นที่ฉันเพิ่งลองและใช้งานได้

  $('.confirm').click(function() {
    $(this).removeClass('confirm');
    $(this).text("Sure?");
    $(this).unbind();
    return false;
  });

จากนั้นเพียงเพิ่ม class = "ยืนยัน" ในลิงก์ของคุณและใช้งานได้!


ข้อความ. text ถามว่า "Sure?" แต่ไม่ได้มีตัวเลือกใช่ / ไม่ใช่ตกลง / ยกเลิก ผู้ใช้ระบุได้อย่างไรว่าพวกเขา "แน่ใจ" หรือ "ไม่แน่ใจ"
Genki

6

นี่คือทางออกของฉัน .. ฉันหวังว่าจะช่วยให้ทุกคน มันเขียนขึ้นมาทันทีแทนที่จะลอกเลียนแบบดังนั้นโปรดยกโทษให้ฉันด้วยความผิดพลาดใด ๆ

$("#btn").on("click", function(ev){
    ev.preventDefault();

    dialog.dialog("open");

    dialog.find(".btnConfirm").on("click", function(){
        // trigger click under different namespace so 
        // click handler will not be triggered but native
        // functionality is preserved
        $("#btn").trigger("click.confirmed");
    }
    dialog.find(".btnCancel").on("click", function(){
        dialog.dialog("close");
    }
});

ส่วนตัวฉันชอบวิธีนี้ :)

แก้ไข: ขออภัย .. ฉันควรอธิบายรายละเอียดเพิ่มเติม ฉันชอบเพราะในความเห็นของฉันมันเป็นทางออกที่สง่างาม เมื่อผู้ใช้คลิกปุ่มที่ต้องได้รับการยืนยันก่อนเหตุการณ์จะถูกยกเลิกตามที่ควรจะเป็น เมื่อคลิกปุ่มยืนยันการแก้ปัญหาไม่ได้เป็นการจำลองการคลิกลิงค์ แต่เพื่อทริกเกอร์เหตุการณ์ jQuery ดั้งเดิม (คลิก) บนปุ่มเดิมซึ่งจะมีการทริกเกอร์หากไม่มีกล่องโต้ตอบการยืนยัน ข้อแตกต่างเพียงอย่างเดียวคือเนมสเปซเหตุการณ์ที่แตกต่าง (ในกรณีนี้คือ 'ยืนยัน') เพื่อให้กล่องโต้ตอบการยืนยันไม่ปรากฏขึ้นอีก กลไกของ Jquery native สามารถเข้าควบคุมและสิ่งต่าง ๆ สามารถทำงานได้ตามที่คาดไว้ ข้อดีอีกประการหนึ่งคือสามารถใช้เป็นปุ่มและไฮเปอร์ลิงก์ ฉันหวังว่าฉันจะชัดเจนพอ


พิจารณาแก้ไขโพสต์ของคุณและบอกชุมชนว่าทำไมคุณถึงชอบโซลูชันนี้ อะไรทำให้คุณรู้สึกดีขึ้น?
Fuzzical Logic

ฉันแก้ไขโพสต์ ฉันหวังว่ามันจะสมเหตุสมผลมากกว่านี้ เมื่อฉันเขียนมันดูเหมือนชัดเจนว่าไม่จำเป็นต้องมีความคิดเห็น ช่างแตกต่างไปจากที่ฉันกลับมาอีก
ซักพัก

ทางออกที่ยอดเยี่ยมและสะอาดมาก! ไม่เคยอ่านเกี่ยวกับเนมสเปซของเหตุการณ์มาก่อน ขอบคุณสำหรับสิ่งนั้น!
griffla

BEAAUUTIFULLL! ".. แต่เพื่อเปิดใช้งานเหตุการณ์ jQuery ดั้งเดิม (คลิก) บนปุ่มดั้งเดิม .. " ฟังดูbeauutifulll !! ขอบคุณสำหรับ $("#btn").trigger("click.confirmed");
Irf

4

ฉันรู้ว่านี่เป็นคำถามเก่า แต่นี่คือโซลูชันของฉันโดยใช้แอตทริบิวต์ข้อมูล HTML5 ใน MVC4:

<div id="dialog" title="Confirmation Required" data-url="@Url.Action("UndoAllPendingChanges", "Home")">
  Are you sure about this?
</div>

รหัส JS:

$("#dialog").dialog({
    modal: true,              
    autoOpen: false,
    buttons: {
        "Confirm": function () {
            window.location.href = $(this).data('url');
        },
        "Cancel": function () {
            $(this).dialog("close");
        }
    }
});

$("#TheIdOfMyButton").click(function (e) {
    e.preventDefault();
    $("#dialog").dialog("open");
});

ฉันชอบวิธีนี้ขอบคุณ เข้าใจง่ายและเหมาะกับฉัน ฉันไม่ได้ใช้ส่วน @ Url.Action แต่ใช้ได้กับ URL ที่สร้างโดย MVC ฝั่งเซิร์ฟเวอร์ของฉัน (PHP / Symfony2)
fazy

3

สิ่งนี้จะทำอย่างไร

$("ul li a").click(function(e) {
  e.preventDefault();
  $('#confirmDialog').show();

  var delete_path = $(this).attr('href');

  $('#confirmDialog a.ok').unbind('click'); //  just in case the cancel link 
                                            //  is not the  only way you can
                                            //  close your dialog
  $('#confirmDialog a.ok').click(function(e) {
     e.preventDefault();
     window.location.href = delete_path;
  });

});

$('#confirmDialog a.cancel').click(function(e) {
   e.preventDefault();
   $('#confirmDialog').hide();
   $('#confirmDialog a.ok').unbind('click');
});

ขอบคุณสำหรับคำตอบนี้ ฉันแน่ใจว่าฉันจะทดสอบมัน (และมันก็ดูใช้งานได้) หนึ่งในปัญหาที่ฉันเห็นจากคำตอบมากมายที่นี่ก็คือการขาดความรู้ทั่วไป หากหน้านั้นมีชุดควบคุมอื่น (หรือลิงค์หรืออื่น ๆ ) ที่ต้องการการยืนยันดูเหมือนว่าเราต้องการการประกาศหลายครั้งในการโต้ตอบ / การกระทำ วิธีจาวาสคริปต์แบบเก่าคือ href = "javascript: confirm ('link_url');" ง่ายและสง่างามและเหมาะสมกับกรณีที่คล้ายกันทั้งหมด แน่นอนว่าวิธีการจาวาสคริปต์นั้นไม่น่าไว้วางใจมากเกินไปที่คนที่ไม่มีจาวาสคริปต์จะพลาดการเชื่อมโยงทั้งหมด ขอบคุณอีกครั้งสำหรับการตอบกลับที่ยอดเยี่ยม
xandy

3

ดังกล่าวข้างต้น โพสต์ก่อนหน้านี้ทำให้ฉันถูกทาง นี่คือวิธีที่ฉันทำ แนวคิดคือมีรูปภาพถัดจากทุกแถวในตาราง (สร้างโดยสคริปต์ PHP จากฐานข้อมูล) เมื่อมีการคลิกที่ภาพผู้ใช้จะได้รับการเปลี่ยนเส้นทางไปยัง URL และเป็นผลให้บันทึกที่เหมาะสมจะถูกลบออกจากฐานข้อมูลในขณะที่แสดงข้อมูลบางส่วนที่เกี่ยวข้องกับบันทึกการคลิกภายใน jQuery UI Dialog

รหัส JavaScript:

$(document).ready(function () {
  $("#confirmDelete").dialog({
    modal: true,
    bgiframe: true,
    autoOpen: false
  });
});

function confirmDelete(username, id) {
  var delUrl = "/users/delete/" + id;
  $('#confirmDelete').html("Are you sure you want to delete user: '" + username + "'");
  $('#confirmDelete').dialog('option', 'buttons', {
    "No": function () {
      $(this).dialog("close");
    },
    "Yes": function () {
      window.location.href = delUrl;
    }
  });
  $('#confirmDelete').dialog('open');
}

ช่องโต้ตอบ div:

<div id="confirmDelete" title="Delete User?"></div> 

ลิงค์รูปภาพ:

<img src="img/delete.png" alt="Delete User" onclick="confirmDelete('<?=$username;?>','<?=$id;?>');"/>

วิธีนี้คุณสามารถส่งผ่านค่าลูป PHP ลงในกล่องโต้ตอบ ข้อเสียเพียงอย่างเดียวคือการใช้วิธีการ GET เพื่อดำเนินการจริง


2

เกี่ยวกับสิ่งนี้:

$("ul li a").click(function() {

el = $(this);
$("#confirmDialog").dialog({ autoOpen: false, resizable:false,
                             draggable:true,
                             modal: true,
                             buttons: { "Ok": function() {
                                el.parent().remove();
                                $(this).dialog("close"); } }
                           });
$("#confirmDialog").dialog("open");

return false;
});

ฉันได้ทดสอบมันด้วย html นี้:

<ul>
<li><a href="#">Hi 1</a></li>
<li><a href="#">Hi 2</a></li>
<li><a href="#">Hi 3</a></li>
<li><a href="#">Hi 4</a></li>
</ul>

มันลบองค์ประกอบ li ทั้งหมดคุณสามารถปรับได้ตามความต้องการของคุณ


2

(ตั้งแต่วันที่ 03/22/2559 การดาวน์โหลดบนหน้าเชื่อมโยงไปใช้งานไม่ได้ฉันออกจากลิงค์ที่นี่ในกรณีที่นักพัฒนาแก้ไขได้ในบางจุดเพราะมันเป็นปลั๊กอินเล็ก ๆ น้อย ๆ โพสต์ต้นฉบับดังต่อไปนี้ ทางเลือกและลิงค์ที่ใช้งานได้จริง: jquery.confirm .)

มันอาจจะง่ายเกินไปสำหรับความต้องการของคุณ แต่คุณสามารถลองใช้ปลั๊กอินยืนยัน jQueryนี้ มันใช้งานง่ายและทำงานได้ในหลายกรณี


ลิงก์พาฉันไปยังโปรไฟล์ที่ลิงก์ ดูเหมือนว่าคุณจะไม่เห็นปลั๊กอินเว้นแต่ว่าคุณเป็นสมาชิกพรีเมียมในลิงก์
Zane

ฉันอัปเดตลิงก์เพื่อใช้งานได้อีกครั้ง ผู้พัฒนาต้องเปลี่ยนเส้นทางลิงก์เก่าไปยังโปรไฟล์ LinkedIn ของเธอ หากเธอเปลี่ยนอีกครั้งเพียงแค่ google โดยใช้ "jquery confirm plugin nadia"
grahamesd

ขอบคุณ! แม้ว่าฉันจะนำเวอร์ชันของฉันไปใช้แล้วในตอนนี้
Zane

การเชื่อมโยงจะตายอีกครั้ง
Valamas

1

เท่าที่ฉันเกลียดที่จะใช้ eval ดูเหมือนว่าจะเป็นวิธีที่ง่ายที่สุดสำหรับฉันโดยไม่ทำให้เกิดปัญหามากมายขึ้นอยู่กับสถานการณ์ที่แตกต่างกัน คล้ายกับฟังก์ชัน settimeout ของ javascript

<a href="#" onclick="javascript:confirm('do_function(params)');">Confirm</a>
<div id="dialog-confirm" title="Confirm" style="display:none;">
    <p>Are you sure you want to do this?</p>
</div>
<script>
function confirm(callback){
    $( "#dialog-confirm" ).dialog({
        resizable: false,
        height:140,
        modal: false,
        buttons: {
            "Ok": function() {
                $( this ).dialog( "close" );
                eval(callback)
            },
            Cancel: function() {
                $( this ).dialog( "close" );
                return false;
            }
        }
    });
}

function do_function(params){
    console.log('approved');
}
</script>

1

ฉันวิ่งเข้าไปหาตัวเองและลงเอยด้วยวิธีแก้ปัญหาซึ่งคล้ายกับคำตอบมากมายที่นี่ แต่ใช้งานแตกต่างกันเล็กน้อย ฉันไม่ชอบจาวาสคริปต์หลาย ๆ ชิ้นหรือมีตัวแทนสำรองไว้ที่ไหนสักแห่ง ฉันต้องการโซลูชันทั่วไปที่สามารถใช้ใน HTML โดยไม่ต้องเพิ่มจาวาสคริปต์สำหรับการใช้งานแต่ละครั้ง นี่คือสิ่งที่ฉันมาด้วย (ต้อง jQuery UI):

javascript:

$(function() {

  $("a.confirm").button().click(function(e) {

    e.preventDefault();

    var target = $(this).attr("href");
    var content = $(this).attr("title");
    var title = $(this).attr("alt");

    $('<div>' + content + '</div>'). dialog({
      draggable: false,
      modal: true,
      resizable: false,
      width: 'auto',
      title: title,
      buttons: {
        "Confirm": function() {
          window.location.href = target;
        },
        "Cancel": function() {
          $(this).dialog("close");
        }
      }
    });

  });

});

จากนั้นใน HTML ไม่จำเป็นต้องมีการโทรหรืออ้างอิง javascript:

<a href="http://www.google.com/"
   class="confirm"
   alt="Confirm test"
   title="Are you sure?">Test</a>

เนื่องจากมีการใช้แอตทริบิวต์ title สำหรับเนื้อหา div ผู้ใช้สามารถรับคำถามยืนยันได้โดยวางเมาส์เหนือปุ่ม (ซึ่งเป็นสาเหตุที่ฉันไม่ได้ใช้ attribute title สำหรับ tile) หัวเรื่องของหน้าต่างการยืนยันคือเนื้อหาของแท็ก alt snip จาวาสคริปต์สามารถรวมอยู่ใน. js ทั่วไปรวมและเพียงแค่ใช้ชั้นเรียนที่คุณมีหน้าต่างยืนยันสวย


0
$("ul li a").live('click', function (e) {
            e.preventDefault();

            $('<div></div>').appendTo('body')
                    .html('<div><h6>Are you sure about this?</h6></div>')
                    .dialog({
                        modal: true, title: 'Delete message', zIndex: 10000, autoOpen: true,
                        width: 'auto', modal: true, resizable: false,
                        buttons: {
                            Confirm: function () {
                                // $(obj).removeAttr('onclick');                                
                                // $(obj).parents('.Parent').remove();

                                $(this).dialog("close");

                                window.location.reload();
                            },
                            No: function () {
                                $(this).dialog("close");
                            }
                        },
                        Cancel: function (event, ui) {
                            $(this).remove();
                        }
                    });

            return false;
        });

0

หมายเหตุ: ตัวแทนไม่เพียงพอที่จะแสดงความคิดเห็น แต่คำตอบของ BineG ทำงานได้อย่างสมบูรณ์แบบในการแก้ไขปัญหาการโพสต์กลับด้วยหน้า ASPX ตามที่เน้นโดยโฮเมอร์และ echo เพื่อเป็นเกียรติแก่นี่คือรูปแบบที่เปลี่ยนแปลงโดยใช้กล่องโต้ตอบแบบไดนามิก

$('#submit-button').bind('click', function(ev) {
    var $btn = $(this);
    ev.preventDefault();
    $("<div />").html("Are you sure?").dialog({
        modal: true,
        title: "Confirmation",
        buttons: [{
            text: "Ok",
            click: function() {
                $btn.trigger("click.confirmed");
                $(this).dialog("close");
            }
        }, {
            text: "Cancel",
            click: function() {
                $(this).dialog("close");
            }
        }]
    }).show();  
});

0

อีกรูปแบบหนึ่งของด้านบนที่ตรวจสอบว่าตัวควบคุมนั้นเป็นปุ่ม 'asp: linkbutton' หรือ 'asp:' ซึ่งแสดงผลเป็นตัวควบคุม html ที่แตกต่างกันสองแบบ ดูเหมือนว่าจะทำงานได้ดีสำหรับฉัน แต่ยังไม่ได้ทดสอบอย่างกว้างขวาง

        $(document).on("click", ".confirm", function (e) {
            e.preventDefault();
            var btn = $(this);
            $("#dialog").dialog('option', 'buttons', {
                "Confirm": function () {
                    if (btn.is("input")) {                            
                        var name = btn.attr("name");
                        __doPostBack(name, '')
                    }
                    else {
                        var href = btn.attr("href");
                        window.location.href = href;
                    }
                    $(this).dialog("close");
                },
                "Cancel": function () {
                    $(this).dialog("close");
                }
            });

            $("#dialog").dialog("open");
        });

0

ฉันกำลังมองหาสิ่งนี้เพื่อใช้กับลิงค์ปุ่มภายใน ASP.NET Gridview (GridView Control build ในคำสั่ง) ดังนั้นการดำเนินการ "ยืนยัน" ในกล่องโต้ตอบจำเป็นต้องเปิดใช้งานสคริปต์ที่สร้างโดยตัวควบคุม Gridview ในเวลาทำงาน สิ่งนี้ใช้ได้กับฉัน:

 $(".DeleteBtnClass").click(function (e) {
     e.preventDefault();
     var inlineFunction = $(this).attr("href") + ";";
     $("#dialog").dialog({
         buttons: {
             "Yes": function () {
                 eval(inlineFunction); // eval() can be harmful!
             },
                 "No": function () {
                 $(this).dialog("close");
             }
         }
     });
 });

eval () อาจเป็นอันตรายได้! อย่างไรก็ตามฉันต้องอ้างอิงส่วนนี้ของรหัสของคุณ: var inlineFunction = $(this).attr("href") + ";"; /* ... */ eval(inlineFunction);มันไม่สมเหตุสมผลเลย!
Sk8erPeter

0

ฉันรู้ว่าคำถามนี้เก่า แต่นี่เป็นครั้งแรกของฉันที่ฉันต้องใช้กล่องโต้ตอบการยืนยัน ฉันคิดว่านี่เป็นวิธีที่สั้นที่สุดที่จะทำ

$(element).onClick(function(){ // This can be a function or whatever, this is just a trigger
  var conBox = confirm("Are you sure ?");
    if(conBox){ 
        // Do what you have to do
    }
    else
        return;
});

ฉันหวังว่าคุณจะชอบมัน :)


0

โดยส่วนตัวฉันเห็นว่านี่เป็นข้อกำหนดที่เกิดซ้ำในหลาย ๆ มุมมองของแอปพลิเคชัน ASP.Net MVC จำนวนมาก

นั่นเป็นเหตุผลที่ฉันกำหนดคลาสโมเดลและมุมมองบางส่วน:

using Resources;

namespace YourNamespace.Models
{
  public class SyConfirmationDialogModel
  {
    public SyConfirmationDialogModel()
    {
      this.DialogId = "dlgconfirm";
      this.DialogTitle = Global.LblTitleConfirm;
      this.UrlAttribute = "href";
      this.ButtonConfirmText = Global.LblButtonConfirm;
      this.ButtonCancelText = Global.LblButtonCancel;
    }

    public string DialogId { get; set; }
    public string DialogTitle { get; set; }
    public string DialogMessage { get; set; }
    public string JQueryClickSelector { get; set; }
    public string UrlAttribute { get; set; }
    public string ButtonConfirmText { get; set; }
    public string ButtonCancelText { get; set; }
  }
}

และมุมมองบางส่วนของฉัน:

@using YourNamespace.Models;

@model SyConfirmationDialogModel

<div id="@Model.DialogId" title="@Model.DialogTitle">
  @Model.DialogMessage
</div>

<script type="text/javascript">
  $(function() {
    $("#@Model.DialogId").dialog({
      autoOpen: false,
      modal: true
    });

    $("@Model.JQueryClickSelector").click(function (e) {
      e.preventDefault();
      var sTargetUrl = $(this).attr("@Model.UrlAttribute");

      $("#@Model.DialogId").dialog({
        buttons: {
          "@Model.ButtonConfirmText": function () {
            window.location.href = sTargetUrl;
          },  
          "@Model.ButtonCancelText": function () {
            $(this).dialog("close");
          }
        }
      });

      $("#@Model.DialogId").dialog("open");
    });
  });
</script>

จากนั้นทุกครั้งที่คุณต้องการมันในมุมมองคุณเพียงแค่ใช้ @ Html.Partial (ในนั้นทำในสคริปต์ส่วนเพื่อให้กำหนด JQuery):

@Html.Partial("_ConfirmationDialog", new SyConfirmationDialogModel() { DialogMessage = Global.LblConfirmDelete, JQueryClickSelector ="a[class=SyLinkDelete]"})

เคล็ดลับคือการระบุ JQueryClickSelector ที่จะตรงกับองค์ประกอบที่จำเป็นต้องมีกล่องโต้ตอบการยืนยัน ในกรณีของฉันแองเคอร์ทั้งหมดที่มีคลาส SyLinkDelete แต่อาจเป็นตัวระบุคลาสอื่นที่แตกต่างกันสำหรับฉันมันคือรายการของ:

<a title="Delete" class="SyLinkDelete" href="/UserDefinedList/DeleteEntry?Params">
    <img class="SyImageDelete" alt="Delete" src="/Images/DeleteHS.png" border="0">
</a>

ASP.Net MVC พร้อม jQuery
Frederick Samson

0

หัวข้อยอดนิยมและ google ค้นหาสิ่งนี้สำหรับข้อความค้นหา "jquery dialog close ซึ่งคลิกเหตุการณ์" โซลูชันของฉันจัดการกับเหตุการณ์ YES, NO, ESC_KEY, X อย่างถูกต้อง ฉันต้องการให้ฟังก์ชันการโทรกลับของฉันถูกเรียกว่าไม่ว่าจะมีการโต้ตอบอย่างไร

function dialog_YES_NO(sTitle, txt, fn) {
    $("#dialog-main").dialog({
        title: sTitle,
        resizable: true,
        //height:140,
        modal: true,
        open: function() { $(this).data("retval", false); $(this).text(txt); },
        close: function(evt) {
            var arg1 = $(this).data("retval")==true;
            setTimeout(function() { fn(arg1); }, 30);
        },
        buttons: {
            "Yes": function() { $(this).data("retval", true); $(this).dialog("close"); },
            "No": function()  { $(this).data("retval", false); $(this).dialog("close"); }
        }
    });
}
- - - - 
dialog_YES_NO("Confirm Delete", "Delete xyz item?", function(status) {
   alert("Dialog retval is " + status);
});

ง่ายต่อการเปลี่ยนเส้นทางเบราว์เซอร์ไปยัง URL ใหม่หรือดำเนินการอย่างอื่นในฟังก์ชั่น retval


0

คำตอบที่ดีมากมายที่นี่;) นี่คือแนวทางของฉัน คล้ายกับการใช้ eval ()

function functionExecutor(functionName, args){
    functionName.apply(this, args);
}

function showConfirmationDialog(html, functionYes, fYesArgs){
    $('#dialog').html(html);
    $('#dialog').dialog({
        buttons : [
            {
                text:'YES',
                click: function(){
                    functionExecutor(functionYes, fYesArgs);
                    $(this).dialog("close");
                },
                class:'green'
            },
            {
                text:'CANCEL',
                click: function() {
                    $(this).dialog("close");
                },
                class:'red'
            }
        ]
    });     
}

และการใช้งานดูเหมือนว่า:

function myTestYesFunction(arg1, arg2){
    alert("You clicked YES:"+arg1+arg2);
}

function toDoOrNotToDo(){
    showConfirmationDialog("Dialog text", myTestYesFunction, ['My arg 1','My arg 2']);
}

0

JQuery UI นำเสนอทางออกนี้นอกกรอบ:

$( function() {
    $( "#dialog-confirm" ).dialog({
      resizable: false,
      height: "auto",
      width: 400,
      modal: true,
      buttons: {
        "Delete all items": function() {
          $( this ).dialog( "close" );
        },
        Cancel: function() {
          $( this ).dialog( "close" );
        }
      }
    });
  } );

HTML

<div id="dialog-confirm" title="Empty the recycle bin?">
  <p><span class="ui-icon ui-icon-alert" style="float:left; margin:12px 12px 20px 0;">
 </span>These items will be permanently deleted and cannot be recovered. Are you sure?</p>
</div>

คุณสามารถปรับแต่งสิ่งนี้เพิ่มเติมโดยการให้ชื่อสำหรับฟังก์ชั่น JQuery และผ่านข้อความ / ชื่อที่คุณต้องการแสดงเป็นพารามิเตอร์

การอ้างอิง: https://jqueryui.com/dialog/#modal-confirmation


-1

นี่คือคำตอบสำหรับคำถามของคุณ ...

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN"><HTML>
<HEAD>
<TITLE>Santa Luisa</TITLE>
<style>
    body{margin:0;padding:0;background-color:#ffffff;}
    a:link {color:black;}    
a:visited {color:black;}  
a:hover {color:red;}  
a:active {color:red;}
</style>

</HEAD>
<body>

<link rel="stylesheet" href="jquery/themes/base/jquery.ui.all.css">
    <script src="jquery-1.4.4.js"></script>

    <script src="external/jquery.bgiframe-2.1.2.js"></script>
    <script src="ui/jquery.ui.core.js"></script>

    <script src="ui/jquery.ui.widget.js"></script>
    <script src="ui/jquery.ui.mouse.js"></script>
    <script src="ui/jquery.ui.draggable.js"></script>
    <script src="ui/jquery.ui.position.js"></script>

    <script src="ui/jquery.ui.resizable.js"></script>
    <script src="ui/jquery.ui.dialog.js"></script>

    <link rel="stylesheet" href="demos.css">
    <script>
    var lastdel;
    $(function() {
        $( "#dialog" ).dialog({
            autoOpen: false,modal: true,closeOnEscape: true
        });

        $(".confirmLink").click(function(e) {
            e.preventDefault();
            var lastdel = $(this).attr("href");

        });


        $("#si").click( function() {
            $('#dialog').dialog('close');
            window.location.href =lastdel;

        });
        $("#no").click( function() {
            $('#dialog').dialog('close');
        });
    });

    </script>

<SCRIPT LANGUAGE="JavaScript">
<!--
        var currentimgx;
        var cimgoverx=200-6;
        var cimgoutx=200;


        function overbx(obj){
        color='#FF0000';
        width='3px';
        obj.style.borderTopWidth = width;
        obj.style.borderTopColor =color;
        obj.style.borderTopStyle ='solid';

        obj.style.borderLeftWidth = width;
        obj.style.borderLeftColor =color;
        obj.style.borderLeftStyle ='solid';

        obj.style.borderRightWidth = width;
        obj.style.borderRightColor =color;
        obj.style.borderRightStyle ='solid';

        obj.style.borderBottomWidth = width;
        obj.style.borderBottomColor =color;
        obj.style.borderBottomStyle ='solid';


        currentimgx.style.width=cimgoverx+"px";
        currentimgx.style.height=cimgoverx+"px"; 

    }

    function outbx(obj){
        obj.style.borderTopWidth = '0px';   
        obj.style.borderLeftWidth = '0px';
        obj.style.borderRightWidth = '0px';
        obj.style.borderBottomWidth = '0px';

        currentimgx.style.width=cimgoutx+"px";
        currentimgx.style.height=cimgoutx+"px"; 
    }

function ifocusx(obj){
        color='#FF0000';
        width='3px';
        obj.style.borderTopWidth = width;
        obj.style.borderTopColor =color;
        obj.style.borderTopStyle ='solid';

        obj.style.borderLeftWidth = width;
        obj.style.borderLeftColor =color;
        obj.style.borderLeftStyle ='solid';

        obj.style.borderRightWidth = width;
        obj.style.borderRightColor =color;
        obj.style.borderRightStyle ='solid';

        obj.style.borderBottomWidth = width;
        obj.style.borderBottomColor =color;
        obj.style.borderBottomStyle ='solid';

    }

    function iblurx(obj){
        color='#000000';
        width='3px';
        obj.style.borderTopWidth = width;
        obj.style.borderTopColor =color;
        obj.style.borderTopStyle ='solid';

        obj.style.borderLeftWidth = width;
        obj.style.borderLeftColor =color;
        obj.style.borderLeftStyle ='solid';

        obj.style.borderRightWidth = width;
        obj.style.borderRightColor =color;
        obj.style.borderRightStyle ='solid';

        obj.style.borderBottomWidth = width;
        obj.style.borderBottomColor =color;
        obj.style.borderBottomStyle ='solid';
    }

    function cimgx(obj){
        currentimgx=obj;
    }


    function pause(millis){
    var date = new Date();
    var curDate = null;

    do { curDate = new Date(); }
    while(curDate-date < millis);
    } 


//-->
</SCRIPT>
<div id="dialog" title="CONFERMA L`AZIONE" style="text-align:center;">
    <p><FONT  COLOR="#000000" style="font-family:Arial;font-size:22px;font-style:bold;COLOR:red;">CONFERMA L`AZIONE:<BR>POSSO CANCELLARE<BR>QUESTA RIGA ?</FONT></p>

    <p><INPUT TYPE="submit" VALUE="SI" NAME="" id="si"> --><INPUT TYPE="submit" VALUE="NO" NAME="" id="no"></p>
</div>



<TABLE CELLSPACING="0" CELLPADDING="0" BORDER="0" WIDTH="100%" height="100%">
<TR valign="top" align="center">
    <TD>
    <FONT COLOR="red" style="font-family:Arial;font-size:25px;font-style:bold;color:red;">Modifica/Dettagli:<font style="font-family:Arial;font-size:20px;font-style:bold;background-color:yellow;color:red;">&nbsp;298&nbsp;</font><font style="font-family:Arial;font-size:20px;font-style:bold;background-color:red;color:yellow;">dsadas&nbsp;sadsadas&nbsp;</font>&nbsp;</FONT>
    </TD>
</TR>

<tr valign="top">
    <td align="center">
        <TABLE CELLSPACING="0" CELLPADDING="0" BORDER="0" WIDTH="">
        <TR align="left">

            <TD>
                <TABLE CELLSPACING="0" CELLPADDING="0" BORDER="0" WIDTH="">

                <TR align="left">
                    <TD>
                    <font style="font-sixe:30px;"><span style="color:red;">1</span></font><br><TABLE class="tabela" CELLSPACING="0" CELLPADDING="0" BORDER="1" WIDTH="800px"><TR style="color:white;background-color:black;"><TD align="center">DATA</TD><TD align="center">CODICE</TD><TD align="center">NOME/NOMI</TD><TD  align="center">TESTO</TD><td>&nbsp;</td><td>&nbsp;</td></TR><TR align="center"><TD>12/22/2010&nbsp;</TD><TD>298&nbsp;</TD><TD>daaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa</TD><TD><A HREF="modificarigadiario.php?codice=298"  style="font-weight:bold;color:red;font-size:30px;">Modifica</A></TD><TD><A HREF="JavaScript:void(0);"  style="font-weight:bold;color:red;font-size:30px;" onclick="$('#dialog').dialog('open');$('#dialog').animate({ backgroundColor: '#aa0000', color: '#fff', width: 250 }, 2000);lastdel='cancellarighe.php?codice=298&id=1';alert(lastdel);" class="confirmLink">Cancella</A></TD><TR align="center"><TD>22/10/2010&nbsp;</TD><TD>298&nbsp;</TD><TD>dfdsfsdfsf</TD><TD><A HREF="modificarigadiario.php?codice=298"  style="font-weight:bold;color:red;font-size:30px;">Modifica</A></TD><TD><A HREF="JavaScript:void(0);"  style="font-weight:bold;color:red;font-size:30px;" onclick="$('#dialog').dialog('open');$('#dialog').animate({ backgroundColor: '#aa0000', color: '#fff', width: 250 }, 2000);lastdel='cancellarighe.php?codice=298&id=2';alert(lastdel);" class="confirmLink">Cancella</A></TD></TABLE><font style="font-sixe:30px;"><span style="color:red;">1</span></font><br>

                    </TD>
                </TR>

                </TABLE>
            </TD>
        </TR>
        </TABLE>
    </td>
</tr>
</tbody></table>


</body>
</html>

ทำให้แน่ใจว่าคุณมี jquery 1.4.4 และ jquery.ui


นี่เป็นหนึ่งในรหัสที่น่าเกลียดที่สุดที่ฉันเคยเห็นในปี คุณใช้แอททริบิวต์ที่เลิกใช้แล้ว (เช่นLANGUAGE="JavaScript") ใช้ตัวอักษรตัวพิมพ์ใหญ่และตัวพิมพ์เล็กผสมรหัส JS ธรรมดากับโค้ด jQuery โดยไม่จำเป็นและคุณกำหนดสไตล์ด้วย JS แทน CSS (น่าเกลียดและไม่ถูกต้องเชิง semantically) และตามสไตล์ของคุณ การดัดแปลง (ด้วย JS ธรรมดา) ไม่เกี่ยวข้องอย่างแน่นอนเกี่ยวกับคำถามเดิม คุณควรย่อให้สั้นลงและสวยงามรหัสของคุณและมุ่งเน้นไปที่การตอบคำถามเดิม
Sk8erPeter

-1

วิธีง่ายๆด้วยการสัมผัสจาวาสคริปต์

$("#myButton").click(function(event) {
    var cont = confirm('Continue?');
    if(cont) {
        // do stuff here if OK was clicked
        return true;
    }
    // If cancel was clicked button execution will be halted.
    event.preventDefault();
}

2
ประเด็นนี้มีจุดประสงค์เพื่อหลีกเลี่ยงการใช้ฟังก์ชันจาวาสคริปต์ที่เป็นค่าเริ่มต้นการแจ้งเตือน / ยืนยันเป็นต้นดังนั้นนี่จึงไม่ใช่คำตอบสำหรับคำถาม
redreinard
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.