CSS error when applying events to buttons - jQuery

3

I'm doing an image viewer with four buttons (First, Previous, Next, Last).

Initially, an image is loaded randomly (I have them stored in a folder called "images"), and then we can move through events of those four buttons.

Why do not I apply the modifications to the buttons correctly in relation to the CSS?

/*Al cargar la página realiza esta llamada a la funcion*/
$(document).ready(function() {
  //Creamos un objeto de la clase Galería. Le pasamos el parámetro necesario.
  galeria = new Galeria(7);
});

//Creamos la clase Galería con su método constructor, sus atributos y sus diferentes métodos necesarios.
var Galeria = function(imagenes) {
  //Indice de la imagen que se está mostrando (cursor).
  var cursor = 0;
  //Array con imágenes.
  var arrayImages = new Array();
  //Cantidad de imágenes.
  var numImages = imagenes; //7 imagenes de Juego de Tronos.
  //Añadimos las imagenes con un "for" al array "arrayImages".
  for (var i = 1; i <= numImages; i++) {
    arrayImages.push("foto" + i + ".jpg");
  }

  //Generamos un número aleatorio entre 1 y 7 y ese número se le asignamos al array "arrayImages".
  var imagenAleatoria = function() {
    cursor = (Math.round(Math.random() * 100)) % imagenes;
    return arrayImages[cursor];
  }

  //Cursor en la primera posición del array, devolviendo el nombre de la imagen que hay en la misma.
  var primeraPosicion = function() {
    cursor = 0;
    return arrayImages[cursor];
  }

  //Cursor en la última posición del array, devolviendo el nombre de la imagen que hay en la misma.
  var ultimaPosicion = function() {
    cursor = arrayImages.length - 1;
    return arrayImages[cursor];
  }

  //Cursor en la posicion ANTERIOR a la actual, devolviendo el nombre de la imagen que hay en la misma.
  var posicionAnteriorActual = function() {
    if (cursor > 0) {
      cursor--;
      return arrayImages[cursor];
    } else {
      return arrayImages[0];
    }
  }

  //Cursor en la posicion SIGUIENTE a la actual, devolviendo el nombre de la imagen que hay en la misma.
  var posicionSiguienteActual = function() {
    if (cursor < 6) {
      cursor++;
      return arrayImages[cursor];
    } else {
      return arrayImages[6];
    }
  }


  //Comprobar donde está el cursor.
  var comprobarCursor = function() {
    if (cursor == 0) {
      $('#primera').addClass("deshabilitado");
      $('#anterior').addClass("deshabilitado");
      $('#siguiente').addClass("habilitado");
      $('#ultima').addClass("habilitado");

    } else if (cursor == 6) {
      $('#primera').addClass("habilitado");
      $('#anterior').addClass("habilitado");
      $('#siguiente').addClass("deshabilitado");
      $('#ultima').addClass("deshabilitado");
    } else {
      $('#primera').addClass("habilitado");
      $('#anterior').addClass("habilitado");
      $('#siguiente').addClass("habilitado");
      $('#ultima').addClass("habilitado");
    }
  }

  //Inicialmente se cargará una imagen al azar.
  var inicializarImagen = function() {
    //En JS: document.getElementById("imagen").setAttribute("style", "background-image:.....");
    $('#imagen').css({
      'background-image': 'url(images/' + imagenAleatoria() + ')'
    });
  }
  inicializarImagen();


  //Eventos de botones.
  $('#siguiente').click(function() {
    comprobarCursor();
    $('#imagen').css({
      'background-image': 'url(images/' + posicionSiguienteActual() + ')'
    });
  });

  $('#anterior').click(function() {
    comprobarCursor();
    $('#imagen').css({
      'background-image': 'url(images/' + posicionAnteriorActual() + ')'
    });
  });

  $('#primera').click(function() {
    comprobarCursor();
    $('#imagen').css({
      'background-image': 'url(images/' + primeraPosicion() + ')'
    });
  });

  $('#ultima').click(function() {
    comprobarCursor();
    $('#imagen').css({
      'background-image': 'url(images/' + primeraPosicion() + ')'
    });
  });
}
@font-face {
  font-family: GoT;
  src: url("fonts/got.ttf");
}

* {
  font-family: GoT;
}


/* "Truco" para conseguir una imagen de fondo transparente en el body */

#contenedor {
  position: relative;
}

#contenedor:after {
  content: "";
  display: block;
  position: absolute;
  top: 0;
  left: 0;
  background-image: url(images/fondo.jpg);
  width: 100%;
  height: 100%;
  opacity: 0.2;
  z-index: -1;
}

