Comunidad de diseño web y desarrollo en internet online

Problema con AJAX y manejo de Javascript

Citar            
MensajeEscrito el 26 Ago 2015 03:51 am
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.

A ver, seré más específico. Este es el código de mi index.php:

Código PHP :

<html>
<head>   
<title></title>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<meta name="viewport" content="width=device-width, user-scalable=no, initial-escale=1.0, maximun-scale=1.0, minimum-scale=1.0">
<script type="text/javascript" src="js/jquery-1.5.min.js"></script>
<script type="text/javascript" src="interpretadorAjax.js"></script>
<script type="text/javascript" src="js/jquery.fixedMenu.js"></script>
<script type="text/javascript" src="js/function.js"></script>
<script type="text/javascript" src="js/autosize.js"></script>
<link rel="stylesheet" type="text/css" href="fixedMenu_style2.css" />         
<link href="style.css" rel="stylesheet" type="text/css">
<script type="text/javascript">
//----------MENU DE SESSION-------------
   $(document).ready(function(){
            $('.menull').fixedMenu();
        });
</script>
</head>
<body>
<center>
<header id="head">
<div id="title1"><h1>AQUI VA EL TITULO</h1></div>                  
<div id="login">
<div id='User'><div class="userlink"><img class="imgUser" src="<?php echo $FotoUsActive; ?>"><?php   echo $UserSession; ?></div>   
<div class="menull">
   <ul>
      <li>
         <a><div class="imgCon"></div></a>                
         <ul>
             <li><a href="#">Configuracion de cuenta</a></li>
                          <li><a href="#">Mi Perfil</a></li>
                          <li><a href="logout.php">Cerrar session</a></li>
                          <li><a href="#">Ayuda</a></li>
                   </ul>
               </li>
        </ul>
</div>
</div>
</div>
</header>
<div id="cuerpoInd">
<div id="menu"><div id="menuCon">
<?php //include('menu.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">
     <span class='post-labels'>
        <b:if cond='data:post.labels'>
          <b:loop values='data:post.labels' var='label'>
               <a href='#' class="ajax" data-page="comunidad">Comunidad</a>
          </b:loop>
        </b:if>
   </span>
</div>
<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() {
            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>
<div id="contenido">
<div id="publicacion" class="publicacion">
<?php    include('home.php');
?>
</div>
</div>               
<div id="news">
</div>   
</div>            
<div id="chat">
<?php
include('chat.php');
?>               
</div>                        
<script>
autosize(document.querySelectorAll('textarea'));
</script>
<?php   
}
?>
   </center>
      </body>
   </html>


para poder cargar el javascript de la página que se va a cargar utilizo este código:

Código Javascript :

  var scs= xhr.responseText.extractScript(); //extraemos los srcipts        
            document.getElementsByClassName("publicacion")[0].innerHTML = xhr.responseText; //eliminamos lo innecesario
        scs.evalScript(); //interpretamos todo
            }


esta es una de las páginas que cargo con ajax:

Código PHP :

<?php
session_start();
$ultimo=$_GET['ultimo'];
   $flag=$_GET['flag'];
   require 'BD.php';
   include('conDB.php');
   include("file_type.php");
   $idUserSession = $_SESSION['idUsuario'];
if($flag!="recargar"){
   $sql2="SELECT * FROM perfiles";
   $result = mysql_query($sql2,$conexion);
   $numero = mysql_num_rows($result);
   $numero = $numero -1;
   //mysql_close();
   ?>
<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 usuarios,perfiles WHERE usuarios.idUsuario=perfiles.idUsuario ORDER BY idPerfil DESC LIMIT 0,10";
$Lista= mysql_query($sql,$conexion);
$i=1;
while ($fila = mysql_fetch_array($Lista)) {
   $Usuario = $fila['Usuario'];
   $Publicacion = $fila['Comentario'];
   $foto = $fila['Fotos'];
   $fileName = $fila['File'];
   $imgMostrar = checkFile($fileName);
   $idPerfil = $fila['idPerfil'];
   $num=$i;
   $idUsuari = $fila['idUsuario'];
   $Foto = $fila['FotoUser'];
   $FotoUs = "perfiles/user/".$Foto."";
   //----Mostrar opciones si eres user o no
   if ($idUsuari==$idUserSession) {
      $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{
      $menu = "<div class='menuOp'><ul><li><a><div class='imgOp'></div></a>";  
               $menu .= "<ul><li><a href='#'>Ver publicaciones del contacto</a></li><li><a href='eliminar.php?elemento='>Acerca del contacto</a></li>";  
             $menu .= "<li><a href='#'></a></li><li><a href='#''>Ayuda</a></li></ul></li></ul></div>";                                
   }
                     
   if($foto=="" &&  $fileName==""){
      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></div>";
//foto y comentario 
   }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>";
//si solo hay foto
   }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 "<img src='uploads/redimensiones/$foto'></div>";
//si hay archivo y comentario
   }else if($fileName!="" && $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><a alt='Descargar' href='download.php?file=$fileName'><img id='imgfile' src='$imgMostrar'></a><div>$fileName</div></div>";
   }   
$i++;         
}                  
?>
<div id="cargador"></div>
<?php
mysql_close();
}else{
   $ultimo=$_GET['ultimo'];
   $ultimo=$ultimo+1;
   $sql="SELECT * FROM usuarios,perfiles WHERE usuarios.idUsuario=perfiles.idUsuario ORDER BY idPerfil DESC LIMIT $ultimo,10";
   $Lista= mysql_query($sql,$conexion);                        
   while ($fila = mysql_fetch_array($Lista)) {
      $Usuario = $fila['Usuario'];
      $Publicacion = $fila['Comentario'];
      $foto = $fila['Fotos'];
      $fileName = $fila['File'];
      $imgMostrar = checkFile($fileName);
      $idPerfil = $fila['idPerfil'];
      $idUsuari = $fila['idUsuario'];
      $Foto = $fila['FotoUser'];
      $FotoUs = "perfiles/user/".$Foto."";
      $num=$ultimo;
      if ($idUsuari==$idUserSession) {
         $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{
         $menu = "<div class='menuOp'><ul><li><a><div class='imgOp'></div></a>";  
                  $menu .= "<ul><li><a href='#'>Ver publicaciones del contacto</a></li><li><a href='eliminar.php?elemento='>Acerca del contacto</a></li>";  
                $menu .= "<li><a href='#'></a></li><li><a href='#''>Ayuda</a></li></ul></li></ul></div>";                                
      }
      if($foto=="" &&  $fileName==""){
         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></div>";
   //foto y comentario 
      }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>";
   //si solo hay foto
      }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 "<img src='uploads/redimensiones/$foto'></div>";
   //si hay archivo y comentario
      }else if($fileName!="" && $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><a alt='Descargar' href='download.php?file=$fileName'><img id='imgfile' src='$imgMostrar'></a><div>$fileName</div></div>";
      }   
   $ultimo++;
   }
