繁体   English   中英

确保一个事件在另一个事件的动作之后执行

[英]Make sure that an event execute after the actions of another one

假设我有一个文件,其中将事件绑定到一些输入,例如,使用moment.js解析和格式化日期,例如:

// plugins.js
$('.date').on('focusout', function() {
    var thisInput = $(this);
    thisInput.val( moment(thisInput.val()).format('YYYY-MM-DD') );
});

在我的html文件中,在plugins.js调用之后,我有一个脚本,在此脚本中,我使用解析后的日期来计算从该日期开始的年龄,假设该函数已在plugins.js执行:

<form>
    <div class="form-group">
        <label for="birth-date-input">Birth date</label>
        <input type="text" id="birth-date-input" class="date">
    </div>
    <div class="form-group">
        <label for="age">Age</label>
        <input type="text" id="age">
    </div>
</form>

<script src="plugins.js"></script>
<script>
    jQuery(document).ready(function($) {
        $('#birth-date-input').on('focusout', function() {
            var thisInputVal = $(this).val();
            var birthDate = moment(thisInputVal, 'YYYY-MM-DD');
            var age = moment().diff(birthDate, 'years');
            $('#age').val( age );
        });
    });
</script>

用我的理想话语,第二个脚本的.val()将在第一个.val()解析的日期中分配。 但是事实是,在这两种情况下,值都是相同的,我唯一可以完成这项工作的方法是使用肮脏的setTimeout()

$('#birth-date-input').on('focusout', function() {
    setTimeout(function() {
        var thisInputVal = $(this).val();
        var birthDate = moment(thisInputVal, 'YYYY-MM-DD');
        var age = moment().diff(birthDate, 'years');
        $('#age').val( age );
    }, 100);
});

有替代方法吗? 为了确保一个事件在另一个事件的操作之后执行[无setTimeout] ...

您可以在第二个函数中先调用要执行的函数,然后再调用其他任何代码。 所以它必须先执行。

 function a() { alert("first"); return true; } function b { b(); alert("second"); } 
或者您可以在执行第一个functin时设置一个隐藏变量,然后检查是否在第二个functin中设置了该变量。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM