2009-05-20 167 views
141

我嘗試使用JQuery UI對話框來替換醜陋的javascript:alert()框。 在我的場景中,我有一個項目列表,並在他們每個人旁邊,我會爲他們每個人都有一個「刪除」按鈕。 的僞HTML設置將東西如下:如何在Jquery UI對話框中實現「確認」對話框?

<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部分,在文件準備好了,我會先設定的股利是必要的按鈕,一個模式對話框,並設置這些「一」被燒成之前確認刪除,如:

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

OK,這裏的問題。在初始化期間,對話框將不知道誰(物品)會將其啓動,還有物品ID(!)。我如何設置這些確認按鈕的行爲,如果用戶仍然選擇是,它會按照鏈接將其刪除?

+0

有一個易於使用的插件在這裏做到這一點:http://stackoverflow.com/questions/6457750/form-confirm-before-submit – 2012-09-27 11:36:46

+1

一長串搜索解決方案: http://stackoverflow.com/a/18474005/1876355 – Pierre 2013-08-27 20:02:39

回答

158

我只是要解決同樣的問題。實現此功能的關鍵是,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

爲了充分披露,我會注意到我在這個問題上花了幾分鐘的時間,並且提供了與this question類似的答案,當時也沒有被接受的答案。

+2

+1幾乎可以工作......但是看到@lloydphillips的更正答案 – rohancragg 2010-02-18 12:59:50

+0

有沒有其他人注意到這會在UpdatePanel中造成一個完整的PostBack?你如何解決這個問題? – Homer 2011-12-21 18:34:21

+3

這個答案和@lloydphillips的答案只是不完全適合我,原始問題是參考「刪除」按鈕(鏈接)。一般來說,使用鏈接(HTTP GET)是不可取的(如DELETE),這兩個答案都假設用戶已經啓用了javascript,如果javascript被禁用,鏈接將會觸發,delete(或其他任何操作)會在沒有確認的情況下觸發,這可能是災難性的。我希望找到一個解決這個問題的答案 – echo 2012-08-05 02:49:01

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

感謝您的回覆。我相信我會測試它(但它看起來功能)。我從這裏的許多答案中看到的一個問題是缺乏一般性。如果頁面有另一組需要確認的控件(或鏈接等),似乎我們需要多次聲明交互/操作。 舊的JavaScript方式,即,href =「javascript:confirm('link_url');」簡潔大方,適合所有類似案例。當然,JavaScript方法太過於模糊,人們無法使用JavaScript將完全錯過鏈接。 再次thx爲偉大的答覆。 – xandy 2009-05-20 11:33:28

+0

+1:不錯的創新。太傷心它不是不顯眼的:( – naveen 2011-08-04 11:27:31

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

我已經在這個網站進行了測試:

<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元素,你可以在需要進行修改。

58

我發現答案保羅並沒有像他設置選項後的方式那樣工作,對話框在click事件上實例化後是不正確的。這是我工作的代碼。我沒有量身定製它,以配合保羅的榜樣,但它只是貓的鬍鬚在一些元素方面的差異命名不同。你應該能夠解決它。更正位於click事件按鈕的對話框選項的設置器中。

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

    }); 

}); 

希望這可以幫助別人,因爲這篇文章最初讓我走上了正確的軌道我認爲我最好發佈更正。

3

如上。以前的帖子讓我走上了正軌。這是我做到的。 這個想法是在表中的每一行旁邊都有一個圖像(由數據庫中的PHP腳本生成)。單擊圖像時,用戶將被重定向到URL,結果,相應的記錄將從數據庫中刪除,同時顯示與jQuery UI對話框中單擊記錄相關的一些數據。

的JavaScript代碼:

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

