Foros del Web » Programando para Internet » Jquery »

[SOLUCIONADO] Problema con AJAX y manejo de Javascript

Estas en el tema de Problema con AJAX y manejo de Javascript en el foro de Jquery en Foros del Web. Hola! Bueno, estoy haciendo una web, en el index.php cargo en un div otra página mediante ajax, utilizo pushstate para que al refrescar la página ...
  #1 (permalink)  
Antiguo 27/08/2015, 17:16
 
Fecha de Ingreso: agosto-2015
Mensajes: 7
Antigüedad: 9 años, 2 meses
Puntos: 0
Problema con AJAX y manejo de Javascript

Hola! Bueno, estoy haciendo una web, en el index.php cargo en un div otra página mediante ajax, utilizo pushstate para que al refrescar la página o retroceder en el navegador funcione de manera correcta. Hasta aquí todo bien, el problema viene que el código javascript no me funciona bien en la página cargada con ajax.

En mi index.php tengo un menú con el cual cargo en un div otras páginas:
Código PHP:
<div class="menuVert">
   <span class='post-labels'>
        <b:if cond='data:post.labels'>
          <b:loop values='data:post.labels' var='label'>
               <a href='#' class="ajax" data-page="home">Inicio</a>
          </b:loop>
        </b:if>
   </span>
  <hr id="lineH">
   <span class='post-labels'>
        <b:if cond='data:post.labels'>
          <b:loop values='data:post.labels' var='label'>
               <a href='#' class="ajax" data-page="perfiles">Mi Perfil</a>
          </b:loop>
      </b:if>
   </span>    
  <hr id="lineH">
  <span class='post-labels'>
      <b:if cond='data:post.labels'>
        <b:loop values='data:post.labels' var='label'>
            <a href='#' class="ajax" data-page="publicaciones">Publicaciones</a>
        </b:loop>
      </b:if>
  </span>
  <hr id="lineH">
   <span class='post-labels'>
        <b:if cond='data:post.labels'>
          <b:loop values='data:post.labels' var='label'>
               <a href='#' class="ajax" data-page="foro">Foro de ayuda</a>
          </b:loop>
        </b:if>
   </span>
  <hr id="lineH">
  <span class='post-labels'>
      <b:if cond='data:post.labels'>
        <b:loop values='data:post.labels' var='label'>
            <a href='#' class="ajax" data-page="encuesta">Encuestas</a>
        </b:loop>
      </b:if>
  </span>
  <hr id="lineH">   
<script type="text/javascript">
//CARGAR PAGINA CON AJAX-------------------------------------
   if (window.location.hash) {
        loadPartial(window.location.hash.replace("#", ""));
    }
    window.onpopstate = function(evt) {
        if (evt.state && evt.state.page) {
            loadPartial(evt.state.page);
        }
    }
    var anchors = document.getElementsByClassName("ajax");
    for (var i = 0;i < anchors.length;i++) {

        anchors[i].onclick = function() {
            var page = this.getAttribute("data-page");
            loadPartial(page);
            return false;
        }
    }
    function loadPartial(page,add) {
        xhr = new XMLHttpRequest();
        xhr.open("GET", '' +  page + ".php");
        history.pushState({page: page}, page.toUpperCase(), "#" +page );
        xhr.onreadystatechange = function() {
//para poder cargar el javascript de la página que se va a cargar utilizo este código (no se si aquí puede que este el error):
            var scs= xhr.responseText.extractScript(); //extraemos los srcipts        
            document.getElementsByClassName("publicacion")[0].innerHTML = xhr.responseText; //eliminamos lo innecesario
        scs.evalScript(); //interpretamos todo
            }
        xhr.send();
    }
</script>
</div>
<div id="publicacion" class="publicacion">
<?php    include('home.php');
?>
</div>
esta es una de las páginas que cargo con ajax:

home.php
Código PHP:
<?php
session_start
();
$ultimo=$_GET['ultimo'];
   
