Запретить двойное нажатие кнопки asp.net
Я понимаю, что этот вопрос задан, но ни один из ответов не работал для моего проекта.
У меня есть кнопка, которая при нажатии вызывает API, поэтому есть 1 секунда задержки.
Я пробовал несколько вещей, которые ничего не работают.
btnSave.Attributes.Add("onclick", " this.disabled = true; " + ClientScript.GetPostBackEventReference(btnSave, null) + ";");
Даже это ничего не делает.
Ответы
Ответ 1
Предотвратите двойной щелчок. Пожалуйста, добавьте ниже код на страницу aspx.
<script type="text/javascript" language="javascript">
Sys.WebForms.PageRequestManager.getInstance().add_beginRequest(BeginRequestHandler);
function BeginRequestHandler(sender, args) { var oControl = args.get_postBackElement(); oControl.disabled = true; }
</script>
Ответ 2
Это решение является простым и эффективным. На вашей кнопке введите этот код:
OnClientClick="return CheckDouble();"
И везде, где вы хотите, чтобы ваш JavaScript - например, В нижней части страницы:
<script type="text/javascript">
var submit = 0;
function CheckDouble() {
if (++submit > 1) {
alert('This sometimes takes a few seconds - please be patient.');
return false;
}
}
</script>
Ответ 3
Вы можете предотвратить двойное нажатие с помощью этого кода:
Me.btnSave.Attributes.Add("onclick", "this.disabled=true;")
Me.btnSave.UseSubmitBehavior = False
Таким образом, вы можете использовать btnSave_Click
для вызова вашего API.
Обычно у меня есть много Validators
в моей настройке Page
: Validator.SetFocusOnError = True
. Я могу запустить этот код для повторного использования кнопки сохранения, если проверка не удалась.
Me.YourControl.Attributes.Add("onfocus", Me.btnSave.ClientID & ".removeAttribute('disabled');")
Ответ 4
Большинство приведенных выше предложений не помогли мне. Тот, кто работал, был следующим теццо:
Me.btnSave.Attributes.Add("onclick", "this.disabled=true;")
Me.btnSave.UseSubmitBehavior = False
Проще говоря, вместо использования вышеприведенного кода в коде, используйте только следующее:
<asp:Button ID="btnSave" runat="server" Text="Save"
UseSubmitBehavior="false"
OnClientClick="this.disabled='true';"
</asp:button>
UseSubmitBehavior = "false" - это ключ.
Ответ 5
Предотвратите двойной щелчок. Пожалуйста, добавьте ниже код на страницу aspx
<script type = "text/javascript">
function DisableButton() {
document.getElementById("<%=Button1.ClientID %>").disabled = true;
}
window.onbeforeunload = DisableButton;
</script>
Ответ 6
Сначала мое решение выглядит так:
<script>
function disableButton(btn) {
setTimeout(function () { btn.disabled = true; }, 20);
return true;
}
</script>
<asp:Button runat="server" ID="btnSave" Text="Save" OnClick="btnSave_Click" OnClientClick="return disableButton(this);" />
Без setTimeout кнопка будет немедленно отключена, а затем событие OnClick не будет запущено. Недостаток этого подхода заключается в том, что кнопка "Сохранить" больше не будет доступна, если какая-то проверка завершится неудачно или произойдет какая-то ошибка.
Поэтому я не думаю, что отключение кнопки - это хорошее решение, и я придумаю другое решение:
function disableButton(btn) {
if (btn.hasclicked) return false;
btn.hasclicked = 1;
btn.onmouseenter = function () { this.hasclicked = 0; };
return true;
}
Но мой коллега отмечает, что, если пост-обработка очень медленная, до ее завершения пользователь все еще может выполнить двойной постбэк, нажав и удерживая нажатой кнопку ввода. Поэтому я нашел еще два решения:
- Запустите проверку от клиента перед отправкой формы. Но если ваша страница содержит несколько ValidationGroup, говорят, что следующая Page_ClientValidate() должна вызываться несколько раз с переданным параметром ValidationGroup: например, Page_ClientValidate ( "group1"):
function disableButton(btn) {
if (Page_ClientValidate) {
Page_ClientValidate();
if (!Page_IsValid) {
btn.setAttribute("btnClicked", "n");
return true;
}
}
if (btn.getAttribute("btnClicked") == "y") {
return false;
} else {
btn.setAttribute("btnClicked", "y");
return true;
}
}
Ответ 7
Попробуйте это, это рабочее решение:
Для всех браузеров, включая браузер Opera Mobile, который не поддерживает js, ваша форма не будет блокироваться в браузерах этого типа.
Добавьте это в метод Page_load():
BtnID.Attributes.Add("onclick", "if(typeof (Page_ClientValidate) === 'function' && !Page_ClientValidate()){return false;} this.disabled = true;this.value = 'Working...';" + ClientScript.GetPostBackEventReference(BtnID, null) + ";");
Ответ 8
Это тот, который я нашел, работает во всех случаях.
<form id="form1" runat="server">
<asp:Button ID="Button1" runat="server" Text="Button1" OnClick="Button1_Clicked" />
<asp:Button ID="Button2" runat="server" Text="Button2" />
</form>
Now heres the short JavaScript snippet that will disable the button as soon as it is clicked so that when PostBack occurs the button cannot be clicked again.
<script type = "text/javascript">
function DisableButton() {
document.getElementById("<%=Button1.ClientID %>").disabled = true;
}
window.onbeforeunload = DisableButton;
</script>
The above script disables the ASP.Net Button as soon as the page is ready to do a PostBack or the ASP.Net form is submitted.
But in cases you might want to disable all Buttons and Submit Buttons on the page hence for such cases I have created another function which disables all Buttons and Submit buttons whenever theres a PostBack or form submission
<script type = "text/javascript">
function DisableButtons() {
var inputs = document.getElementsByTagName("INPUT");
for (var i in inputs) {
if (inputs[i].type == "button" || inputs[i].type == "submit") {
inputs[i].disabled = true;
}
}
}
window.onbeforeunload = DisableButtons;
</script>