2

我想知道,是否可以从另一个事件中取消队列中的下一个 java 脚本事件?

问题:

我有两个 ASP.Net 控件,Age - TextBox Save - Button

有两个 java 脚本验证函数,ValidateAge() - 检查有效年龄 (0 >= Age <= 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”事件。

4

2 回答 2

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/

于 2012-07-19T10:46:19.530 回答
1

是否可以从另一个事件中取消 Java 脚本事件?

不,通常不是。另外,该blur事件无法取消,并且根据如何防止在单击jQuery中的链接时运行blur()?保持焦点很复杂。

然而,我不认为当用户试图离开一个元素(并聚焦下一个输入)时保持焦点是非常用户友好的 - 只显示离开输入的验证失败。您真正应该防止的唯一事件是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;
    }
});
于 2012-07-19T11:09:01.280 回答