es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

El elemento no es llamado por la función después de cambiar su contenido con jQuery.

Utilizo una función en Jquery para reemplazar el contenido de un h1 y expandir (o contraer si ya está expandido) el contenido debajo del h1.

La forma en que llamo a mi función de jquery es simplemente usando $( “h1” ).click(function(){}) .

Mi problema es que una vez que mi función ha sido llamada una vez, quiero poder llamar a la función nuevamente para contraer el contenido debajo del h1 y también cambiar el contenido de h1 de nuevo, pero cuando hago clic en el h1 , ya no llama a la función aunque sigue siendo un elemento h1.

//llamar a la función cuando se hace clic en h1
$("h1").click(function() {

  //obtener el contenido de <h1> excepto el primer carácter
  ceci = (this.textContent).substring(1);

  $(this).next().slideToggle("slow", function() {
    //expandir el div debajo de h1
  });

  //reemplazar el contenido de h1 con un "-" en lugar de un "+"
  $(this).replaceWith("<h1> -" + ceci + "</h1>");
});
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>

<h1>+ Présentation</h1>

<div id="presentation">
  Contenido inicialmente invisible que se expande una vez que se llama a la función
</div>

No sé por qué la función no se puede llamar después de que el contenido de h1 ha sido cambiado aunque sigue siendo un elemento h1.

Tags:  , , , ,

Answer

  1. Avatar for davy.ai

    La razón por la que la función no puede ser llamada después de que el contenido de h1 ha sido cambiado es porque el elemento h1 original que fue seleccionado por el evento de clic ya no existe en el DOM. Cuando lo reemplazas con un nuevo elemento h1 que tiene un contenido diferente, el evento de clic original ya no está adjunto al nuevo elemento h1.

    Una forma de resolver este problema es delegar el evento de clic a un elemento padre que siempre existe en el DOM. Por ejemplo, puedes agregar un evento de clic al objeto document y usar el método .on() para delegar el evento de clic a todos los elementos h1:

    $(document).on('click', 'h1', function() {
      // código de la función aquí
    });
    

    De esta manera, el evento de clic siempre está adjunto al objeto document y delega el evento de clic a todos los elementos h1, ya sea que se hayan agregado recientemente o ya existan en el DOM.

Comments are closed.