jQuery делегат внутри диалога - селектор не работает - PullRequest
0 голосов
/ 08 марта 2012

Обновлено с полным кодом

У меня есть диалоговое окно jQuery, в котором я хочу привязать некоторые события обработчика кликов к использованию делегата jQuery, но почему-то это не работает.

Это работает:

$('table.standard tbody td .delete').live('click', function() {
    alert('delete something');
});

Это не работает, это вызывает предупреждение, когда я нажимаю ВСЕГДА в контейнере, но я хочу только для ".delete " селектор.

$('div.container').delegate('table.standard tbody td .delete', 'click', function() {
    alert('delete something');
});

div.container - это div внутри диалога.Я также пытался использовать body и document в качестве контейнера, тот же эффект.

Вот полный код

Это своего рода работа, но она не привязывается к селектору классов .delete, а привязывается ко всей строке.

function ClientTierDialog_class() {
    var self = this;

    this.fDialogBehavior = function(dialog) {
        $(dialog).find("a.button").unbind("click").bind("click", function(e) {

            if ($(this).hasClass("cancelButton")) {
                $(dialog).dialog("close");
            }
            else if ($(this).hasClass("okButton")) {
                self.saveTier();
            }
        });
    };

    this.$dialog = null;

    this.baseOptions = {
        id: "TierDialog",
        width: 585,
        height: 600,
        className: "tier-dialog",
        header: "Create Tier",
        body: "",
        buttonText: {
            cancel: "Close",
            ok: "Save"
        },
        resizable: false,
        modal: true,
        fDialogBehavior: this.fDialogBehavior
    };
}

/***************************************************************
* Events
***************************************************************/

ClientTierDialog_class.prototype.openDialog = function(options) {
    var self = this;
    var tierName = options.tierName;
    var url = "Administration/GetClientTierDialog";

    this.$dialog = null;

    $.ajax({
        url: url,
        data: options,
        success: function(response) {
            var $content = $(response.html);
            var options = self.baseOptions;

            if (tierName !== undefined && tierName.length > 0) {
                options.header = "Edit Tier";
            }

            options.body = $content;
            WSOD.dialog(options);

            this.$dialog = $("div.tier-dialog");
            self.initEvents();
        },
        error: function() {
            // Handle errors
        }
    });
};

ClientTierDialog_class.prototype.delete = function() {
    $('table#addedFirms tbody tr').delegate('.delete', 'click', function() {
        alert('delete something');
    });
};

ClientTierDialog_class.prototype.initEvents = function() {
    var self = this;
    self.delete();
};

$(document).ready(function() {
    ClientTierDialog = new ClientTierDialog_class();
});

Спасибо.

Ответы [ 3 ]

2 голосов
/ 08 марта 2012

Стандарты JQuery имеют тенденцию к on и off с версией 1.7+:

$('table.standard').on('click', '.delete', function() {
    alert('delete something');
});
1 голос
/ 08 марта 2012

Использование:

$(document).delegate('table.standard tbody td .delete', 'click', function() {
    alert('delete something');
});
0 голосов
/ 08 марта 2012

Трудно убедиться в том, что вы не видите больше вашего кода, но может случиться так, что вы добавляете делегата до инициализации диалога или до появления элемента div.content. Если это так, то div.container может не существовать и, следовательно, не будет связан.

Попробуйте это: http://jsbin.com/itiyel/4/edit#preview

Кажется, это работает, и, возможно, это поможет вам.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...