javascript - 处理 2 个元素的更改

标签 javascript jquery

我有以下代码

jQuery(document).ready(function(jQ) {                   
		jQ('.WorkType').on("change", function(){
			if (jQ(this).val() == 'Standard Hours'){
				jQ(this).closest('.DayTimeWrapper').find('.Hours').addClass("Calc_Hours");
				jQ(this).closest('.DayTimeWrapper').find('.Hours').removeClass("Calc_Leave");
				jQ(this).closest('.DayTimeWrapper').find('.Hours').removeClass("Calc_RDO");
			}else if (jQ(this).val() == 'RDO'){
				jQ(this).closest('.DayTimeWrapper').find('.Hours').addClass("Calc_RDO");
				jQ(this).closest('.DayTimeWrapper').find('.Hours').removeClass("Calc_Leave");
				jQ(this).closest('.DayTimeWrapper').find('.Hours').removeClass("Calc_Hours");				
			}else{
				jQ(this).closest('.DayTimeWrapper').find('.Hours').addClass("Calc_Leave");
				jQ(this).closest('.DayTimeWrapper').find('.Hours').removeClass("Calc_RDO");
				jQ(this).closest('.DayTimeWrapper').find('.Hours').removeClass("Calc_Hours");
			}
			window.setTimeout(function () {
				jQ(".Calc_Hours").sum("focusout", "#standard_hours");
				jQ(".Calc_Leave").sum("focusout", "#leave_hours");
				jQ(".Calc_RDO").sum("focusout", "#rdo_hours");
				},1000);
		})	
	})

此代码在对具有类 WorkType 的元素进行更改时遍历 dom,并修改位于 div DayTimeWrapper 内的 Hours 元素的类属性。然后执行计算并将结果放入具有指定 ID 的元素中。

效果很好

但是,我需要对类设置为 setTime 的其他元素执行相同的计算,因此我修改了代码,如下

jQuery(document).ready(function(jQ) {                   
		jQ('.WorkType,.setTime').on("change", function(){
			if (jQ('.DayTimeWrapper').closest('.WorkType').val() == 'Standard Hours'){
				jQ(this).closest('.DayTimeWrapper').find('.Hours').addClass("Calc_Hours");
				jQ(this).closest('.DayTimeWrapper').find('.Hours').removeClass("Calc_Leave");
				jQ(this).closest('.DayTimeWrapper').find('.Hours').removeClass("Calc_RDO");
			if (jQ('.DayTimeWrapper').closest('.WorkType').val() == 'RDO'){
				jQ(this).closest('.DayTimeWrapper').find('.Hours').addClass("Calc_RDO");
				jQ(this).closest('.DayTimeWrapper').find('.Hours').removeClass("Calc_Leave");
				jQ(this).closest('.DayTimeWrapper').find('.Hours').removeClass("Calc_Hours");				
			}else{
				jQ(this).closest('.DayTimeWrapper').find('.Hours').addClass("Calc_Leave");
				jQ(this).closest('.DayTimeWrapper').find('.Hours').removeClass("Calc_RDO");
				jQ(this).closest('.DayTimeWrapper').find('.Hours').removeClass("Calc_Hours");
			}
			window.setTimeout(function () {
				jQ(".Calc_Hours").sum("focusout", "#standard_hours");
				jQ(".Calc_Leave").sum("focusout", "#leave_hours");
				jQ(".Calc_RDO").sum("focusout", "#rdo_hours");
				},1000);
		})	
	})

这不起作用,我正在努力找出原因。控制台中的错误是

未捕获的语法错误:意外的标记)

任何解决此问题的帮助将不胜感激

最佳答案

您没有在第一个 if 语句后关闭括号。我已经优化了您的选择器的性能和可读性:

jQuery(document).ready(function (jQ) {
    jQ('.WorkType,.setTime').on("change", function () {
        var $hours = jQ(this).closest('.DayTimeWrapper').find('.Hours');
        var workType = jQ('.DayTimeWrapper').closest('.WorkType').val();
        if (workType == 'Standard Hours') {
            $hours.addClass("Calc_Hours");
            $hours.removeClass("Calc_Leave");
            $hours.removeClass("Calc_RDO");
        } else if (workType == 'RDO') {
            $hours.addClass("Calc_RDO");
            $hours.removeClass("Calc_Leave");
            $hours.removeClass("Calc_Hours");
        } else {
            $hours.addClass("Calc_Leave");
            $hours.removeClass("Calc_RDO");
            $hours.removeClass("Calc_Hours");
        }

        // The following code seems to be corrupt:
        window.setTimeout(function () {
            jQ(".Calc_Hours").sum("focusout", "#standard_hours");
            jQ(".Calc_Leave").sum("focusout", "#leave_hours");
            jQ(".Calc_RDO").sum("focusout", "#rdo_hours");
        }, 1000);

    })
});

编辑:

这似乎就是您想要做的:

https://jsfiddle.net/mk07fof5/1/

$('.WorkType,.setTime').on("change", function() {
    var $currRow = $(this).closest('.DayTimeWrapper'),
        $allRows = $currRow.closest('.DayTimeTable').find('.DayTimeWrapper');

    calculate($currRow); //pass the element which triggered the event

    var CalcHours = 0,
        MealHours = 0,
        RdoHours = 0;

    $allRows.each(function(i) {
        $row = $(this);
        var hours = ParseFloat($row.find('.Hours').val());
        if(!hours) return;
        var workType = $row.find('.WorkType').val();
        switch (workType) {
            case 'Standard Hours':
                CalcHours += hours;
                break;
            case 'RDO':
                RdoHours += hours;
                break;
            default:
                MealHours += hours;
        }
    });

    $("#standard_hours").html(CalcHours.toFixed(2));
    $("#leave_hours").html(MealHours.toFixed(2));
    $("#rdo_hours").html(RdoHours.toFixed(2));
});

不要忘记将表格包装到这个 div 中:

<div class="DayTimeTable">[...]</div>

关于javascript - 处理 2 个元素的更改,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35857147/

相关文章:

javascript - 在jquery中创建异步each循环

javascript - 如何捕获 2 级列表中的顶部复选框并为其设置样式

jquery - 从选项卡 ui 控件中删除边框

javascript - Node.js 和 FRP(bacon.js) 中的原生 JS

javascript - Angular promise 不起作用

javascript - Owl Carousel slider 第二张图像未加载

javascript - Facebook Javascript SDK 重新请求权限不提示

javascript - 设置间隔();不执行

javascript - 迭代 JSON 对象以获取自动完成建议

javascript - pageinit 内的单击事件仅在页面刷新后起作用