h2 {
  margin: 0 auto;
  text-align: center;
  padding-top: 10px;
  padding-bottom: 10px;
}

#galeria {
  width: 500px;
  margin: 0 auto;
  border: 2px solid black;
  background-color: #FFFFFF;
  border-radius: 10px;
}

#imagen {
  width: 300px;
  height: 300px;
  background-size: contain;
  margin: 0 auto;
  transition: background-image 1s;
  -webkit-transition: background-image 1s;
}

#botones {
  margin: 10px;
  text-align: center;
}

#botones ul {
  list-style-type: none;
  display: inline;
  padding-left: 0;
}

#botones ul li {
  display: inline;
  padding-left: 5px;
  padding-right: 5px;
}

#botones * a {
  margin-bottom: 10px;
  padding: 4px;
  background-color: #B8B894;
  border: 2px solid #3B3B3A;
  font-size: .6em;
  color: black;
  text-decoration: none;
  border-radius: 10px;
}

.deshabilitado {
  background-color: #FF5C33 !important;
}

.habilitado {
  background-color: #B8B894 !important;
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.1/jquery.min.js"></script>

<div id="contenedor">
  <div id="galeria">
    <h2>Visor de personajes</h2>
    <div id="imagen"> </div>
    <div id="botones">
      <ul>
        <li><a href="#" id="primera">PRIMERA</a></li>
        <li><a href="#" id="anterior">ANTERIOR</a></li>
        <li><a href="#" id="siguiente">SIGUIENTE</a></li>
        <li><a href="#" id="ultima">ULTIMA</a></li>
      </ul>
    </div>
  </div>
</div>

My mistake is that they do not assign the CSS. That is to say: if I load the page and I have the photo1, the PREVIOUS or FIRST button must be in orange, I understand that they are disabled, and if I go forward photo by photo with the NEXT button, from photo1 to photo7, when I arrive to photo7 the NEXT button and the last button must be disabled.

    
asked by omaza1990 30.05.2017 в 15:18
source

2 answers

1

The problem is that you are adding the classes "enabled" and "disabled" without removing the one that does not correspond . Then, at the end the buttons will end up having both classes and the "enabled" class has higher precedence and is the one that will be applied over the "disabled" class:

.deshabilitado {
  background-color: #FF5C33 !important;
}

.habilitado {
  background-color: #B8B894 !important;
}

A quick solution would be to remove the two classes "enabled" and "disabled" at the beginning of the comprobarCursor method. This can be done in jQuery with a single line using the removeClass method:

$("#botones a").removeClass("habilitado deshabilitado");

It is also called comprobarCursor before updating the value of cursor in posicionSiguienteActual and that is why one will always go one behind what it should. Change the order and problem solved, for example:

  $('#anterior').click(function() {
    $('#imagen').css({
      'background-image': 'url(images/' + posicionAnteriorActual() + ')'
    });
    comprobarCursor();
  });

And finally, you call primeraPosicion instead of ultimaPosicion when you click on the LAST button.

With all those changes, the code works well and looks like this:

/*Al cargar la página realiza esta llamada a la funcion*/
$(document).ready(function() {
  //Creamos un objeto de la clase Galería. Le pasamos el parámetro necesario.
  galeria = new Galeria(7);
});

//Creamos la clase Galería con su método constructor, sus atributos y sus diferentes métodos necesarios.
var Galeria = function(imagenes) {
  //Indice de la imagen que se está mostrando (cursor).
  var cursor = 0;
  //Array con imágenes.
  var arrayImages = new Array();
  //Cantidad de imágenes.
  var numImages = imagenes; //7 imagenes de Juego de Tronos.
  //Añadimos las imagenes con un "for" al array "arrayImages".
  for (var i = 1; i <= numImages; i++) {
    arrayImages.push("foto" + i + ".jpg");
  }

  //Generamos un número aleatorio entre 1 y 7 y ese número se le asignamos al array "arrayImages".
  var imagenAleatoria = function() {
    cursor = (Math.round(Math.random() * 100)) % imagenes;
    return arrayImages[cursor];
  }

  //Cursor en la primera posición del array, devolviendo el nombre de la imagen que hay en la misma.
  var primeraPosicion = function() {
    cursor = 0;
    return arrayImages[cursor];
  }

  //Cursor en la última posición del array, devolviendo el nombre de la imagen que hay en la misma.
  var ultimaPosicion = function() {
    cursor = arrayImages.length - 1;
    return arrayImages[cursor];
  }

  //Cursor en la posicion ANTERIOR a la actual, devolviendo el nombre de la imagen que hay en la misma.
  var posicionAnteriorActual = function() {
    if (cursor > 0) {
      cursor--;
      return arrayImages[cursor];
    } else {
      return arrayImages[0];
    }
  }

  //Cursor en la posicion SIGUIENTE a la actual, devolviendo el nombre de la imagen que hay en la misma.
  var posicionSiguienteActual = function() {
    if (cursor < 6) {
      cursor++;
      return arrayImages[cursor];
    } else {
      return arrayImages[6];
    }
  }


  //Comprobar donde está el cursor.
  var comprobarCursor = function() {
    $("#botones a").removeClass("habilitado deshabilitado");
console.log(cursor);
    if (cursor == 0) {
      $('#primera').addClass("deshabilitado");
      $('#anterior').addClass("deshabilitado");
      $('#siguiente').addClass("habilitado");
      $('#ultima').addClass("habilitado");

    } else if (cursor == 6) {
      $('#primera').addClass("habilitado");
      $('#anterior').addClass("habilitado");
      $('#siguiente').addClass("deshabilitado");
      $('#ultima').addClass("deshabilitado");
    } else {
      $('#primera').addClass("habilitado");
      $('#anterior').addClass("habilitado");
      $('#siguiente').addClass("habilitado");
      $('#ultima').addClass("habilitado");
    }
  }

  //Inicialmente se cargará una imagen al azar.
  var inicializarImagen = function() {
    //En JS: document.getElementById("imagen").setAttribute("style", "background-image:.....");
    $('#imagen').css({
      'background-image': 'url(images/' + imagenAleatoria() + ')'
    });
  }
  inicializarImagen();


  //Eventos de botones.
  $('#siguiente').click(function() {
    $('#imagen').css({
      'background-image': 'url(images/' + posicionSiguienteActual() + ')'
    });
    comprobarCursor();
  });

  $('#anterior').click(function() {
    $('#imagen').css({
      'background-image': 'url(images/' + posicionAnteriorActual() + ')'
    });
    comprobarCursor();
  });

  $('#primera').click(function() {
    $('#imagen').css({
      'background-image': 'url(images/' + primeraPosicion() + ')'
    });
    comprobarCursor();
  });

  $('#ultima').click(function() {
    $('#imagen').css({
      'background-image': 'url(images/' + ultimaPosicion() + ')'
    });
    comprobarCursor();
  });
}
@font-face {
  font-family: GoT;
  src: url("fonts/got.ttf");
}

* {
  font-family: GoT;
}


/* "Truco" para conseguir una imagen de fondo transparente en el body */

#contenedor {
  position: relative;
}

