为什么我的更改处理程序从未被解雇

本文关键字:程序 我的 处理 为什么 | 更新日期: 2023-09-27 18:05:21

我已经得到了这个jQuery,衍生自Gregor Primar在这里发布的内容:

/*每当boxGrandTotal发生变化时(当在任何"amount"输入文本元素中输入任何金额时),如果总数之间存在差异,则禁用保存按钮*/

$(document).on("change", '[id$=boxGrandTotal]', function () {
    //var savebutton = $("[id$=btnSave]");
    alert('entered the change handler for boxGrandTotal');
    var savebutton = document.getElementById('[id$=btnSave]');
    var payment = parseFloat(document.getElementById('[id$=boxPaymentAmount]').value).toFixed(2);
    var total = parseFloat(document.getElementById('[id$=boxGrandTotal]').value).toFixed(2);
    if (payment == null) payment = 0;
    if (total == null) total = 0;
    if (payment == total) {
        savebutton.attr("disabled", false);
        return true;
    } else {
        alert('Total and Payment Total do not match. Please enter the same amount for both values and try again!');
        savebutton.attr("disabled", true);
        return false;
    }
});

这个应该在更新boxGrandTotal时触发,对吗?它确实正在更新,但是我从来没有看到"输入了boxGrandTotal的更改处理程序"

是一个ID以"boxGrandTotal"结尾的TextBox/text input元素;下面是在代码后面创建它的方法:

boxGrandTotal = new TextBox()
{
    CssClass = "dplatypus-webform-field-input",
    ID = "boxGrandTotal"
};

那么,当boxGrandTotal 中的值变化时,为什么'change'处理程序不触发?它是否仅在手动更改值时触发?如果是这样,有什么变通办法?

更新

响应kalkanbatuhan的建议,将我的代码更改为:

boxGrandTotal = new TextBox()
{
    CssClass = "dplatypus-webform-field-input",
    ID = "boxGrandTotal",
    ClientIDMode = System.Web.UI.ClientIDMode.Static
};

…具体来说,会发出两个编译器产生的错误:

System.Web.UI.WebControls。TextBox'不包含'ClientIDMode'的定义

——:

名称空间'System.Web '中不存在类型或名称空间'ClientIDMode'。

更新2

BTW*,这是如何在boxGrandTotal的值被改变:

$(document).on("blur", '.amountbox', function (e) {
    var amount1 = $('[id$=boxAmount1]').val() != '' ? parseFloat($('[id$=boxAmount1]').val()) : 0;
    var amount2 = $('[id$=boxAmount2]').val() != '' ? parseFloat($('[id$=boxAmount2]').val()) : 0;
    var amount3 = $('[id$=boxAmount3]').val() != '' ? parseFloat($('[id$=boxAmount3]').val()) : 0;
    var amount4 = $('[id$=boxAmount4]').val() != '' ? parseFloat($('[id$=boxAmount4]').val()) : 0;
    var amount5 = $('[id$=boxAmount5]').val() != '' ? parseFloat($('[id$=boxAmount5]').val()) : 0;
    var grandtotal = amount1 + amount2 + amount3 + amount4 + amount5;
    $('[id$=boxGrandTotal]').val(parseFloat(grandtotal).toFixed(2));
});

为什么我的更改处理程序从未被解雇

试试这个

boxGrandTotal = new TextBox()
        {
            CssClass = "dplatypus-webform-field-input",
            ID = "boxGrandTotal",
            ClientIDMode =System.Web.UI.ClientIDMode.Static
        };

解决方案是在分配值的代码中添加一个".trigger("change")",这样,而不是这样:

$('[id$=boxGrandTotal]').val(parseFloat(grandtotal).toFixed(2));

…它是:

$('[id$=boxGrandTotal]').val(parseFloat(grandtotal).toFixed(2)).trigger("change");

更详细地说,必须在值更改时显式地触发更改事件(注意附加的"。trigger()"jazz):

$(document).on("blur", '.amountbox', function (e) {
    var amount1 = $('[id$=boxAmount1]').val() != '' ? parseFloat($('[id$=boxAmount1]').val()) : 0;
    . . .
    var grandtotal = amount1 + amount2 + amount3 + amount4 + amount5;
    $('[id$=boxGrandTotal]').val(parseFloat(grandtotal).toFixed(2)).trigger("change");
});

…下面的代码运行得很好:

/* Whenever boxGrandTotal changes (which it does when any amount is entered in any of the "amount" input text elements), disable the save button if there is a discrepancy between the totals */
$(document).on("change", '[id$=boxGrandTotal]', function () {
    var savebutton = document.getElementById('[id$=btnSave]');
    var payment = $('[id$=boxPaymentAmount]').val() != '' ? parseFloat($('[id$=boxPaymentAmount]').val()) : 0;
    var total = $('[id$=boxGrandTotal]').val() != '' ? parseFloat($('[id$=boxGrandTotal]').val()) : 0;
    if (payment == null) payment = 0;
    if (total == null) total = 0;
    if (payment == total) {
        savebutton.attr("disabled", false);
        return true;
    } else {
        alert('Total and Payment Total do not match. Please enter the same amount for both values and try again!');
        //savebutton.attr("disabled", true);
        savebutton.prop("disabled", true);
        return false;
    }
});

我说"pretty well"而不是" stupently splendiferous",因为保存按钮没有被禁用。