【问题标题】:Trying to get a change event to fire only when multiple text inputs have changed仅在多个文本输入发生更改时才尝试触发更改事件
【发布时间】:2013-11-15 20:30:51
【问题描述】:

我有两个文本输入字段(实际上是 jQuery UI 日期选择器的输入)和一个选择字段。代码是:

<input type="text" id="datepickerStart" name="datepickerStart" placeholder="Start hire"/>
<input type="text" id="datepickerEnd" name="datePickerEnd" placeholder="End hire"/>
<select name="hireQuantity" id="hireQuantity">

我正在尝试更改选择的背景颜色,只有当两个文本输入都触发了它们的更改事件时。当任何一个输入发生变化时,我尝试的每个解决方案都会发生变化。我试过条件语句.add(),但我没有想法。这是我最基本的代码尝试,有什么建议吗?

$('#datepickerStart', '#datepickerEnd').change(function() { $('#hireQuantity').css('background','rgb(249,237,50)'); });//end change

【问题讨论】:

    标签: jquery events jquery-ui-datepicker jquery-events


    【解决方案1】:

    在更改时添加一个类(或使用 data() 或其他)并检查两个元素是否具有该类,如果有,则选择器的长度为 2,只需确保 DOM 中没有其他元素,但两个日期选择器不小心拥有相同的类

    $('#datepickerStart', '#datepickerEnd').change(function() {
        $(this).addClass('changed');
    
        if ($('.changed').length == 2)
            $('#hireQuantity').css('background','rgb(249,237,50)');
    });
    

    【讨论】:

    • 是的。确实有很多方法可以做到这一点,但关键是您需要跟踪状态 - 是否发生了变化或两者都发生了变化,因为它们不会同时发生变化。您可以将状态存储在变量或数据属性中,或者按照建议,通过添加类。
    • @JacobM - 事实上,我只是通过查看问题想出了很多方法,而且可能还有很多我没有想到的方法,但是使用一个类似乎是最容易解释的在一小段代码中。
    • 感谢大家这么快回复我,我真的很感激,我已经尝试更改类选项,在标准文本输入上,它会工作得很好,但是 jQuery UI 日期选择器用它自己的覆盖类与更改事件“.hasDatepicker”无关,即使使用 .removeClass() 链接也不会为 .addClass() 设置它。我会尝试设置数据属性路由或将状态保存在变量中..会让你知道它是怎么回事:)再次感谢
    • 大家好,为了给你们更新,我已经开始工作了。我选择了数据属性设置,因为我不想弄乱 UI 日期选择器固有的那个类。话虽如此,它拒绝工作很长时间,直到我在设置属性之前捕获 $(this) 作为变量..!再次感谢大家,我真的很感谢对像我这样的新 jQuery 孩子的支持。谢谢!
    【解决方案2】:

    我有一个 jsfiddle 以稍微不同的方式处理这个问题。

    HTML:

    <input class="datepicker" type="text" id="datepickerStart" name="datepickerStart" placeholder="Start hire" />
    <input class="datepicker" type="text" id="datepickerEnd" name="datePickerEnd" placeholder="End hire" />
    <select name="hireQuantity" id="hireQuantity"></select>
    

    JavaScript:

    function clickHandler (count, cb) {
        var changed;
        changed = [];
        return function (e) {
            if (-1 === changed.indexOf(e.currentTarget)) {
                changed.push(e.currentTarget);
                if (0 < count) {
                    cb.apply(this, arguments);
                } else {
                    count += 1;
                }
            }
        }
    }
    $('.datepicker').change(clickHandler(0, function () {
        $('#hireQuantity').css('background','rgb(249,237,50)');
    }));
    

    【讨论】:

    • 现在试着改变第一个输入两次,看看你的代码有什么严重的缺陷?
    • @adeneo 刚刚再次更新,以更清楚地说明我喜欢我的方法。这个 clickHandler(一个更好的名字可能更好),更可重用,因为我们可以为页面上任意数量的元素获得相同的功能。
    猜你喜欢
    • 2011-11-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-12-28
    • 2018-08-09
    • 1970-01-01
    相关资源
    最近更新 更多