从字符串变量的Javascript回调不起作用,尝试了正常的解决方案

时间:2013-10-09 13:21:09

标签: javascript function callback

我已经阅读了他们建议使用的相关问题:

var functionName="myFunctionName";
window[functionName]();

我在这里但不起作用:

具有回调字符串变量的自定义模态框函数:

<script>
        $(document).ready(function () {
            //
            // Events
            //
            $('#btnStep1').click(function () {
                ylaConfirm('message', 'title', 'Y', 'N', 'doStep1');
            });
            //
            //
            // Functions
            //
            function doStep1() {
                ...
                ...
                });
            }
            function ylaConfirm(_msg, _title, _btnYes, _btnNo, _callbackYes) {
                bootbox.dialog({
                    message: _msg,
                    title: _title,
                    buttons: {
                        success: {
                            label: _btnYes,
                            className: "btn-success",
                            callback: function () {
                                window[_callbackYes]();
                            }
                        },
                        main: {
                            label: _btnNo,
                            className: "btn-primary"
                        }
                    }
                });
            }
        });
        //


    </script>

Firebug报告:未定义......

致电代码:

ylaConfirm('message', 'title', 'Y', 'N', 'doStep1');

想法?

3 个答案:

答案 0 :(得分:3)

三件事。

ylaConfirm('message', 'title', 'Y', 'N', 'doStep1');
  1. 执行window[_callbackYes]();时,尚未定义doStep1。因此,您可以在click函数之前定义它。
  2. 解决此问题的另一种方法是将doStep1定义为内联匿名函数,并将其直接调用为_callbackYes()而不是window[_callbackYes]();。因此,ylaConfirm调用将变为这样

    ylaConfirm('message', 'title', 'Y', 'N', function(){
        //Include the actual definition of doStep1 here.
    });
    
  3. 正如@VoronoiPotato在评论中所提到的,您可以直接将该函数作为第三个参数传递(您应该在doStep1之前移动click的定义或定义{{1}像这样doStep1)。

    var doStep1 = function() {..}

答案 1 :(得分:2)

您所描述的内容表示window[_callbackYes]在执行ylaConfirm期间未定义,但是由点击Yes按钮定义。

移动doStep1

的定义
function doStep1() {
  ...
}

$(document).ready(function () {
  ...
}

答案 2 :(得分:1)

我会说电话

window[_callbackYes]();

完全没问题。问题是doStep1()的范围。在匿名就绪函数内定义,它不附加到窗口对象,只能在外部函数内调用。可以在此处找到进一步的参考:Functions and Function scope

我的建议:在ready函数之外定义doStep1()或将它附加到窗口对象,如下所示:

window.doStep1 = function() {
//do stuff
}

如果你需要为函数定义初始化页面,这可能是必要的(我认为这是不太可能的)