1

En estos momentos estoy haciendo una tabla dinámica con ajax y todo funciona bien.. hasta que en un div ingreso una etiqueta <?php require("nav.php"); ?>, este archivo es un menú genérico; de repente me aparece en la consola de firefox el error:

TypeError: $.ajax is not a function

y la tabla desaparece.

Archivo inventario.php:

<?php 
    session_start();
        require("conexion.php");
        $permiso = $_SESSION['u_tipo'];
        $id_usuario = $_SESSION['id_usuario'];
        if($_SESSION['logged']=='yes')
        { 
?>
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Document</title>
    <script src="js/jquery-3.2.1.min.js"></script>
    <link rel="stylesheet" type="text/css" href="css/bootstrap.css">

    <script type="text/javascript"> 

     $(document).ready(function(){

            function obtener_datos(){
                $.ajax({
                    url: 'mostrar_inventario.php',
                    method: 'POST',
                    data: {permiso: '<?php echo $permiso; ?>'},
                    success: function(data){
                        $('#result').html(data)
                    }
                })
            }

            obtener_datos();

        $(document).on('click','#add',function(){

            var serial = $('#serial_add').text();
            var color = $('#color_add').text();
            var marca = $('#marca_add').text();
            var tipo = $('#tipo_add').text();
            var costo = $('#costo_add').text();
            var estado = $('#estado_add').text();

            $.ajax({
                url: 'insertar.php',
                method: 'POST',
                data: {serial: serial, color: color, marca: marca, tipo: tipo, costo: costo, estado: estado},
                success: function(data){
                    obtener_datos();
                }
            })
        })


        function actualizar_datos(id, texto, columna){
            $.ajax({
                url: 'actualizar.php',
                method: 'POST',
                data: {id: id, texto: texto, columna: columna},
                success: function(data){
                    obtener_datos();
                }
            })
        }

        $(document).on('blur','#nombre_usuario',function(){
            var id = $(this).data('id_usuario');

            var nombre = $(this).text();

            actualizar_datos(id, nombre, 'nombre_users');

        })

        $(document).on('blur','#apellido_usuario',function(){
            var id = $(this).data('id_apellido');

            var apellido = $(this).text();

            actualizar_datos(id, apellido, 'apellido_users');

        })

        $(document).on('click','#Eliminar',function(){

            var id = $(this).data('id_eliminar');
            $.ajax({
                url: 'eliminar.php',
                method: "POST",
                data: {id: id},
                success: function(data){
                    obtener_datos();
                }

            })
        })

     });

    </script>

</head>
<body>
<div>
    <?php 
    require("nav.php");
    ?>
</div>
    <div id="container">
        <div id="result"></div>
    </div>
</body>
<?php
}
else{
    header("location:../index.php");
}
?>
</html>

Archivo nav.php:

<!DOCTYPE html>
<html lang="es">
  <head>
    <!-- Required meta tags -->
    <meta charset="utf-8">
    <meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no">

    <!-- Bootstrap CSS -->
    <link rel="stylesheet" type="text/css" href="css/bootstrap.css">
    <link rel="stylesheet" type="text/css" href="css/font-awesome.min.css">
    <link rel="stylesheet" type="text/css" href="scss/estilos.scss">

  </head>
  <body>
    <section class="bienvenidos">
      <header class="encabezado">
        <div class="container float-right">
          <nav class="navbar navbar-toggleable-md navbar-light bg-faded">
            <button class="navbar-toggler navbar-toggler-right" type="button" data-toggle="collapse" data-target="#navbarTogglerDemo02" aria-controls="navbarTogglerDemo02" aria-expanded="false" aria-label="Toggle navigation">
              <span class="navbar-toggler-icon"></span>
            </button>
            <a class="navbar-brand" href="#">
              <p id="tipo">#tipodeusuario</p>
            </a>
          <div class="collapse navbar-collapse" id="navbarTogglerDemo02">
            <ul class="navbar-nav mr-auto mt-2 mt-md-0">
              <li id="li_perfil" class="nav-item">
                <a class="nav-link" href="perfil.php">
                  <i class="fa fa-id-badge" aria-hidden="true"></i> &nbsp&nbspPerfil 
                </a>
              </li>
              <li id="li_inventario" class="nav-item">
                <a class="nav-link" href="inventario.php"> 
                <i class="fa fa-bicycle" aria-hidden="true"></i> &nbsp&nbspInventario
                </a>
              </li>
              <li id="li_perdidas" class="nav-item">
                <a class="nav-link" href="c_perdidas.php">
                <i class="fa fa-chain-broken" aria-hidden="true"></i> &nbsp&nbspCiclas perdidas
                </a>
              </li>
              <li class="nav-item">
                <a class="nav-link" href="salir.php"> 
                <i class="fa fa-user-times" aria-hidden="true"></i> &nbsp&nbspSalir
                </a>
              </li>
            </ul>
          </div>
          </nav>
        </div>
      </header>
    </section>
    <!-- jQuery first, then Tether, then Bootstrap JS. -->
    <script src="https://code.jquery.com/jquery-3.1.1.slim.min.js" integrity="sha384-A7FZj7v+d/sdmMqp/nOQwliLvUsJfDHW+k9Omg/a/EheAdgtzNs3hpfag6Ed950n" crossorigin="anonymous"></script>
    <script src="https://cdnjs.cloudflare.com/ajax/libs/tether/1.4.0/js/tether.min.js" integrity="sha384-DztdAPBWPRXSA/3eYEEUWrWCy7G5KFbe8fFjk5JAIxUYHKkDx6Qin1DkWx51bBrb" crossorigin="anonymous"></script>
    <script src="https://maxcdn.bootstrapcdn.com/bootstrap/4.0.0-alpha.6/js/bootstrap.min.js" integrity="sha384-vBWWzlZJ8ea9aCX4pEW3rVHjgjt7zpkNpZk+02D9phzyeVkE+jo0ieGizqPLForn" crossorigin="anonymous"></script>
  </body>
