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

JavaScript中initBtn调用populateVars提示未定义,求正确调用方法

问题解决:调用populateVars函数时出现「函数未定义」的错误

问题原因

在$(document).on('shown.bs.modal', '#xyzModal', function (event) {...})的事件回调中,this的指向是触发事件的DOM元素(即#xyzModal),而非ABCD对象。直接用this.populateVars会找不到该方法,因此抛出「函数未定义」的错误。

两种修正方案

方案1:提前保存ABCD对象的引用

在initBtn函数内部,先将this(即ABCD对象)保存到变量中,再在事件回调里通过该变量调用populateVars:

initBtn: function(modal) {
    var btnHtml = `
        <style>
            .myBtn {display: inline-block;}
        </style>
        <a data-toggle="modal" data-target="#xyzModal" href="#" class="myBtn"></a>
    `;

    $(".xyzBtnHolder").css({'maxWidth' : '260px'});
    document.querySelector('.xyzBtnHolder').insertAdjacentHTML('beforeend', btnHtml);

    // 保存ABCD对象的引用
    const self = this;

    $(document).on('shown.bs.modal', '#xyzModal', function (event) {
        var triggerElement = $(event.relatedTarget);
        $(".modal-backdrop.in").css({opacity: 0.75});
        if ($("#xyzFrameHolder").is(':empty')) {
            // 通过保存的引用调用方法
            let vars = self.populateVars(triggerElement);
            window.MYWidget({
                origin: window.location.origin,
                vehicle: vars.vehicle,
                vehicleType: vars.vehicleType,
                onClose: function(el) {
                    $(el).modal('hide');
                    $("#xyzFrameHolder").empty();
                },
                onSubmit: function() {
                    $('#xyz-overlay').show();
                    $("#xyz-spinner").show();
                }
            }).render(('#xyzFrameHolder'));
        }
    });

    modal.on('hidden.bs.modal',function() {
        $(".modal-backdrop.in").css({opacity: 1});
    });
},

方案2:使用箭头函数绑定this

箭头函数会继承外层作用域的this指向,不会被事件回调改变,因此可以直接用this.populateVars:

initBtn: function(modal) {
    var btnHtml = `
        <style>
            .myBtn {display: inline-block;}
        </style>
        <a data-toggle="modal" data-target="#xyzModal" href="#" class="myBtn"></a>
    `;

    $(".xyzBtnHolder").css({'maxWidth' : '260px'});
    document.querySelector('.xyzBtnHolder').insertAdjacentHTML('beforeend', btnHtml);

    // 用箭头函数作为回调,this仍指向ABCD对象
    $(document).on('shown.bs.modal', '#xyzModal', (event) => {
        var triggerElement = $(event.relatedTarget);
        $(".modal-backdrop.in").css({opacity: 0.75});
        if ($("#xyzFrameHolder").is(':empty')) {
            let vars = this.populateVars(triggerElement);
            window.MYWidget({
                origin: window.location.origin,
                vehicle: vars.vehicle,
                vehicleType: vars.vehicleType,
                onClose: function(el) {
                    $(el).modal('hide');
                    $("#xyzFrameHolder").empty();
                },
                onSubmit: function() {
                    $('#xyz-overlay').show();
                    $("#xyz-spinner").show();
                }
            }).render(('#xyzFrameHolder'));
        }
    });

    modal.on('hidden.bs.modal',function() {
        $(".modal-backdrop.in").css({opacity: 1});
    });
},

额外修复提示

populateVars函数的else分支中,vehicle和vehicleType是未定义变量,会引发新错误,需补充定义或设置默认值,示例:

populateVars: function(element) {
    const srpVehicles = document.querySelectorAll('.srpVehicle');
    if (srpVehicles.length > 0) {
        const srpVehicle = element.parents('.srpVehicle').first();
        return {
            vehicle: srpVehicle.data('name'),
            vehicleType: srpVehicle.data('vehicletype')
        }
    } else {
        // 设置默认值或从全局变量获取
        return {
            vehicle: window.vehicle || '',
            vehicleType: window.vehicleType || ''
        }
    }
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.31 22:35:18