所以我試圖將我的應用程式中的確認框更改為更時尚的東西。
jquery-confirm.js 插件非常吸引人,但我真的很難讓它以我想要的方式作業。
我在頁面上有一個簡單的鏈接按鈕。
<asp:LinkButton ID="lnkDelete" CssClass="btn btn-danger" runat="server" OnClientClick="return ShowConfirm();" CommandArgument='<%#Eval("StatusId")%>' OnClick="DeleteStatus">
在他們的網站上,這是推薦的實作,但它不會回傳值或停止回發。
$.confirm({
title: 'Encountered an error!',
content: 'Something went downhill, this may be serious',
type: 'red',
typeAnimated: true,
buttons: {
tryAgain: {
text: 'Try again',
btnClass: 'btn-red',
action: function(){
}
},
close: function () {
}
}
});
我知道我可以將我的 onclick 函式移到其中,但是它將無法重用。我只想在用戶點擊取消時停止回發。這樣我就可以從任何地方呼叫它并且它會正常作業。
我嘗試了幾件事無濟于事,這里有幾個例子。這些都不能阻止回發,但我認為我應該包括我嘗試過的內容。
function ShowConfirm() {
var Confirmed = $.confirm({
title: 'Please Confirm!',
content: 'Are you sue that you want to delete this record?',
type: 'red',
typeAnimated: true,
buttons: {
tryAgain: {
text: 'Delete',
btnClass: 'btn-red',
action: function () {
this.preventDefault();
}
},
close: function () {
}
}
});
return Confirmed;
}
另一個
function confirmation() {
var defer = $.Deferred();
$.confirm({
title: 'Please Confirm!',
content: 'Are you sue that you want to delete this record?',
type: 'red',
typeAnimated: true,
buttons: {
tryAgain: {
text: 'Delete',
btnClass: 'btn-red',
action: function () {
//Do something
defer.resolve(true);
}
},
close: function () {
//Do Something
defer.resolve(false);
}
}
});
return defer.promise();
};
function ShowConfirm() {
confirmation().then(function (answer) {
console.log(answer);
ansbool = (String(answer) == "true");
if (ansbool) {
alert("this is obviously " ansbool);//TRUE
} else {
alert("and then there is " ansbool);//FALSE
}
});
}
我還嘗試了最后一個發送回傳值的方法,但這也不起作用。我的 onclick 服務器端代碼始終執行。
任何幫助將不勝感激。
uj5u.com熱心網友回復:
好的,那么這是如何作業的?
在幾乎“每個”情況下,使用一些 jQuery.UI 對話框、sweetalert 和 99% 的情況下?
這些 jQuery 和 JavaScript 插件在所有情況下都有一個巨大的“相似”方面:
那就是代碼不會等待,也不會阻塞呼叫代碼。
這類代碼的技術術語就是我們所說的異步。
簡而言之,當您呼叫此類代碼時,提示對話框或將顯示的任何內容,但代碼不會停止。您呼叫的例程將通過其代碼 100% 運行,顯示對話框或其他任何內容,然后 100% 完成,退出并回傳值。
此類代碼的原因是不凍結瀏覽器,不損壞重新繪制和顯示資訊。
因此,JavaScript 中真正停止代碼的僅有兩個命令是
“警報()”和確認()。
上述兩個命令將停止代碼。因此,您的問題:
你有一個平面簡按鈕,并說一些代碼來洗掉或執行一個破壞性的選項,然后我們都像這樣連接代碼:
<asp:Button ID="cmdDelete" runat="server" Text="Server delete prompt"
OnClientClick="return confirm('Really delete this file?');" />
而且,正如我們所知,如果用戶點擊取消,則按鈕代碼不會運行。
但是,那些 js 插件和花哨的對話框呢?好吧,他們不等待。
我沒有你特定的 js 插件,但既然我們都使用 jQuery,那么我舉一個例子,如何使用 jQuery.UI 做到這一點。
所以,我們使用上面的按鈕,現在這樣做:
<asp:Button ID="cmdTest" runat="server" Text="Server Delete Prompt"
ClientIDMode="Static"
OnClientClick="return mydeleteprompt(this)"/>
現在,在上面,我們呼叫了一個例程,它將“顯示”我們的對話框提示。但請記住上面的規則:雖然代碼 FLOWS,但不會停止呼叫 js 代碼。
所以,我們需要做的是第一次仍然回傳 false。(現在我們很酷的提示對話框出現了。
使這項作業的方法?好吧,在上面我們通過了“this”。在這種情況下,“this”是當前按鈕。所以,我們的代碼現在看起來像這樣:
<div id="MyDialog" style="display:none">
<h4><i>my cool dialog text</i></h4>
<h4><i>This delete can't be undone</i></h4>
</div>
</div>
<script>
var mydeleteok = false
function mydeleteprompt(cmdBtn) {
if (mydeleteok) {
return true
}
myDialog = $("#MyDialog")
myDialog.dialog({
title: "Delete the whole server system",
modal: true,
appendTo: "form",
buttons: {
ok: function () {
myDialog.dialog('close')
mydeleteok= true
$(cmdBtn).click()
},
cancel: function () {
myDialog.dialog('close')
}
}
})
return false
}
注意非常 - 但上面的超級騙子。該例程將回傳 false。這意味著您單擊按鈕,呼叫 js 例程,顯示對話框,然后回傳 FALSE。
現在,顯示對話框。如果你點擊確定按鈕,我們設定我們的變數 = true 然后再次點擊按鈕!!!!
這一次,同樣的例程將運行,但我們設定我們的“標志”=true,代碼運行,并回傳 true,我們的服務器端按鈕代碼將運行。
它看起來像這樣:

因此,用戶單擊按鈕,代碼運行,顯示對話框,回傳“false”。
現在,如果用戶點擊“ok”,那么我們運行以下代碼:
buttons: {
ok: function () {
myDialog.dialog('close')
mydeleteok= true
$(cmdBtn).click()
},
所以,發生的事情是我們設定我們的 flag = true,然后再次單擊按鈕!!!這一次,按鈕呼叫了我們的例程,但這次例程將回傳 true,現在該按鈕的服務器端代碼將運行。
那么,你的巨大問題和問題?近 100%,如果不是所有的 JavaScript 代碼現在都是異步運行的。它不會等待。
因此,有諸如“等待”之類的高級概念和諸如 JavaScript“承諾”之類的東西,但它仍然不能解決這個問題。
因此,asp.net 按鈕單擊事件和使用 onclientclick 是一個很棒的功能,但是當您想要使用某種型別的對話框“加載項”時,它往往會有點崩潰,因為正如我所說,它們都沒有等待. 因此,您必須采用上述概念,設定一個標志(該標志代碼僅在頁面加載時運行 - 第一次。
事實上,可以這樣說,在我使用 .click() 運行該按鈕后,我可能應該再次設定 flag = false。但是,由于該服務器端按鈕會導致回發,因此在大多數情況下,我們的標志將被重新設定為 false。
編輯:帶有 jquery-confirm 的示例。
如前所述,我從未使用過該確認庫(其中大約有 1 百萬個 - 您也許應該提供一個鏈接)。
無論如何,該對話框的作業方式如下:
<asp:Button ID="Button1" runat="server" Text="Button" CssClass="btn"
OnClick="Button1_Click"
OnClientClick="return myconfirm(this)"
/>
<script>
var myconfirmok = false
function myconfirm(btn) {
if (myconfirmok) {
return true
}
$.confirm({
title: 'Confirm!',
content: 'Simple confirm!',
buttons: {
confirm: function () {
myconfirmok = true
$(btn).click()
},
cancel: function () {
console.log("user hit cancel")
}
}
});
return false // routine MUST return false!!!!
}
注意在上面非常小心 - 我們在最后一行回傳 false !!!
因此,單擊按鈕,客戶端代碼運行,顯示對話框,回傳 false。
現在,用戶要么點擊取消按鈕,要么點擊確認。如果他們點擊確認,我們設定我們的 flag = true,然后再次單擊傳遞的按鈕。現在,我們的例程再次運行,這次回傳 true,因此您的服務器端代碼現在運行。
Edit3: - 問題是使用 LinkBut??ton
這里的問題是使用 jQuery(甚至 JavaScript)來點擊鏈接按鈕?
你必須使用這個:
<asp:Repeater ID="Repeater1" runat="server">
<ItemTemplate>
<asp:TextBox ID="TextBox1" runat="server" Text='<%# Eval("HotelName") %>' >
</asp:TextBox>
<asp:LinkButton ID="cmdDel" runat="server" ClientIDMode="Static"
CommandArgument='<%# Eval("ID") %>'
onclick="cmdDel_Click"
OnClientClick="return myconfirm(this)"
>delete</asp:LinkButton>
<br />
</ItemTemplate>
</asp:Repeater>
<script>
var myconfirmok = false
function myconfirm(btn) {
if (myconfirmok) {
return true
}
$.confirm({
title: 'Confirm!',
content: 'Simple confirm!',
buttons: {
confirm: function () {
myconfirmok = true
$(btn)[0].click()
},
cancel: function () {
console.log("user hit cancel")
}
}
});
return false // routine MUST return false!!!!
}
</script>
因此,即使使用 [0],您也必須解決點擊問題。
當然,我從不使用鏈接按鈕——我通常只是放入一個標準按鈕,并且沒有太多理由使用鏈接按鈕。但是,問題過去和現在都是使用 jQuery.Click - 它需要 [0] 才能使單擊事件起作用。
我的鏈接按鈕點擊事件背后的代碼是這樣的:
Protected Sub cmdDel_Click(sender As Object, e As EventArgs)
Dim cmdDel As LinkButton = sender
Dim intPKID As Integer = cmdDel.CommandArgument
Debug.Print("code here to delete row with PK id = " & intPKID)
' get current repeater row
Dim OnerepRow As RepeaterItem = cmdDel.NamingContainer
Debug.Print("Repeter index row click = " & OnerepRow.ItemIndex)
' get hotel name texgt box
Dim txtHotel As TextBox = OnerepRow.FindControl("TextBox1")
Debug.Print(txtHotel.Text)
End Sub
當我運行它時

uj5u.com熱心網友回復:
要在單擊時完全停止回發,請單擊添加以下內容
OnClientClick="myfunction(); return false;"
為了使取消按鈕起作用,請嘗試以下操作,您需要做的是回傳 false 或 true 以使帖子重新啟動或不啟動。
函式顯示確認(){
this.preventDefault();
var Confirmed = $.confirm({
title: 'Please Confirm!',
content: 'Are you sue that you want to delete this record?',
type: 'red',
typeAnimated: true,
buttons: {
tryAgain: {
text: 'Delete',
btnClass: 'btn-red',
action: function () {
}
},
cancel: function () {
return false;
},
close: function () {
return false;
}
}
});
return Confirmed;
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/474282.html
標籤:javascript jQuery 网
上一篇:如何更改asp.net中的視圖?
