jQuery Retire LI de UL con un hipervínculo en LI

3 minutos de lectura

avatar de usuario
Jon

Tengo una lista desordenada:

<ul id="sortable">
  <li id="1" class="ui-state-default">First <a href="#" title="delete" class="itemDelete">x</a></li>
  <li id="2" class="ui-state-default">Second <a href="#" title="delete" class="itemDelete">x</a></li>
  <li id="3" class="ui-state-default">Third <a href="#" title="delete" class="itemDelete">x</a></li>
</ul>

quiero quitar el <li> desde el <ul>. He manejado el evento de clic del elemento de clase Eliminar donde trato de eliminar, pero asumo que no funciona porque no puedo eliminar el <li> como lo llama un niño?

$('.itemDelete').live("click", function() {
            var id = $(this).parent().get(0).id;


            $("#" + id).remove();

        });

¿Cuál es el mejor enfoque?

  • Sus identificaciones no son válidas: las identificaciones no pueden comenzar con dígitos

    – Greg

    13 de julio de 2009 a las 14:56

  • @Jon tu pregunta me ayuda mucho

    – William Kinan

    15 mayo 2012 a las 16:29

avatar de usuario
Blixt

Suponiendo que está utilizando una versión reciente de jQuery:

$('#sortable').on('click', '.itemDelete', function() {
    $(this).closest('li').remove();
});

closest es un poco más dinámico que parent (a pesar de que parent funciona aquí también.) Obtiene el li que está más cerca del elemento actual, hacia arriba en la estructura.

En realidad, la forma en que lo tienes a partir de ahora, id va a ser indefinido, porque ninguno de los li tiene id.

¿Por qué no simplemente hacer

$(this).parent().remove()

Además, no te olvides de devolver falso.

  • tengo identificaciones olvidadas de pegarlas en la publicación original

    – Jon

    13 de julio de 2009 a las 14:55

No tienes identificaciones en tu <li>s

¿Qué tal simplemente

$(this).parent().remove();

avatar de usuario
Gene

Lo que terminó funcionando para mí: prefije sus atributos de identificación con una cadena o un guión bajo (como han señalado otros)

Dado que los marcos como jQuery Mobile requieren que las identificaciones sean únicas en todas las páginas (no solo en una página), prefijo el nombre de la página, un guión bajo y la identificación numérica que me permite acceder a los registros en una base de datos.

En lugar de enlazar a una clase o al control ul, use ‘on’ para enlazar a li de la lista principal:

    $('#sortable').on('dblclick', 'li'  function() {
        aval = $(this).attr('id').match(/\d+/g); // only want the numbers...
        id = aval[0];
        name = $(this).text(); // in case you need these for a post...
        li = $(this); // so we can remove it from the list after the 'this' object changes inside the ajax call...
        // make an ajax call to the server
        var jqxhr = $.post( "somepage.php", {name: name, id: id},
            function(data) {
            li.remove();
            $("#sortable").listview("refresh");
    },'json').fail(function() { alert("error"); });
    return false;   // preventDefault doesn't seem to work as well...
});

También podría estar buscando el índice de los elementos con evento

$('#sortable').on('click', '.itemDelete', function(e) {
    e.preventDefault();
    $(e.target.parentElement).parent()[0].remove();
});

¿Ha sido útil esta solución?