在jQuery对话框中将函数作为参数传递

时间:2012-06-05 11:05:50

标签: jquery dialog

我想通过调用函数在该对话框中创建一个带按钮功能的对话框。但它不起作用。
我的代码如下 //函数初始对话框

function inti_dlg(selector, autoOpen, height, width, modal, num_button, fn_apply, fn_cancel, fn_close)
    {
        if (num_button>1)
        {
            selector.dialog({
                autoOpen: autoOpen,
                height:height,
                width:width,
                modal:modal,
                buttons:{
                    Apply:function(){fn_apply},
                    Cancel:function(){fn_cancel}
                },
                close:function(){fn_close}
            });
        }
        else{
            selector.dialog({
                autoOpen: autoOpen,
                height:height,
                width:width,
                modal:modal,
                buttons:{
                    Apply:function(){fn_apply}
                },
                close:function(){fn_close}
            });
        }
    }

//功能abc

function abc()
{
    alert("abc");
}

//调用初始对话框函数

$(function (){
    inti_dlg($('#cde'), false, 440, 480, true, 1, abc(), '', abc());
    $('#clickhere').click(function(){$('#cde').dialog('open');});
});

Html:

<div id="clickhere">Click here</div>
<div id="cde">
     <div>Test : pass argument as a function</div>
</div>

2 个答案:

答案 0 :(得分:2)

http://devlicio.us/blogs/sergio_pereira/archive/2009/02/09/javascript-5-ways-to-call-a-function.aspx

使用

Function.apply()

Function.call()

调用作为参数传递的函数。并且您不需要添加paranthesis和函数名称作为参数传递。只需传递函数名称。

function inti_dlg(selector, autoOpen, height, width, modal, num_button, fn_apply, fn_cancel, fn_close)
{
    if (num_button>1)
    {
        selector.dialog({
            autoOpen: autoOpen,
            height:height,
            width:width,
            modal:modal,
            buttons:{
                Apply:function(){fn_apply.apply()},
                Cancel:function(){fn_cancel.apply()}
            },
            close:function(){fn_close.apply()}
        });
    }
    else{
        selector.dialog({
            autoOpen: autoOpen,
            height:height,
            width:width,
            modal:modal,
            buttons:{
                Apply:function(){fn_apply.apply()}
            },
            close:function(){fn_close.apply()}
        });
    }
}

并且用于调用此

$(function (){
inti_dlg($('#cde'), false, 440, 480, true, 1, abc, '', abc);
$('#clickhere').click(function(){$('#cde').dialog('open');});
});

答案 1 :(得分:2)

您实际上是在执行该函数而不是错误地传入它。为了传递函数并使其非常清楚发生了什么,我建议做这样的事情:

var abc = function ()
{
    alert("abc");
}


$(function (){
    inti_dlg($('#cde'), false, 440, 480, true, 1, abc, '', abc);
    $('#clickhere').click(function(){$('#cde').dialog('open');});
});

然后当你在“inti_dlg”里面时,不要对“fn_apply,fn_cancel或fn_close”做任何事情。您希望将未触及的函数传递给jQuery Dialog以便在那里执行。

起初可能很难掌握,但为了在JavaScript中有效,您可能需要根据您习惯的语言调整您对“功能”的理解。由于JavaScript是一种函数式语言(或多或少),函数是一等公民,可以像任何其他变量(如字符串或int)一样传递,稍后通过将appending()执行到函数变量名称(并传入)函数的任何参数)