Запретить событие OnTextChanged для текстового поля asp.net с AutoPostBack = true - PullRequest
2 голосов
/ 26 апреля 2011

На моей странице asp.net у меня есть следующий текстовый ящик (для адресов электронной почты):

<asp:TextBox ID="EmailTextBox" runat="server" AutoPostBack="true" 
             OnTextChanged="EmailTextBox_TextChanged"/>

Я хочу проверить адрес электронной почты на стороне клиента перед обратной передачейOnTextChanged, и я сделал следующее с jquery:

$("#EmailTextBox").live("change", function(event) {
  var ValidEmail = ValidateEmail();

  if (ValidEmail == false)
    event.preventDefault();
});

Однако, даже если ValidEmail возвращает false, происходит обратная передача.

Почему это происходит?Есть идеи?Как я могу подавить событие изменения на стороне сервера, если адрес электронной почты недействителен?

Функция проверки:

функция CheckExist (Email) {

var IsAvailable = false;
var parameters = JSON.stringify({ 'Email': Email });
//$("#CheckEmailDiv").show().delay(300);
$.ajax({
    async: false,
    type: "POST",
    url: "MyWebService.asmx/CheckAvailable",
    data: parameters,
    contentType: "application/json; charset=utf-8",
    dataType: "json",
    success: function(response) {
        IsAvailable = response.d;
        // $("#CheckEmailDiv").hide();

    }
});

return IsAvailable;

}function ValidateEmail () {

var valid = true;

var pattern = new RegExp(/^(("[\w-\s]+")|([\w-]+(?:\.[\w-]+)*)|("[\w-\s]+")([\w-]+(?:\.[\w-]+)*))(@((?:[\w-]+\.)*\w[\w-]{0,66})\.([a-z]{2,6}(?:\.[a-z]{2})?)$)|(@\[?((25[0-5]\.|2[0-4][0-9]\.|1[0-9]{2}\.|[0-9]{1,2}\.))((25[0-5]|2[0-4][0-9]|1[0-9]{2}|[0-9]{1,2})\.){2}(25[0-5]|2[0-4][0-9]|1[0-9]{2}|[0-9]{1,2})\]?$)/i);
var Email = $("#EmailTextBox").val();
var EmailError = "";
if (!pattern.test(Email)) {
    EmailError = "**Email empty or invalid";

}
else {
       var IsAvailable = CheckAvailable(Email);
       if (IsAvailable == true)
           EmailError = "**The email you typed doesnt exist";

} if (EmailError! = "") {valid = false;$ ( "# EmailErrorSpan") HTML (EmailError).$ ( "# EmailErrorSpan") шоу ().} else $ ("# EmailErrorSpan"). hide ();возврат действителен;

}

Ответы [ 2 ]

0 голосов
/ 26 апреля 2011

Проблема в том, что встроенный onchange будет срабатывать первым.Может быть лучший способ справиться с этим, но это может сработать:

$(function() {
    var oldChange=$("#myinput").attr("onchange");
    $("#myinput").removeAttr("onchange");

    $("#myinput").change(function(event) {
        alert('mychange');

        if($(this).val().length>5){
             oldChange();   
        }
    });
});

По сути, сохраните старый onchange в переменной, удалите его из элемента и прикрепите свой собственный onchange.Тогда в вашем onchange звоните только тогда, когда условия подходящие.Вы можете столкнуться с проблемами, хотя в зависимости от того, из чего состоит onchange (изо всех сил, передача «this» может быть проблемой).

См. Скрипту: http://jsfiddle.net/ZCLxY/1/

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

0 голосов
/ 26 апреля 2011

Вам нужен clientID поля EmailText, имя которого jquery может получить к нему доступ.Поэтому следующая строка:

$("#EmailTextBox").live("change", function(event)

должна быть:

$("#<%=EmailTextBox.ClientID%>").live("change", function(event)

Это потому, что идентификатор клиента не обязательно совпадает с идентификатором в вашем aspx, и поскольку jquery можетманипулировать только теми идентификаторами, которые доступны в вашем HTML, ему нужно это значение.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...