#contenedor:after {
  content: "";
  display: block;
  position: absolute;
  top: 0;
  left: 0;
  background-image: url(images/fondo.jpg);
  width: 100%;
  height: 100%;
  opacity: 0.2;
  z-index: -1;
}

h2 {
  margin: 0 auto;
  text-align: center;
  padding-top: 10px;
  padding-bottom: 10px;
}

#galeria {
  width: 500px;
  margin: 0 auto;
  border: 2px solid black;
  background-color: #FFFFFF;
  border-radius: 10px;
}

#imagen {
  width: 300px;
  height: 300px;
  background-size: contain;
  margin: 0 auto;
  transition: background-image 1s;
  -webkit-transition: background-image 1s;
}

#botones {
  margin: 10px;
  text-align: center;
}

#botones ul {
  list-style-type: none;
  display: inline;
  padding-left: 0;
}

#botones ul li {
  display: inline;
  padding-left: 5px;
  padding-right: 5px;
}

#botones * a {
  margin-bottom: 10px;
  padding: 4px;
  background-color: #B8B894;
  border: 2px solid #3B3B3A;
  font-size: .6em;
  color: black;
  text-decoration: none;
  border-radius: 10px;
}

.deshabilitado {
  background-color: #FF5C33 !important;
}

.habilitado {
  background-color: #B8B894 !important;
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.1/jquery.min.js"></script>

<div id="contenedor">
  <div id="galeria">
    <h2>Visor de personajes</h2>
    <div id="imagen"> </div>
    <div id="botones">
      <ul>
        <li><a href="#" id="primera">PRIMERA</a></li>
        <li><a href="#" id="anterior">ANTERIOR</a></li>
        <li><a href="#" id="siguiente">SIGUIENTE</a></li>
        <li><a href="#" id="ultima">ULTIMA</a></li>
      </ul>
    </div>
  </div>
</div>
    
answered by 30.05.2017 в 16:40
1

A paradox occurs in your code since I do not know what you want to do, if it is: create an instance of the galerias object, or: create a function where you define variables globales .

Now that said, I will post the 2 examples of the possible solutions:

First option : Creating an instance of the galleries object:

$(document).ready(function() {
  //Creamos un objeto de la clase Galería. Le pasamos el parámetro necesario.
  galeria = new Galeria(7);
});

//Creamos la clase Galería con su método constructor, sus atributos y sus diferentes métodos necesarios.
var Galeria = function(imagenes) {
  //Indice de la imagen que se está mostrando (cursor).
  var this.cursor = 0;
  //Array con imágenes.
  var this.arrayImages = new Array();
  //Cantidad de imágenes.
  var this.numImages = imagenes; //7 imagenes de Juego de Tronos.
  //Añadimos las imagenes con un "for" al array "arrayImages".
  for (var i = 1; i <= numImages; i++) {
    this.arrayImages.push("foto" + i + ".jpg");
  }

This is how you should handle the galleries object:
( NOTE : this example applies to all code where you manage the galleries )

  //Generamos un número aleatorio entre 1 y 7 y ese número se le asignamos al array "arrayImages".
  var imagenAleatoria = function() {
    galeria.cursor = (Math.round(Math.random() * 100)) % galeria.numImages;
    return galeria.arrayImages[galeria.cursor];
  }

Second option : Creating a function to handle variables Global :

//Creamos la clase Galería con su método constructor, sus atributos y sus diferentes métodos necesarios.
var Galeria = function(imagenes) {
  //Indice de la imagen que se está mostrando (cursor).
  cursor = 0;
  //Array con imágenes.
  arrayImages = new Array();
  //Cantidad de imágenes.
  numImages = imagenes; //7 imagenes de Juego de Tronos.
  //Añadimos las imagenes con un "for" al array "arrayImages".
  for (var i = 1; i <= numImages; i++) {
    arrayImages.push("foto" + i + ".jpg");
  }

This is how you should handle the Global variables:

  //Generamos un número aleatorio entre 1 y 7 y ese número se le asignamos al array "arrayImages".
  var imagenAleatoria = function() {
    cursor = (Math.round(Math.random() * 100)) % imagenes;
    return arrayImages[cursor];
  }

I suggest using the first option but it will be your part to opt for the one you like the most, Greetings !! ;)) ...

Here is a functional example using the First Option :

//Creamos la clase Galería con su método constructor, sus atributos y sus diferentes métodos necesarios.
var Galeria = function(imagenes) {
  //Indice de la imagen que se está mostrando (cursor).
   this.cursor = 0;
  //Array con imágenes.
   this.arrayImages = new Array();
  //Cantidad de imágenes.
   this.numImages = imagenes; //7 imagenes de Juego de Tronos.
  //Añadimos las imagenes con un "for" al array "arrayImages".
  for (var i = 1; i <= imagenes; i++)
    this.arrayImages.push("foto" + i + ".jpg");
}

  //Generamos un número aleatorio entre 1 y 7 y ese número se le asignamos al array "arrayImages".
  var imagenAleatoria = function() {
    galeria.cursor = (Math.round(Math.random() * 100)) % galeria.numImages;
    return galeria.arrayImages[galeria.cursor];
  }

  //Cursor en la primera posición del array, devolviendo el nombre de la imagen que hay en la misma.
  var primeraPosicion = function() {
    galeria.cursor = 0;
    return galeria.arrayImages[galeria.cursor];
  }

  //Cursor en la última posición del array, devolviendo el nombre de la imagen que hay en la misma.
  var ultimaPosicion = function() {
    galeria.cursor = galeria.arrayImages.length - 1;
    return galeria.arrayImages[galeria.cursor];
  }

  //Cursor en la posicion ANTERIOR a la actual, devolviendo el nombre de la imagen que hay en la misma.
  var posicionAnteriorActual = function() {
    galeria.cursor--;
    if (galeria.cursor < 0) {
      galeria.cursor = 6;
    }
    return galeria.arrayImages[galeria.cursor];
  }

  //Cursor en la posicion SIGUIENTE a la actual, devolviendo el nombre de la imagen que hay en la misma.
  var posicionSiguienteActual = function() {
    galeria.cursor++;
    if (galeria.cursor > 6) {
      galeria.cursor = 0;
    }
    return galeria.arrayImages[galeria.cursor];
  }


  //Comprobar donde está el cursor.
  var comprobarCursor = function() {alert(galeria.cursor);
      $('#primera').removeClass("deshabilitado habilitado");
      $('#anterior').removeClass("deshabilitado habilitado");
      $('#siguiente').removeClass("deshabilitado habilitado");
      $('#ultima').removeClass("deshabilitado habilitado");

    if (galeria.cursor == 0) {
      $('#primera').addClass("deshabilitado");
      $('#anterior').addClass("deshabilitado");
      $('#siguiente').addClass("habilitado");
      $('#ultima').addClass("habilitado");

    } else if (galeria.cursor == 6) {
      $('#primera').addClass("habilitado");
      $('#anterior').addClass("habilitado");
      $('#siguiente').addClass("deshabilitado");
      $('#ultima').addClass("deshabilitado");
    } else {
      $('#primera').addClass("habilitado");
      $('#anterior').addClass("habilitado");
      $('#siguiente').addClass("habilitado");
      $('#ultima').addClass("habilitado");
    }
  }

  //Inicialmente se cargará una imagen al azar.
  var inicializarImagen = function() {
    //En JS: document.getElementById("imagen").setAttribute("style", "background-image:.....");
    $('#imagen').css({
      'background-image': 'url(images/' + imagenAleatoria() + ')'
    });
  }
$(document).ready(function() {

  //Eventos de botones.
  $('#siguiente').click(function() {
    comprobarCursor();
    $('#imagen').css({
      'background-image': 'url(images/' + posicionSiguienteActual() + ')'
    });
  });

  $('#anterior').click(function() {
    $('#imagen').css({
      'background-image': 'url(images/' + posicionAnteriorActual() + ')'
    });
    comprobarCursor();
  });

  $('#primera').click(function() {
    $('#imagen').css({
      'background-image': 'url(images/' + primeraPosicion() + ')'
    });
    comprobarCursor();
  });

  $('#ultima').click(function() {
    $('#imagen').css({
      'background-image': 'url(images/' + ultimaPosicion() + ')'
    });
    comprobarCursor();
  });

  //Creamos un objeto de la clase Galería. Le pasamos el parámetro necesario.
  galeria = new Galeria(7);

  inicializarImagen();
});
@font-face {
  font-family: GoT;
  src: url("fonts/got.ttf");
}

* {
  font-family: GoT;
}


/* "Truco" para conseguir una imagen de fondo transparente en el body */

#contenedor {
  position: relative;
}