mysql_close();
}
?>
<script type="text/javascript"> 
$('.eliminar').click(function(event){
    //event.preventDefault();
    return confirm("¿Realmente desea eliminar esta publicación?");
 });
</script>


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.

No se si el problema es que los scripts se estan duplicando y almacenando mientras cargo más cosas no se me ocurre otra, ahora como lo soluciono, si alguien me ayuda se lo agradecería. Y perdón por lo grande de la publicación pero deseo ser lo más detallado para que no queden dudas.

Por angelcrow7

3 de clabLevel



 

chrome
Citar            
MensajeEscrito el 26 Ago 2015 12:33 pm
Usa el debugger del navegador. En chrome es control + shift + i. Así puedes seguirle el flujo a la ejecución del sitio y ver los errores de JS que pueda haber.

Por DriverOp

Claber

2510 de clabLevel



 

chrome
Citar            
MensajeEscrito el 26 Ago 2015 06:57 pm
No estoy seguro de saber usarlo, intentaré.

Por angelcrow7

3 de clabLevel



 

chrome
Citar            
MensajeEscrito el 27 Ago 2015 03:57 pm
alguien tiene alguna idea?

Por angelcrow7

3 de clabLevel



 

chrome
Citar            
MensajeEscrito el 28 Ago 2015 12:17 pm
¿Por qué no mejor pones todo esto en un servidor que podamos acceder y así lo depuramos nosotros mismos?.

Por DriverOp

Claber

2510 de clabLevel



 

chrome
Citar            
MensajeEscrito el 30 Ago 2015 05:42 pm
Vale, lo subiré y comparto el link!

Por angelcrow7

3 de clabLevel



 

chrome
Citar            
MensajeEscrito el 03 Sep 2015 06:35 pm
Bueno subí a un server, aquí dejo el link!

http://pyrsafety.com/pruebaint/index.php

espero me puedan ayudar!! gracias!

entrar con:
usuario: angel
contraseña: 123

Por angelcrow7

3 de clabLevel



 

chrome
Citar            
MensajeEscrito el 05 Sep 2015 04:39 am
Opte por modificar la parte con la que cargo la pagina en el div:

Código Javascript :

function loadPartial(page,add) {
        xhr = new XMLHttpRequest();
        xhr.open("GET", '' +  page + ".php", true);
        history.pushState({page: page}, page.toUpperCase(), "#" +page );
        xhr.onreadystatechange = function() {
            document.getElementsByClassName("publicacion")[0].innerHTML = xhr.responseText;
            }
        xhr.send();
    }


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

Código Javascript :

window.addEventListener("click", function(event){
    if (event.target.className == "imgOp") {
            $('.menuOp').fixedMenu();                        
        }
        });


ahora el problema es que funciona mi javascript pero haciendo doble click, como evito eso?

Por angelcrow7

3 de clabLevel



 

chrome
Citar            
MensajeEscrito el 10 Sep 2015 06:59 pm
agrupa las funciones de window.addEvenListener en una función

y despues ejecuta esa función al estar cargado el body :)

<body onload="funcionInicializadora()">

o checa esta respuesta donde te indican como inicializar tus scripts:

http://stackoverflow.com/a/9899701

Por elporfirio

Claber

652 de clabLevel

1 tutorial

Genero:Masculino  

FullStack Web Developer

chrome

 

Cristalab BabyBlue v4 + V4 © 2011 Cristalab
Powered by ClabEngines v4, HTML5, love and ponies.