</html>

¿Qué puedo hacer?

lois6b
  • 7,419
  • 5
  • 29
  • 50
DianaDiana
  • 105
  • 3
  • 12
  • Es muy probable que al hacer la llamada a `$.ajax({...` todavía la librería jQuery no esté insertada en el documento actual. La insertas aquí: ``, pero debes verificar que tienes tu librería **realmente** en esa dirección, porque de no tenerla ahí, (que es lo que parece), no te va a funcionar. En cuanto a tu archivo `nav.php` veo que es un documento completo HTML, con encabezados y todo. Al incluirlo así tendrás etiquetas repetidas: dos `DOCTYPE` dos etiquetas ``, dos ``, etc, etc... Es decir, `nav.php` no debería ser un HTML completo. – A. Cedano Jun 27 '17 at 15:38
  • Tienes toda la razón!! Al archivo nav.php le quité hasta las referencias a bootstrap y lo dejé en inventario Me has salvado !!! Muchas gracias :) :) – DianaDiana Jun 27 '17 at 15:43
  • Me alegro. Si consideras que la respuesta ha resuelto tu problema, puedes marcarla como solucionada, activando la flecha de cotejo que está a la izquierda, para que la pregunta no quede como sin solucionar. Saludos. – A. Cedano Jun 27 '17 at 16:06

1 Answers1

1

Te diré algunas cosas sobre tu código:

  1. Desde jQuery 3 esta función pasa a ser obsoleta. Y es, creo, la más usada en jQuery:

     $(document).ready(function(){
       ...
    

Puedes irla sustituyendo ya por esta:

     $(function() { ...

Ver al respecto la documentación de jQuery, y la Nota importante de esta respuesta aquí en Stackoverflow.


  1. El mensaje de error: TypeError: $.ajax is not a function indica con claridad que hay un problema con respecto a tus llamadas a ajaxvía jQuery. El cual podría deberse a que:

    a. La librería jQuery no está incluida al momento de hacer la llamada a Ajax. En ese sentido yo revisaría esto:

¿Realmente tienes tu librería jQuery en una carpeta local llamada js? Revisa que la misma sea correcta o bien, incluye la librería oficial, usando el cdn propio de jQuery. ¿Para qué quieres tener un local una librería que puedes incluir sin problema desde su origen?:

<script   src="https://code.jquery.com/jquery-3.2.1.min.js"></script>

  1. El problema de nav.php: Si nav.php es tan sólo parte que debe ser incluida en otro documento, ¿por qué creas nav.php como si fuese un documento independiente, con su DOCTYPE, sus etiquetas <head>, <body>, inclusión de nuevo de ciertas librerías, etc. Al incluir o requerir nav.php en otro documento tendrás un montón de cosas duplicadas.

  1. Particularmente, terminaría mis llamadas a $ajax por punto y coma. Por ejemplo aquí:

         $.ajax({
                    url: 'mostrar_inventario.php',
                    method: 'POST',
                    data: {permiso: '<?php echo $permiso; ?>'},
                    success: function(data){
                        $('#result').html(data)
                    }
                });
    
A. Cedano
  • 86,578
  • 19
  • 122
  • 221
  • No es necesario que terminen en punto y coma, aunque yo personalmente uso el punto y coma siempre y no me parece bien usar `;` parcialmente como el OP, javascript es flexible en este tema, y no creo que sea el problema de esta pregunta – Daniel Pérez Jun 27 '17 at 15:56
  • Y hay razones para incluir las librerias local, puede que el OP no este conectado a internet todo el tiempo, o puede que no quiera tener que depender de la cdn de jquery o de algun otro servidor. – Daniel Pérez Jun 27 '17 at 15:58
  • @DanielPérez recuerda que es una librería del lado del cliente. Si se trata de una página web, tener la librería en nuestro propio servidor es añadir innecesariamente cargas al servidor, cuando el código se puede referenciar desde el CDN original. En ese caso el estar o no conectado a internet no tiene ningún sentido. Además, no parece ser el caso, ya que hay inclusión de librerías como `bootstrap` que sí se hacen usando la url externa. – A. Cedano Jun 27 '17 at 16:00
  • Concuerdo contigo, pero es que hay razones para esto, se puede dar el caso de ( aunque poco probable ) que por alguna razon la cdn de jquery este caido y no disponible, puede ser una tecnica de solo depender del propio servidor para todos los recursos. – Daniel Pérez Jun 27 '17 at 16:02