#contenedor:after {
  content: "";
  display: block;
  position: absolute;
  top: 0;
  left: 0;
  background-image: url(images/fondo.jpg);
  width: 100%;
  height: 100%;
  opacity: 0.2;
  z-index: -1;
}

h2 {
  margin: 0 auto;
  text-align: center;
  padding-top: 10px;
  padding-bottom: 10px;
}

#galeria {
  width: 500px;
  margin: 0 auto;
  border: 2px solid black;
  background-color: #FFFFFF;
  border-radius: 10px;
}

#imagen {
  width: 300px;
  height: 300px;
  background-size: contain;
  margin: 0 auto;
  transition: background-image 1s;
  -webkit-transition: background-image 1s;
}

#botones {
  margin: 10px;
  text-align: center;
}

#botones ul {
  list-style-type: none;
  display: inline;
  padding-left: 0;
}

#botones ul li {
  display: inline;
  padding-left: 5px;
  padding-right: 5px;
}

#botones * a {
  margin-bottom: 10px;
  padding: 4px;
  background-color: #B8B894;
  border: 2px solid #3B3B3A;
  font-size: .6em;
  color: black;
  text-decoration: none;
  border-radius: 10px;
}

.deshabilitado {
  background-color: #FF5C33 !important;
}

.habilitado {
  background-color: #B8B894 !important;
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.1/jquery.min.js"></script>

<div id="contenedor">
  <div id="galeria">
    <h2>Visor de personajes</h2>
    <div id="imagen"> </div>
    <div id="botones">
      <ul>
        <li><a href="#" id="primera">PRIMERA</a></li>
        <li><a href="#" id="anterior">ANTERIOR</a></li>
        <li><a href="#" id="siguiente">SIGUIENTE</a></li>
        <li><a href="#" id="ultima">ULTIMA</a></li>
      </ul>
    </div>
  </div>
</div>
    
answered by 30.05.2017 в 16:43