Saltar al contenido

jQuery no funciona después de cargar el contenido a través de AJAX

Esta es el arreglo más completa que encomtrarás brindar, sin embargo estúdiala pausadamente y valora si es compatible a tu proyecto.

Solución:

Los selectores de jQuery seleccionan elementos coincidentes que existen en el DOM cuando se ejecuta el código y no se actualizan dinámicamente. Cuando llamas a una función, como .hover() para agregar controladores de eventos, solo los agrega a esos elementos. Cuando realiza una llamada AJAX y reemplaza una sección de su página, está eliminando esos elementos con los controladores de eventos vinculados a ellos y reemplazándolos con nuevos elementos. Incluso si esos elementos ahora coincidieran con ese selector, no obtienen el controlador de eventos vinculado porque el código para hacerlo ya se ejecutó.

Controladores de eventos

Específicamente para controladores de eventos (es decir, .click()) puede usar la delegación de eventos para evitar esto. El principio básico es vincular un controlador de eventos a un static (existe cuando se carga la página, nunca se reemplaza) elemento que contendrá todo su contenido dinámico (AJAX cargado). Puede leer más sobre la delegación de eventos en la documentación de jQuery.

Para tu click controlador de eventos, el código actualizado se vería así:

$(document).on('click', "#click", function () 
    $('#click').css(
        "background-color": "#f00",
        "color": "#fff",
        "cursor": "inherit"
    ).text("Open this window again and this message will still be here.");
    return false;
);

Eso vincularía un controlador de eventos a todo el documento (por lo que nunca se eliminará hasta que se descargue la página), que reaccionará a click eventos en un elemento con el id propiedad de click. Idealmente, usaría algo más cercano a sus elementos dinámicos en el DOM (quizás un

en su página que siempre está ahí y contiene todo el contenido de su página), ya que eso mejorará un poco la eficiencia.

El problema surge cuando necesitas manejar .hover(), aunque. no hay real hover evento en JavaScript, jQuery solo proporciona esa función como una abreviatura conveniente para vincular los controladores de eventos al mouseenter y mouseleave eventos. Sin embargo, puede utilizar la delegación de eventos:

$(document).on(
    mouseenter: function () 
        $(this).stop().animate(
            width: xwidth * 3,
            height: xheight * 3,
            margin: -(xwidth / 3)
        , 200); //END FUNCTION

        $(this).addClass('image-popout-shadow');
    ,
    mouseleave: function () 
        $(this).stop().animate(
            width: xwidth,
            height: xheight,
            margin: 0
        , 200, function () 
            $(this).removeClass('image-popout-shadow');
        ); //END FUNCTION

    
, '.image-popout img');

Complementos de jQuery

Eso cubre los enlaces del controlador de eventos. Sin embargo, eso no es todo lo que estás haciendo. También inicializa un complemento jQuery (caja de colores), y no hay forma de delegar eso a los elementos. Vas a tener que simplemente llamar a esas líneas nuevamente cuando hayas cargado tu contenido AJAX; la forma más sencilla sería moverlos a una función con nombre separada que luego puede llamar en ambos lugares (en la carga de la página y en sus solicitudes AJAX success llamar de vuelta):

function initialiseColorbox() 
    $(".iframe").colorbox(
        iframe: true,
        width: "1000px",
        height: "500px"
    );
    $(".inline").colorbox(
        inline: true,
        width: "50%"
    );
    $(".callbacks").colorbox(
        onOpen: function () 
            alert('onOpen: colorbox is about to open');
        ,
        onLoad: function () 
            alert('onLoad: colorbox has started to load the targeted content');
        ,
        onComplete: function () 
            alert('onComplete: colorbox has displayed the loaded content');
        ,
        onCleanup: function () 
            alert('onCleanup: colorbox has begun the close process');
        ,
        onClosed: function () 
            alert('onClosed: colorbox has completely closed');
        
    );

Tuve el mismo problema antes de poder encontrar la solución que funcionó para mí. Entonces, si alguien en el futuro puede intentarlo y decirme si fue correcto, ya que todas las soluciones que pude encontrar fueron un poco más complicadas que esto.

Entonces, como dijo Tamer Durgun, también colocaremos su código dentro de ajaxStop, por lo que su código se restablecerá cada vez que ajax complete cualquier evento.

$( document ).ajaxStop(function() 

//your code


Trabajó para mi 🙂

// EXAMPLE FOR JQUERY AJAX COMPLETE FUNC.
$.ajax({
    // get a form template first
    url: "../FPFU/templates/yeni-workout-form.html",
    type: "get",
    success: function(data)
        // insert this template into your container
        $(".content").html(data);
    ,
    error: function()
        alert_fail.removeClass("gizle");
        alert_fail.addClass("goster");
        alert_fail.html("Template getirilemedi.");
    ,
    complete: function()
        // after all done you can manupulate here your new content
        // tinymce yükleme
        tinymce.init(
            selector: '#workout-aciklama'
        );
    

Si estás contento con lo expuesto, tienes la habilidad dejar una noticia acerca de qué le añadirías a este post.

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *