将函数推送到对象文字的前面

时间:2011-07-11 07:41:32

标签: javascript jquery object-literal

我有一些html来弹出一个jQuery UI模式:

<a href="my/url" class="popup">Click me</a>

使用此javascript代码:

$('.popup').click(function() {
    var a = this;

    var dialog = $('<div>').load($(a).attr('href'), function() {
        var form = dialog.find('form');

        dialog.dialog({
            modal: true,
            title: $(a).attr('title'),
            buttons: {
                Add : function () {
                    $.post($(form).attr('action'), $(form).serialize());
                    dialog.dialog('close');
                },
                Cancel: function () {
                    dialog.dialog('close');
                }
            }
        });

        if ($(a).attr('data-third')) {
            // Add here a button
        }
    });
    return false;
});

这个想法是模态中的资源包含一个表单,在提交模式时提交表单。现在<a href="my/url" class="popup" data-third="Add & new">Click me</a>存在时,意味着第三个按钮按此顺序放置在模态中:Cancel | Add | Add & new

我试过这段代码:

if($(a).attr('data-third')) {
    var buttons = dialog.dialog('option', 'buttons');
    buttons[$(a).attr('data-third')] = function(){
        // Callback here
    }
    dialog.dialog('option', 'buttons', buttons);
}

我有一个新按钮,但订单是Add & new | Cancel | Add。如何确保订单为Cancel | Add | Add & new

2 个答案:

答案 0 :(得分:0)

未经测试,但我认为数组键应该是buttons.length,就像这样

if($(a).attr('data-third')) {
    var buttons = dialog.dialog('option', 'buttons');
    buttons[buttons.length] = function(){
        // Callback here
    }
    dialog.dialog('option', 'buttons', buttons);
}

答案 1 :(得分:0)

使用此代码,您应始终获得取消|添加|添加&amp;新? (从左到右。

$('.popup').click(function() {
    var a = this;

    var dialog = $('<div>').load($(a).attr('href'), function() {
        var form = dialog.find('form');

        dialog.dialog({
            modal: true,
            title: $(a).attr('title'),
            buttons: {
                Cancel: function() {
                    dialog.dialog('close');
                },
                Add: function() {
                    $.post($(form).attr('action'), $(form).serialize());
                    dialog.dialog('close');
                }
            }
        });

        if ($(a).data('third')) {
            var buttons = dialog.dialog('option', 'buttons');
            console.log(buttons);
            buttons[$(a).data('third')] = function() {
                // Callback here
            }
            dialog.dialog('option', 'buttons', buttons);
        }
    });
    return false;
});

在这里小提琴:http://jsfiddle.net/rqq2p/1/

请记住使用data()而不是attrib()来从链接中获取属性!

编辑 - 基本上“按钮”是一个对象,每个属性都是一个按钮。我认为按钮出现的顺序是添加属性的顺序。在我的例子中,取消是最左边的按钮,因为它是第一个添加的属性并添加&amp;新的它是最右边的,因为它是最新的。如果您需要摆弄订单,可以创建一个新对象并按照您想要的顺序添加属性:

    if ($(a).data('third')) {
        var buttons = dialog.dialog('option', 'buttons');
        var newButtons = {};
        newButtons[$(a).data('third')] = function() {
            // Callback here
        }
        newButtons['Cancel'] = buttons['Cancel'];
        newButtons['Add'] = buttons['Add'];
        dialog.dialog('option', 'buttons', newButtons);//now add & new should be the leftmost
    }