function confirmDelete(username, id) { 
    var delUrl = "https://stackoverflow.com/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 id="confirmDelete" title="Delete User?"></div> 

圖片鏈接:

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

這樣你就可以越過PHP的循環值到對話框。 唯一的缺點是使用GET方法來實際執行操作。

2

(截至2016年3月22日,鏈接到頁面的下載無效。我將鏈接留在這裏以防開發者在某些時候修復它,因爲它是一個很棒的小插件。一個替代方案和一個實際工作的鏈接:jquery.confirm。)

這可能對你的需求太簡單了,但你可以試試這個jQuery confirm plugin。在很多情況下,使用起來非常簡單,並且可以完成這項工作。

-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

6

簡單和短期的解決方案,我只是想和它的工作原理

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

然後,只需將class =「confirm」添加到您的鏈接,它的工作原理!

1

儘管我討厭使用eval,但它對我來說似乎是最簡單的方式,而不會因爲不同的環境而導致很多問題。類似於javascript settimeout函數。

<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> 
26

我創建了一個我自己的函數,用於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' 
); 

下去。

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

這是我的解決方案..我希望它可以幫助任何人。這是寫在飛行而不是copypasted,所以原諒我的任何錯誤。

$("#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"); 
    } 
}); 

個人而言,我更喜歡這種解決方案:)

編輯:對不起..我真的shouldve更詳細地說明它。我喜歡它,因爲在我看來它是一個優雅的解決方案。 當用戶點擊需要首先確認的按鈕時,事件被取消,因爲它必須是。 單擊確認按鈕時,解決方案不是模擬鏈接點擊,而是觸發原始按鈕時觸發相同的原生jQuery事件(單擊),如果沒有確認對話框,將觸發原始按鈕。唯一的區別是不同的事件名稱空間(在這種情況下「已確認」),以便確認對話框不再顯示。然後Jquery本地機制可以接管,事情可以按預期運行。 另一個優點是它可以用於按鈕和超鏈接。我希望我很清楚。

0

我一直在尋找這個在ASP.NET Gridview中的鏈接按鈕上使用(GridView控件內部命令) 因此,對話框中的「確認」操作需要在運行時激活由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"); 
      } 
     } 
    }); 
}); 
0

注:沒有足夠的代表處發表評論,但BineG的回答完全在解決與ASPX頁面回發問題荷馬和回聲所強調的。爲了榮譽,這是一個使用動態對話框的變體。

$('#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

與觸摸的JavaScript

$("#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(); 
} 
4

的我知道這是一個老問題,但這裏是MVC4使用HTML5 data attributes我的解決方案簡單的方法:

<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"); 
}); 
1

我自己遇到了這個問題,最終得到了一個解決方案,這與這裏的幾個答案類似,但實現方式稍有不同。我不喜歡很多javascript,或者某個地方的佔位符div。我想要一個通用的解決方案,然後可以在HTML中使用,而無需爲每次使用添加JavaScript。以下是我想出了(這需要jQuery用戶界面):

的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> 

自題屬性用於div內容,用戶甚至可以通過將鼠標懸停在按鈕上來獲得確認問題(這就是爲什麼我沒有使用tile的title屬性)。確認窗口的標題是alt標籤的內容。 javascript snip可以包含在廣義的.js include中,並且只需應用一個你有一個漂亮的確認窗口的類。

0

上面的另一種變體,它檢查控件是否是呈現爲兩個不同的html控件的'asp:linkbutton'或'asp:button'。似乎工作對我來說很好,但還沒有廣泛測試。

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

我知道這個問題是舊的,但這是我第一次不得不使用確認對話框。我認爲這是最簡單的方法。

$(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]"}) 

訣竅是指定JQu與需要確認對話框的元素相匹配的eryClickSelector。在我的情況下,與類SyLinkDelete所有錨,但它可能是一個標識符,不同類等對我來說是一個列表:

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

非常熱門的話題和谷歌認爲這對「jQuery的對話框關閉其事件被點擊「查詢。我的解決方案正確處理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用戶界面中提供了這樣的解決方案:

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

您可以進一步自定義此通過提供JQuer的名稱y函數並將您想要顯示的文本/標題作爲參數傳遞。

參考:https://jqueryui.com/dialog/#modal-confirmation