2012-02-10 65 views
1

在我的代码中,我有一个绑定到文本框focusout事件的Ajax查找。如果提供的数据无效,则Ajax请求将显示错误消息。我还在表单上有一个“取消”按钮,单击时隐藏一些字段,包括带请求的字段。但是,如果在文本框中指定了无效值,则单击取消按钮将触发Ajax请求(因为文本框失去焦点)并显示错误消息。如何在点击某个按钮时忽略jQuery事件?

我想,当我点击取消按钮,这阿贾克斯事件解雇,所以即使用户输入了无效的条目形式会“闭合”没有错误消息显示。

这可能吗?

代码是这样的,基本上是:

$('#txtPostalCode').focusout(function() { 
    postalCodeLookup($(this).val()); // ajax method wrapper 
}); 

$('button#cancelButton').click(function() { 
    $('#txtPostalCode').attr('disabled', true).addClass('disabled'); // applies CSS style to make textbox look like a label 
    $('#txtPostalCode').val($('#oldPostalCode').val()); // restore old value 
}); 

,因为我自从点击之前,事件的内容大火说,你不能“取消”的形式,如果有在文本框中的无效条目,因为它会火ajax请求并提出错误消息。这个问题是出于可用性的角度,因为有人可能输入无效的邮政编码,意识到他们的错误,然后尝试取消该表格,但表单不会取消它自己,直到他们输入有效的邮政编码当表单实际取消时,它就会被重写)。

如果有更好的方法来处理我想做的事情我完全听到这个为好,这是我收到的要求:)

+2

你可以发布一些代码? – 2012-02-10 16:16:10

回答

0

那突然出现在脑海的第一件事,这可能是一个小哈克,但我会设置一个变量,打开和关闭悬停在取消按钮。然后在你的focusout代码中放一个if块,只有当前面提到的变量为false时才允许它被触发。

1

focus事件将在取消按钮的click事件之前触发,因此除了放弃ajax请求外,您无法执行其他任何操作。在XHR对象上调用abort方法会中止当前请求。

或者,您可以有一些延迟,然后触发在focusout事件上的ajax请求,并在您点击取消按钮的时间内清除超时。

就是这样。

$(function(){ 
    var xhr; 
    $('input').focusout(function(){ 
     xhr = $.ajax({ 
       ... 
       }); 
    }); 

    $('.cancel').click(function(){ 
     xhr.abort(); 
     //other stuff 
    }); 
}); 

或者

$(function(){ 
    var timeoutId; 
    $('input').focusout(function(){ 
     timeoutId = setTimeout(function(){ 
      $.ajax({ 
       ... 
      }); 
     }); 
    }); 

    $('.cancel').click(function(){ 
     clearTimeout(timeoutId); 
     //other stuff 
    }); 
}); 
+0

选项2对我很有帮助。谢谢你,先生。 – 2012-11-05 16:08:05