Подтвердить что ты не робот

OnclientClick и OnClick не работают одновременно?

У меня есть кнопка вроде следующего,

<asp:Button ID="pagerLeftButton" runat="server" OnClientClick="disable(this)" onclick="pager_Left_Click" Text="<" />

Когда я использую свою кнопку так, onclick не стреляет. Когда я удаляю OnClientClick, то onclick запускается.

Мне нужно сделать это, отключить кнопку во время обратной передачи и включить ее после завершения обратной передачи.

Изменить: Дополнительная информация:

Я добавил точку останова, чтобы мои функции стрельбы были частью С#, и я отлаживаю, они не стреляют наверняка. Эти функции похожи на

protected void pager_Left_Click(object sender, EventArgs e)
{
//Do smthing.
}
protected void pager_Right_Click(object sender, EventArgs e)
{
//Do smthing.
}

и когда я нажимаю на свою кнопку, она отключается на 1-2 секунды и автоматически включается, но я не уверен, почему она включена. Я еще не добавил, чтобы часть была включена.

4b9b3361

Ответ 1

Из этой статьи на web.archive.org:

Фокус в том, чтобы использовать свойства OnClientClick и UseSubmitBehavior для управления кнопкой. Существуют и другие методы, включающие код на стороне сервера, чтобы добавлять атрибуты, но я думаю, что простота этого сделать гораздо привлекательнее:

<asp:Button runat="server" ID="BtnSubmit"  OnClientClick="this.disabled = true; this.value = 'Submitting...';"   UseSubmitBehavior="false"  OnClick="BtnSubmit_Click"  Text="Submit Me!" />

OnClientClick позволяет добавлять клиентскую часть OnClick script. В этом случае JavaScript отключит элемент кнопки и изменит его текстовое значение на сообщение о ходе выполнения. После завершения обратной передачи вновь созданная страница вернет исходное состояние кнопки без дополнительной работы.

Единственная ошибка, которая приходит с отключением кнопки отправки на стороне клиента, заключается в том, что она отменяет отправку браузеров и, таким образом, обратную передачу. Установка свойства UseSubmitBehavior в false сообщает .NET, чтобы вставить необходимый клиент script, чтобы в любом случае запустить postback, вместо того чтобы полагаться на поведение представления формы браузеров. В этом случае код, который он вводит, будет следующим:

__doPostBack('BtnSubmit','')

Это добавляется в конец нашего кода OnClientClick, предоставляя нам этот визуализированный HTML:

<input type="button" name="BtnSubmit"  onclick="this.disabled = true; this.value ='Submitting...';__doPostBack('BtnSubmit','')"  value="Submit Me!" id="BtnSubmit" />

Это дает хороший эффект отключения кнопки и обработки текста, в то время как postback завершается.

Ответ 2

OnClientClick кажется очень придирчивым при использовании с OnClick.

Я безуспешно пытался использовать следующие варианты использования:

OnClientClick="return ValidateSearch();" 
OnClientClick="if(ValidateSearch()) return true;"
OnClientClick="ValidateSearch();"

Но они не сработали. Следующие работы:

<asp:Button ID="keywordSearch" runat="server" Text="Search" TabIndex="1" 
  OnClick="keywordSearch_Click" 
  OnClientClick="if (!ValidateSearch()) { return false;};" />

Ответ 3

Винай (выше) дал эффективную работу. Что фактически заставляет событие OnClick не работать после функции события OnClientClick, так это то, что MS определила его там, где, как только кнопка отключена (в функции, вызываемой событием OnClientClick), кнопка "honors" это, не пытаясь завершить действие кнопки, вызвав метод события OnClick.

Я боролся несколько часов, пытаясь понять это. Как только я удалил оператор, чтобы отключить кнопку отправки (которая находилась внутри функции OnClientClick), метод OnClick был вызван без дополнительной проблемы.

Microsoft, если вы слушаете, после нажатия кнопки, она должна завершить ее назначению, даже если она отключена частью пути этой деятельности. Пока он не отключается при нажатии, он должен завершить все назначенные методы.

Ответ 4

Здесь есть две проблемы:

Отключение кнопки на стороне клиента предотвращает обратную передачу

Чтобы преодолеть это, отключите кнопку после события JavaScript onclick. Легкий способ сделать это - использовать setTimeout, как было предложено этим ответом.

Кроме того, код OnClientClick выполняется, даже если проверка ASP.NET не удалась, поэтому, вероятно, неплохо добавить проверку для Page_IsValid. Это гарантирует, что кнопка не будет отключена, если проверка не удалась.

OnClientClick="(function(button) { setTimeout(function () { if (Page_IsValid) button.disabled = true; }, 0); })(this);"

Непосредственно поставить весь этот код JavaScript в свою собственную функцию, как показывает вопрос:

OnClientClick="disable(this);"

function disable(button) {
    setTimeout(function () {
        if (Page_IsValid)
            button.disabled = true;
    }, 0);
}

Отключение кнопки на стороне клиента не отключает ее на стороне сервера

Чтобы преодолеть это, отключите кнопку на стороне сервера. Например, в обработчике событий onclick:

OnClick="Button1_Click"

protected void Button1_Click(object sender, EventArgs e)
{
    ((Button)sender).Enabled = false;
}

Наконец, имейте в виду, что предотвращение дублирования нажатий кнопок не мешает двум другим пользователям одновременно отправлять одни и те же данные. Обязательно учтите это на стороне сервера.

Ответ 5

Что делать, если вы не сразу отключите кнопку, но задерживаете ее через setTimeout? Функция "disable" вернется, и отправка будет продолжена.

Ответ 6

Ваш JavaScript в порядке, если у вас нет других скриптов, запущенных на этой странице, которые могут повредить все. Вы можете проверить это, используя Firebug.

Я уже немного тестировал, и на самом деле кажется, что ASP.net игнорирует отключенные элементы управления. В принципе, postback выдается, но, вероятно, инфраструктура игнорирует такие события, поскольку она "предполагает", что отключенная кнопка не может поднять обратную передачу и поэтому игнорирует, возможно, прикрепленные обработчики. Теперь это только мои личные рассуждения, можно использовать Reflector, чтобы проверить это более подробно.

В качестве решения вы действительно можете попытаться отключить его в более поздней точке, в основном вы задерживаете вызов control.disabled = "disabled" с помощью JavaTimer или некоторых других функций. Таким образом, первая обратная передача на сервер выдается до того, как элемент управления отключается функцией JavaScript. Не тестировал это, но он мог работать

Ответ 7

function UpdateClick (btn) {

    for (i = 0; i < Page_Validators.length; i++) {

        ValidatorValidate(Page_Validators[i]);

        if (Page_Validators[i].isvalid == false)

            return false;
    }

    btn.disabled = 'false';

    btn.value = 'Please Wait...';

    return true;
}