【问题标题】:pass function as a callback to function将函数作为回调传递给函数
【发布时间】:2011-07-20 03:36:01
【问题描述】:

我有这个代码:

$('.b-icon.b-icon_del').click(function(e) {
showConfirmDialog('Are you sure you want to delete this document?',deleteDocument(window.lastSelectedRowId), 'Delete document');                    
}); 

function showConfirmDialog(content, callback, pTitle, obj){
    return showDialogEx(content, callback, pTitle, obj, "Yes", "No");
}

function showDialogEx(content, callback, pTitle, obj, okButtonLabel, cancelButtonLabel){
    var str = "#_showMessageDialog";
    var showMessageDialog = $(str);
    if(showMessageDialog.length == 0){
        $('body').append('<div id="_showMessageDialog"></div>');
        showMessageDialog = $(str);
    }
    showMessageDialog.val("");
    showMessageDialog.append('<p id="_showMessageDialogContent">'.concat(content, '</p>'));

    var my_buttons = {};
    my_buttons[cancelButtonLabel] = function(){
        $(this).dialog("close");
        $(this).html("");
        $(this).dialog("destroy");
    };
    my_buttons[okButtonLabel] = function(){
        callback();
        $(this).html("");
        $(this).dialog("close");
        if(obj){
            obj.focus();
        }
        $(this).dialog("destroy");
    };

    showMessageDialog.dialog({
        modal : true,
        resizable : true,
        title : pTitle,
        minWidth : 250,
        width : 450,
        buttons : my_buttons
    });

}

然后我单击带有.b-icon.b-icon_del 类的按钮,目前似乎同时执行deleteDocument(window.lastSelectedRowId)showConfirmDialog('Are you sure you want to delete this document?',deleteDocument(window.lastSelectedRowId), 'Delete document'); 。我只想在用户单击“确定”按钮后调用该回调函数(deleteDocument(window.lastSelectedRowId))。谢谢!

【问题讨论】:

    标签: javascript jquery jquery-ui jquery-plugins jdialog


    【解决方案1】:

    当您将函数deleteDocument(window.lastSelectedRowId) 作为第二个参数showConfirmDialog 传递时,您正在执行它。

    您应该只将它以及参数window.lastSelectedRowId 传递给showConfirmDialog,而不执行它。

    $('.b-icon.b-icon_del').click(function(e) {
    showConfirmDialog('Are you sure you want to delete this document?',deleteDocument, window.lastSelectedRowId, 'Delete document');                    
    }); 
    
    function showConfirmDialog(content, callback, rowId, pTitle, obj){
        return showDialogEx(content, callback, rowId, pTitle, obj, "Yes", "No");
    }
    
    function showDialogEx(content, callback, rowId, pTitle, obj, okButtonLabel, cancelButtonLabel){
        var str = "#_showMessageDialog";
        var showMessageDialog = $(str);
        if(showMessageDialog.length == 0){
            $('body').append('<div id="_showMessageDialog"></div>');
            showMessageDialog = $(str);
        }
        showMessageDialog.val("");
        showMessageDialog.append('<p id="_showMessageDialogContent">'.concat(content, '</p>'));
    
        var my_buttons = {};
        my_buttons[cancelButtonLabel] = function(){
            $(this).dialog("close");
            $(this).html("");
            $(this).dialog("destroy");
        };
        my_buttons[okButtonLabel] = function(){
            callback(rowId);
            $(this).html("");
            $(this).dialog("close");
            if(obj){
                obj.focus();
            }
            $(this).dialog("destroy");
        };
    
        showMessageDialog.dialog({
            modal : true,
            resizable : true,
            title : pTitle,
            minWidth : 250,
            width : 450,
            buttons : my_buttons
        });
    
    }
    

    【讨论】:

    • 谢谢本。如果回调函数有变体参数列表会更好,因为我确实在项目的很多地方都使用了这个函数。
    【解决方案2】:
    $('.b-icon.b-icon_del').click(function(e) {
    showConfirmDialog('Are you sure you want to delete this document?',deleteDocument, [window.lastSelectedRowId], 'Delete document');                    
    }); 
    
    function showConfirmDialog(content, callback, callbackArguments, pTitle, obj){
        return showDialogEx(content, callbackArguments,  pTitle, obj, "Yes", "No");
    }
    

    进入:

    function showDialogEx(content, callback, callbackArguments, pTitle, obj, okButtonLabel, cancelButtonLabel)
    

    行:

    my_buttons[okButtonLabel] = function(){
        callback();
    

    应该是:

    my_buttons[okButtonLabel] = function(){
        callback.apply(this, callbackArguments);
    

    需要注意的是,callbackArguments 是一个列表["value'],即使它只有一个值。

    【讨论】:

    • 这是一个很好的方法,但我更喜欢将回调函数包装在function() { } 中并以这种方式使用。
    • 这完全取决于偏好。这样你就不会在每次调用它时都创建一个新函数。它还具有能够指定 this 所指的内容以及在某些情况下非常重要的好处。
    【解决方案3】:

    或者,将deleteDocument(window.lastSelectedRowId) 包装在一个函数中,以防止在调用$('.b-icon.b-icon_del').click() 时过早地对其进行评估。

    $('.b-icon.b-icon_del').click(function(e) {
    showConfirmDialog('Are you sure you want to delete this document?', function() { return deleteDocument(window.lastSelectedRowId); }                  
    }); 
    

    【讨论】:

    • 谢谢!我只是将回调包装在function() { deleteDocument(window.lastSelectedId) } 中,它运行良好。轻松解决。调用function() { deleteDocument(window.lastSelectedRowId) }function() { return deleteDocument(window.lastSelectedRowId); 有什么区别?
    • 没有什么不同,除非你必须从包装函数返回一些东西。 (旧习惯很难改掉......(旧式事件处理程序通常需要带有返回的包装函数。))我不得不说 James Khoury 的解决方案非常简洁(使用 apply() 和参数对象)并且在这种包装不是那么容易的语言。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-10-08
    • 2020-10-02
    • 1970-01-01
    • 2013-04-12
    • 1970-01-01
    相关资源
    最近更新 更多