我想知道,是否有可能从另一个事件中取消队列中的下一个java脚本事件?
问题:
我有两个ASP.Net控件, 年龄 - TextBox 保存 - 按钮
有两个java脚本验证函数, ValidateAge() - 检查有效年龄(0> =年龄< = 140),如果无效则提供警报 ValidatePage() - 检查页面中的所有必填字段,并保存是否填写了所有必填字段
<asp:TextBox ID="txtAge" TabIndex="1" DataType = "String" runat="server" MaxLength="50" CssClass="textBox" Style="width: 150px" CausesValidation="true" onblur="return ValidateAge();"></asp:TextBox>
并且为按钮
定义了一个访问键<asp:Button ID="btnSave" AccessKey="S" AssociatedControlID="btnSave" TabIndex="1" runat="server" CssClass="ButtonSaveNew" onclick="return ValidatePage();"></asp:Button>
现在,如果我在Age字段中按下'Alt + S'年龄无效,首先会调用Age的onblur(因为我设置了AssociatedControlID),然后调用保存按钮的onclick。
现在发生的事情是,无论年龄是有效还是无效,保存都会被执行。
如果年龄无效,我需要从文本框的'onblur'事件中取消按钮的'onclick'事件。
答案 0 :(得分:2)
可能发生的事情是你的表单正在提交,因此该按钮实际上没有触发onclick
事件(因为它没有被点击这样!)。如果您在其中一个表单字段中输入Enter(即使使用txtAge
字段!),您可能会注意到相同的行为,因为这也会导致表单提交。
在这种情况下最简单的方法是将ValidatePage
函数注册为表单上提交事件的处理程序:
<form onsubmit="ValidatePage()">
虽然我很欣赏你使用的是WebForms,因此这很可能会很困难。每当我在WebForms中完成客户端验证时,我总是依赖于jQuery.validation插件。如果您已经依赖于jQuery,那么它提供了一个非常简洁的模型来进行验证。它与开箱即用的WebForms不能很好地兼容,你需要做一些游戏才能让它运行起来。 Dave Ward的帖子可能会有所帮助:http://encosia.com/using-jquery-validation-with-asp-net-webforms/
答案 1 :(得分:1)
是否可以从其他事件中取消java脚本事件?
不,一般不是。此外,blur
event无法取消,根据how to prevent blur() running when clicking a link in jQuery?,抓住焦点很复杂。
然而,我不认为当用户试图离开元素(并且聚焦下一个输入)时保持焦点是非常用户友好的 - 只显示有叶输入的验证失败。您确实应该阻止的唯一事件是submit
,当验证失败时,您可以将焦点放在第一个无效字段上。
var ageValid;
$("#txtAge").change(function validateAge(e) {
if(!isNaN(this.value) && this.value >= 0) {
ageValid = true;
} else {
$(this).addClass("invalid");
ageValid = false;
}
}).change();
$("#formid").submit(function validatePage(e) {
// maybe calls to the single validation functions?
if (! ageValid) {
e.preventDefault();
$("#txtAge").focus();
return false;
}
});