$flag=$_GET['flag'];
   require.........

if(
$flag!="recargar"){
   ........

   
?>
<script type="text/javascript">
//----------MENU opciones ------------------------------
$(document).ready(function(){
            $('.menuOp').fixedMenu();
        });
//-----------------FIN-----------------------

$(document).ready(function(){   
var flag=0;
//Función principal         
function recarga(num) 
{
flag++;      
if (flag==1) {
//Adquiere como parámetro la id del último class datos y carga la imagen animada
$('#cargador').html('<img id="loading" src="imagenes/cargando.gif">');
$.get("home.php?flag=recargar&ultimo="+num,function(conmutador){
   flag=0;
   var respuesta=conmutador.length;
   var numero="<?php echo $numero ?>";
//El número de caracteres de la última petición son 20. Se utiliza para detectar que ya no hay más resultados.
   if(num<numero){
      if (respuesta>10) {
         $(".datos:last").after(conmutador).delay(1000);         
      }else {
         $('#cargador').empty();
      }                           
   }else{
      $('#cargador').empty();
   }
   });
}else {
   flag=0;
}
};
// Función que calcula donde se encuentra el scroll. Si se encuentra en la parte inferior llama a la función recarga y le envía el parámetro num       
$(window).scroll(function(){
if  ($(window).scrollTop() == $(document).height() - $(window).height()){
   var num=$(".datos:last").attr("id");
                                       
   recarga(num);
                     
   }
});       
});

</script>
<div id="publicar">
<? include "publicacion.php"?>
</div>
<?php
$sql
="SELECT * FROM........
while ($fila = mysql_fetch_array($Lista)) {
   
      $menu = "
<div class='menuOp'><ul><li><a><div class='imgOp'></div></a>";  
               $menu .= "
<ul><li><a href='#'>Editar publicaci&oacute;n</a></li><li><a href='eliminar.php?elemento=$idPerfil' class='eliminar'>eliminar publicaci&oacute;n</a></li>";  
             $menu .= "
<li><a href='#'>Ir a mis Publicaciones</a></li><li><a href='#''>Ayuda</a></li></ul></li></ul></div>";                             
   
    echo "<div id='".$num."' class='
datos'><div id='headPub'><img id='imgUsPub' src='".$FotoUs."'><b>$Usuario</b> ha publicado:</div>";
      echo $menu;    
      echo "<textarea id='
txtPublic' readonly>$Publicacion</textarea><br><br><img src='uploads/redimensiones/$foto'></div>";

}                  
?>
<div id="cargador"></div>
<?php
mysql_close();
}else{
while ($fila = mysql_fetch_array($Lista)) {
   $ultimo=$_GET['
ultimo'];
   $ultimo=$ultimo+1;
   $sql="SELECT * FROM........

         $menu = "<div class='
menuOp'><ul><li><a><div class='imgOp'></div></a>";  
                  $menu .= "<ul><li><a href='
#'>Editar publicaci&oacute;n</a></li><li><a href='eliminar.php?elemento=$idPerfil' class='eliminar'>eliminar publicaci&oacute;n</a></li>";  
                
$menu .= "<li><a href='#'>Ir a mis Publicaciones</a></li><li><a href='#''>Ayuda</a></li></ul></li></ul></div>";                             
    }else if(
$foto!="" &&  $Publicacion!=""){
         echo 
"<div id='".$num."' class='datos'><div id='headPub'><img id='imgUsPub' src='".$FotoUs."'><b>$Usuario</b> ha publicado:</div>";
                  echo 
$menu;    
         echo 
"<textarea id='txtPublic' readonly>$Publicacion</textarea><br><br><img src='uploads/redimensiones/$foto'></div>";
   
   
$ultimo++;
   }
mysql_close();
}
?>
Como ven en home.php cargo una lista desde una base de datos, y utilizo javascript y php para cargar la lista cada 10 filas mientras baja el scroll. Los problemas que se me presentan son:
1. por cada fila que cargo hay un menú despegable (class= 'menuOP') que funciona con javascript, al cargar la página funciona todo bien, cuando bajo con el scroll y carga las 10 siguientes filas no se puede desplegar el menú de estos, supongo que el código javascript no funciona o es que se duplica, no tengo idea.
2. Cuando cargo otra página después de otra mediante el menú principal (class='menuVert') las 10 1ras filas cargan normal y funcionan sus menús, pero si bajo el scroll y cargo 10 más estas no funcionan sus menús y las últimas filas que cargan salen duplicadas. Esto no me sucedía hasta que modifiqué el código Ajax para que funcione el javascript de las páginas cargadas.
  #2 (permalink)  
Antiguo 27/08/2015, 19:56
Avatar de siddartha23  
Fecha de Ingreso: septiembre-2013
Mensajes: 357
Antigüedad: 11 años, 2 meses
Puntos: 39
Respuesta: Problema con AJAX y manejo de Javascript

Tal vez el problema es por que estás cargando nuevos objetos con ajax y estos no tienen asignada la función que quieres que realizen. Para solucionar esto tienes que delegar la función a un elemento que esté presente desde la carga inicial del DOM...
__________________
velarde23.com - Soluciones Web
  #3 (permalink)  
Antiguo 28/08/2015, 09:56
 
Fecha de Ingreso: agosto-2015
Mensajes: 7
Antigüedad: 9 años, 2 meses
Puntos: 0
Respuesta: Problema con AJAX y manejo de Javascript

Perdón, pero recién estoy iniciándome en esto, y como haría eso?
  #4 (permalink)  
Antiguo 28/08/2015, 22:07
Avatar de Alexis88
Philosopher
 
Fecha de Ingreso: noviembre-2011
Ubicación: Tacna, Perú
Mensajes: 5.552
Antigüedad: 13 años
Puntos: 977
Respuesta: Problema con AJAX y manejo de Javascript

Esto te ayudará.

Un saludo
__________________
«Juro por mi vida y mi amor por ella, que jamás viviré para el provecho de otro hombre, ni le pediré a otro hombre que viva para el mío».

Ayn Rand
  #5 (permalink)  
Antiguo 30/08/2015, 11:44
 
Fecha de Ingreso: agosto-2015
Mensajes: 7
Antigüedad: 9 años, 2 meses
Puntos: 0
Respuesta: Problema con AJAX y manejo de Javascript

vale, lo revisaré!
  #6 (permalink)  
Antiguo 03/09/2015, 12:35
 
Fecha de Ingreso: agosto-2015
Mensajes: 7
Antigüedad: 9 años, 2 meses
Puntos: 0
Respuesta: Problema con AJAX y manejo de Javascript

Aún no he podido solucionarlo, lo subí a un server, aquí dejo el link espero me puedan ayudar a encontrar el error
http://pyrsafety.com/pruebaint/index.php

entrar con
usuario = angel
contraseña = 123

Última edición por cuervo777; 03/09/2015 a las 12:40
  #7 (permalink)  
Antiguo 04/09/2015, 22:37
 
Fecha de Ingreso: agosto-2015
Mensajes: 7
Antigüedad: 9 años, 2 meses
Puntos: 0
Respuesta: Problema con AJAX y manejo de Javascript

Opte por modificar la parte con la que cargo la pagina en el div:
Código Javascript:
Ver original
  1. function loadPartial(page,add) {
  2.         xhr = new XMLHttpRequest();
  3.         xhr.open("GET", '' +  page + ".php", true);
  4.         history.pushState({page: page}, page.toUpperCase(), "#" +page );
  5.         xhr.onreadystatechange = function() {
  6.             document.getElementsByClassName("publicacion")[0].innerHTML = xhr.responseText;
  7.             }
  8.         xhr.send();
  9.     }

y ejecutar mis funciones javascript desde el index.php con addEventListener,

Código Javascript:
Ver original
  1. window.addEventListener("click", function(event){
  2.     if (event.target.className == "imgOp") {
  3.             $('.menuOp').fixedMenu();                        
  4.         }
  5.         });
ahora el problema es que funciona mi javascript pero haciendo doble click, como evito eso?
  #8 (permalink)  
Antiguo 05/09/2015, 00:32
Avatar de Alexis88
Philosopher
 
Fecha de Ingreso: noviembre-2011
Ubicación: Tacna, Perú
Mensajes: 5.552
Antigüedad: 13 años
Puntos: 977
Respuesta: Problema con AJAX y manejo de Javascript

¿No habrá otra parte en tu código en donde interactúes con esos elementos y por eso necesites darles dos clics para que funcionen? Porque, así como lo muestras, con un clic bastaría.
__________________
«Juro por mi vida y mi amor por ella, que jamás viviré para el provecho de otro hombre, ni le pediré a otro hombre que viva para el mío».

Ayn Rand
  #9 (permalink)  
Antiguo 05/09/2015, 11:28
 
Fecha de Ingreso: agosto-2015
Mensajes: 7
Antigüedad: 9 años, 2 meses
Puntos: 0
Respuesta: Problema con AJAX y manejo de Javascript

Verás, hago referencia a la función fixedMenu() el cual es el siguiente:

Código Javascript:
Ver original
  1. (function($){
  2.     $.fn.fixedMenu=function(){
  3.         return this.each(function(){
  4.             var linkClicked= false;
  5.             var menu= $(this);
  6.             $('body').bind('click',function(){
  7.            
  8.                     if(menu.find('.active').size()>0 && !linkClicked)
  9.                     {
  10.                         menu.find('.active').removeClass('active');
  11.                     }
  12.                     else
  13.                     {
  14.                         linkClicked = false;
  15.                     }
  16.             });
  17.            
  18.             menu.find('ul li > a').bind('click',function(){
  19.                 linkClicked = true;
  20.                 if ($(this).parent().hasClass('active')){
  21.                     $(this).parent().removeClass('active');
  22.                 }
  23.                 else{
  24.                     $(this).parent().parent().find('.active').removeClass('active');
  25.                     $(this).parent().addClass('active');
  26.                 }
  27.             })
  28.         });
  29.     }
  30. })(jQuery);

me he dado cuenta que pasa por lo que dices, pero no se como solucionarlo
  #10 (permalink)  
Antiguo 05/09/2015, 20:35
Avatar de Alexis88
Philosopher
 
Fecha de Ingreso: noviembre-2011
Ubicación: Tacna, Perú
Mensajes: 5.552
Antigüedad: 13 años
Puntos: 977
Respuesta: Problema con AJAX y manejo de Javascript

Se me ocurre que apliques el código anterior dentro de dicho método, es decir, añadirías esto:

Código Javascript:
Ver original
  1. if (event.target.className == "imgOp"){
  2.     $('.menuOp').fixedMenu();                        
  3. }

Y, en la llamada al método, indicarías al objeto del evento:

Código Javascript:
Ver original
  1. $('body').bind('click', function(event){
  2.     //...
  3. });

Saludos
__________________
«Juro por mi vida y mi amor por ella, que jamás viviré para el provecho de otro hombre, ni le pediré a otro hombre que viva para el mío».

Ayn Rand
  #11 (permalink)  
Antiguo 06/09/2015, 19:58
 
Fecha de Ingreso: agosto-2015
Mensajes: 7
Antigüedad: 9 años, 2 meses
Puntos: 0
Respuesta: Problema con AJAX y manejo de Javascript

Creo que he estado exagerando con el uso de ajax, me trae muchos problemas cuando quiero cargar una página que tiene bastante javascript, creo que lo usaré en casos más simples. De todas maneras gracias Alexis88 por tu tiempo y ayuda!!

Etiquetas: ajax, javascript, javascript-funciones, php+ajax
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 15:43.