Pregunta

Estoy usando asp.net webGrid en el que tengo dos botones que abren el mismo cuadro de diálogo (con contenido diferente) y un cuadro de diálogo que se supone que se abre solo cuando se hace clic en la fila actual (no al hacer clic en un botón).Tengo esto if else que verifica si el elemento en el que se hizo clic es un botón o no.

El problema es que esto funciona bien la primera vez después de cargar la página.Si hago clic solo en los botones, se abre el cuadro de diálogo correcto.Pero después de hacer clic en una fila por primera vez, los clics en los botones ahora abren ambos cuadros de diálogo a la vez.

Aquí está el código,

$('#grid').click(function(e){
    if($(e.target).is(':button'))
    {
        $('.edit-db').live('click', function () {
            $.getJSON('/Methods/dbQuery/' + $(this).attr('id'), function (data) {
                var lista = data;
                $('#edit-id').val(lista.id);
                $('#edit-nimi').val(lista.nimi);
                $('#edit-ip').val(lista.ip);
            });
            $('#action-type').val('edit');
            tyyppi = 'edit';
            $("#edit").show();
            $("#delete").hide();
            $('#dialog-edit').dialog('open');
        });

        $('.delete-row').live('click', function () {
            $.getJSON('/Methods/dbQuery/' + $(this).attr('id'), function (data) {
                var lista = data;
                $('#edit-id').val(lista.id);
            });
            $('#action-type').val('delete');
            $("#edit").hide();
            $("#delete").show();
            $('#dialog-edit').dialog('open');
        });
    }
    else
    {
        $('tbody tr').live('hover', function () {
            id = $(this).find('td:first').text();
            $(this).toggleClass('clickable');
        }).live('click', function () {
            $("#devInfo").load("deviceInfo.cshtml/" + id).dialog('open');
        });
    }
});
¿Fue útil?

Solución

No necesita el controlador de clic alrededor del live() llamadas a métodos.Porque tienes uno, el live() se establece repetidamente en esos elementos después de cada clic.

El is(':button') el cheque es redundante como tr El elemento nunca puede ser un botón de todos modos.

También, live() ha quedado en desuso.Si estás usando jQuery 1.7+ deberías usar on(), de lo contrario deberías usar delegate().

Prueba esto:

$('#grid').delegate('.edit-db', 'click', function (e) {
    e.stopPropagation();
    $.getJSON('/Methods/dbQuery/' + $(this).attr('id'), function (data) {
        var lista = data;
        $('#edit-id').val(lista.id);
        $('#edit-nimi').val(lista.nimi);
        $('#edit-ip').val(lista.ip);
    });
    $('#action-type').val('edit');
    tyyppi = 'edit';
    $("#edit").show();
    $("#delete").hide();
    $('#dialog-edit').dialog('open');
});
.delegate('.delete-row', 'click', function (e) {
    e.stopPropagation();
    $.getJSON('/Methods/dbQuery/' + $(this).attr('id'), function (data) {
        var lista = data;
        $('#edit-id').val(lista.id);
    });
    $('#action-type').val('delete');
    $("#edit").hide();
    $("#delete").show();
    $('#dialog-edit').dialog('open');
});
.delegate('tbody tr', 'hover', function () {
    id = $(this).find('td:first').text();
    $(this).toggleClass('clickable');
})
.delegate('tbody tr', 'click', function () {
    $("#devInfo").load("deviceInfo.cshtml/" + id).dialog('open');
});
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top