You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

jQuery中如何在另一个函数中读取其他函数的变量

解决跨函数访问AJAX返回的holidayDays变量问题

我来帮你搞定这个问题~你当前的核心问题是holidayDays是第一个AJAX请求的success回调里的局部变量,第二个#leave_days的事件处理函数没法直接访问它。下面给你几种实用的解决方案:

方法1:声明全局变量(最简单直接)

把holidayDays定义在所有函数的外部,这样两个事件函数都能访问到它。修改后的代码如下:

// 全局声明变量,初始值设为空数组
let holidayDays = [];

$(document).ready(function() {
    $(document).on('change', '#leave_type', function() {
        var air_id = $(this).val();
        $.ajax({
            type: 'get',
            url: '{{ route('get.employeeleavecounts.all') }}',
            data: { 'id': air_id },
            dataType: 'json',
            success: function(data) {
                // 给全局变量赋值
                holidayDays = data.nationalholidays;
                console.log(holidayDays);
            },
            error:function(){ 
                // 出错时重置变量,避免旧数据干扰
                holidayDays = [];
            }
        });
    });

    $("#leave_days").on('keyup blur', function (e) {
        var periodval = parseInt($("#leave_days").val());
        // 现在可以直接访问holidayDays了
        console.log(holidayDays);
        // 示例:遍历假期日期
        holidayDays.forEach(holiday => {
            console.log('假期日期:', holiday.holiday_date);
        });
        // 这里写你要用holidayDays实现的业务逻辑
    });
});

方法2:利用DOM的data属性存储数据(更符合DOM操作规范)

如果不想用全局变量,可以把holidayDays存在某个DOM元素的data属性里,比如绑定到#leave_days上:

$(document).ready(function() {
    $(document).on('change', '#leave_type', function() {
        var air_id = $(this).val();
        $.ajax({
            type: 'get',
            url: '{{ route('get.employeeleavecounts.all') }}',
            data: { 'id': air_id },
            dataType: 'json',
            success: function(data) {
                // 把数据存在#leave_days的data属性中
                $("#leave_days").data('holidayDays', data.nationalholidays);
                console.log(data.nationalholidays);
            },
            error:function(){ 
                $("#leave_days").data('holidayDays', []);
            }
        });
    });

    $("#leave_days").on('keyup blur', function (e) {
        var periodval = parseInt($(this).val());
        // 从data属性中取出holidayDays,为空时用默认空数组
        const holidayDays = $(this).data('holidayDays') || [];
        console.log(holidayDays);
        // 后续业务逻辑...
    });
});

方法3:重构为模块化函数(更适合复杂场景)

如果你的业务逻辑后续会更复杂,建议把处理逻辑封装成独立函数,需要时传入参数,让代码更易维护:

$(document).ready(function() {
    let holidayDays = [];

    // 封装处理leave_days的函数,接收请假天数和假期数据作为参数
    function handleLeaveDays(periodVal, holidays) {
        console.log('请假天数:', periodVal);
        console.log('可用假期数据:', holidays);
        // 这里写你的核心业务逻辑
    }

    $(document).on('change', '#leave_type', function() {
        var air_id = $(this).val();
        $.ajax({
            type: 'get',
            url: '{{ route('get.employeeleavecounts.all') }}',
            data: { 'id': air_id },
            dataType: 'json',
            success: function(data) {
                holidayDays = data.nationalholidays;
                // 可选:AJAX成功后直接触发一次处理逻辑
                const currentLeaveVal = parseInt($("#leave_days").val());
                handleLeaveDays(currentLeaveVal, holidayDays);
            },
            error:function(){ 
                holidayDays = [];
            }
        });
    });

    $("#leave_days").on('keyup blur', function (e) {
        var periodval = parseInt($(this).val());
        // 调用封装好的函数,传入holidayDays
        handleLeaveDays(periodval, holidayDays);
    });
});

额外提醒

如果用户可能在#leave_type还没选择(也就是AJAX还没返回数据)时就操作#leave_days,记得要判断holidayDays是否为空,避免出现undefined相关的报错。

内容的提问来源于stack exchange,提问作者user11352561

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.09 21:02:35