Foros del Web » Programando para Internet » Javascript »

Enlace aleatorio sin repetir

Estas en el tema de Enlace aleatorio sin repetir en el foro de Javascript en Foros del Web. Hola, tengo un script que manda a un enlace aleatorio de entre los que le digo, pero ahora quisiera que no repitiese enlace. Es decir, ...
  #1 (permalink)  
Antiguo 21/11/2015, 17:11
 
Fecha de Ingreso: julio-2011
Ubicación: España
Mensajes: 127
Antigüedad: 12 años, 8 meses
Puntos: 2
Enlace aleatorio sin repetir

Hola, tengo un script que manda a un enlace aleatorio de entre los que le digo, pero ahora quisiera que no repitiese enlace. Es decir, que el link que se le abre al usuario al pulsar no le vuelva a salir hasta que actualice o vuelva a entrar en la página.
He estado probando pero no lo he conseguido.

El script que funciona es el siguiente, pero como digo quiero que no repita enlace. Espero que me podáis ayudar. Gracias

Código:
      <script>// <![CDATA[
var enlace = [ "http://www.google.com", "http://www.bing.com"]; n = Math.floor(Math.random() * enlace.length); document.write("<a href=" + enlace[n] + " target=blank >ENLACE</a>");
// ]]></script>
  #2 (permalink)  
Antiguo 22/11/2015, 07:15
 
Fecha de Ingreso: julio-2011
Ubicación: España
Mensajes: 127
Antigüedad: 12 años, 8 meses
Puntos: 2
Respuesta: Enlace aleatorio sin repetir

No entiendo como relacionar eso... Había pensado que guarde las URL mostradas (o el número equivalente) pero no domino este lenguaje lo suficiente
  #3 (permalink)  
Antiguo 22/11/2015, 09:07
Avatar de IsaBelM
Colaborador
 
Fecha de Ingreso: junio-2008
Mensajes: 5.032
Antigüedad: 15 años, 10 meses
Puntos: 1012
Respuesta: Enlace aleatorio sin repetir

Prueba con el método splice()
__________________
if(ViolenciaDeGénero) {alert('MUJER ASESINADA');}
  #4 (permalink)  
Antiguo 22/11/2015, 13:16
Avatar de IsaBelM
Colaborador
 
Fecha de Ingreso: junio-2008
Mensajes: 5.032
Antigüedad: 15 años, 10 meses
Puntos: 1012
Respuesta: Enlace aleatorio sin repetir

de hecho no hace falta guardar la nueva matriz. splice() devuelve la matriz, con los nuevos elementos, mientras no se refresque la página o se acceda de nuevo a ella
Cita:
<input value="genera link" type="button" onclick="arr.aleatorio();" />
<span id="l"></span>
<script>
var arr = ["http://www.google.com", "http://www.bing.com", "http://www.bingo.com", "http://www.bingooooo.com"];

Array.prototype.aleatorio = function() {

var ran = this.splice(Math.floor(Math.random() * this.length), 1);
document.getElementById('l').innerHTML = "<a href=" + ran + " target=blank >" + ran + "</a>";

}
</script>
__________________
if(ViolenciaDeGénero) {alert('MUJER ASESINADA');}
  #5 (permalink)  
Antiguo 22/11/2015, 15:20
 
Fecha de Ingreso: julio-2011
Ubicación: España
Mensajes: 127
Antigüedad: 12 años, 8 meses
Puntos: 2
Respuesta: Enlace aleatorio sin repetir

Gracias a los dos.

Sí, por eso me confundió lo que dijiste Alexis, no hacía falta que se almacenace para cada visitante. El de Isabel es a lo que me refería.

Estoy intentando combinar un poco el código que puse con el de Isabel para que: no salga la URL de la web aleatoria al pulsar el botón (salga "Ir a la web" o algo asi) o bien que al pulsar el botón vaya directamente a la web aleatoria y como la abre en una nueva ventana no se repetirá usando la propuesta de Isabel.

El código que puse hacía eso de abrir directamente en nueva ventana al pulsar, pero no logro encuadrar esa acción en la propuesta de Isabel.
  #6 (permalink)  
Antiguo 22/11/2015, 16:17
Avatar de Alexis88
Philosopher
 
Fecha de Ingreso: noviembre-2011
Ubicación: Tacna, Perú
Mensajes: 5.552
Antigüedad: 12 años, 5 meses
Puntos: 977
Respuesta: Enlace aleatorio sin repetir

Solo tienes que sustituir la parte en la que generas el enlace aleatorio por lo que te proponen.
__________________
«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
  #7 (permalink)  
Antiguo 25/11/2015, 06:59
Avatar de IsaBelM
Colaborador
 
Fecha de Ingreso: junio-2008
Mensajes: 5.032
Antigüedad: 15 años, 10 meses
Puntos: 1012
Respuesta: Enlace aleatorio sin repetir

a ver si es esto lo que pretendes
Cita:
function eventos() {
var variable = new variables();
document.querySelector('#redirecion').addEventList ener('click', function() { setTimeout(function() {variable.arr.aleatorio()}, 0) }, false);
variable.arr.aleatorio();
}


function variables() {
this.arr = ['http://www.google.com', 'http://www.bing.com', 'http://www.yahoo.com', 'http://www.hotmail.com'];
}


Array.prototype.aleatorio = function() {
if(!this.length) {document.location.reload();}
var ran = this.splice(Math.floor(Math.random() * this.length), 1);
document.querySelector('#redirecion').href = ran;
}

document.addEventListener('DOMContentLoaded', function() {eventos()}, false);



<a href="http://www.google.com" id="redirecion" target="blank">Ir a la web</a>
__________________
if(ViolenciaDeGénero) {alert('MUJER ASESINADA');}
  #8 (permalink)  
Antiguo 29/11/2015, 14:04
 
Fecha de Ingreso: julio-2011
Ubicación: España
Mensajes: 127
Antigüedad: 12 años, 8 meses
Puntos: 2
Respuesta: Enlace aleatorio sin repetir

No del todo, pero bueno estoy adaptando el penúltimo y creo que lo mejor será hacer la acción directamente sin necesidad de abrir el link para ver el resultado.

Es decir, partimos del penúltimo código que funciona bien, hace el aleatorio sin repetir entre los links indicados (en este caso ponemos un texto en lugar del link). Si el resultado es A mostrará el texto B, si el texto es Y mostrará el texto Z.

Ok, esto es condicional pero he probado y no resulta, creo que el problema es como y qué variable llamar:

Código:
<input value="genera link" type="button" onclick="arr.aleatorio();" />
<span id="l"></span>
<script>
var arr = ["Opción 1", "Opción 2", "Opción 3", "Opción 4"];

Array.prototype.aleatorio = function() {

var ran = this.splice(Math.floor(Math.random() * this.length), 1);
document.getElementById('l').innerHTML = "" + ran + "";

}
</script>

<input value="Respuesta" onclick="doClick();"
 type="button"><br>
<script>
function doClick() {
if (ran = Opción 1)
alert("Respuesta1");
}
else if(ran = Opción 2) {
alert("Respuesta2");
}
</script>
  #9 (permalink)  
Antiguo 29/11/2015, 14:59
Avatar de Alexis88
Philosopher
 
Fecha de Ingreso: noviembre-2011
Ubicación: Tacna, Perú
Mensajes: 5.552
Antigüedad: 12 años, 5 meses
Puntos: 977
Respuesta: Enlace aleatorio sin repetir

En una comparación debes usar doble igualdad, además, si tienes varias opciones, mejor utiliza una estructura de selección múltiple o busca el índice de la respuesta en el array y súmale uno (porque la cuenta empieza desde cero).

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
  #10 (permalink)  
Antiguo 30/11/2015, 07:36
Avatar de IsaBelM
Colaborador
 
Fecha de Ingreso: junio-2008
Mensajes: 5.032
Antigüedad: 15 años, 10 meses
Puntos: 1012
Respuesta: Enlace aleatorio sin repetir

además, de lo que te comenta alexis88, tienes varios problemas.
  • el conjunto de llaves no es correcto
  • no tienes acceso a la variable "ran" fuera del prototipo. tendrás que hacerla global

en cuanto a usar indexOf(), a bote proto, no me parece viable. splice() retorna el array modificado, con lo que el indice 1, puede que en algún momento sea el indice 0
__________________
if(ViolenciaDeGénero) {alert('MUJER ASESINADA');}
  #11 (permalink)  
Antiguo 30/11/2015, 10:19
Avatar de Alexis88
Philosopher
 
Fecha de Ingreso: noviembre-2011
Ubicación: Tacna, Perú
Mensajes: 5.552
Antigüedad: 12 años, 5 meses
Puntos: 977
Respuesta: Enlace aleatorio sin repetir

Cita:
Iniciado por IsaBelM Ver Mensaje
[...] en cuanto a usar indexOf(), a bote proto, no me parece viable. splice() retorna el array modificado, con lo que el indice 1, puede que en algún momento sea el indice 0
Ese no es ningún problema. Basta con que la respuesta seleccionada se encuentre en el array (que es lo que determina dicha método) y sería suficiente con tomar el número que constituye el final del texto de la misma.
__________________
«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
  #12 (permalink)  
Antiguo 30/11/2015, 11:52
Avatar de IsaBelM
Colaborador
 
Fecha de Ingreso: junio-2008
Mensajes: 5.032
Antigüedad: 15 años, 10 meses
Puntos: 1012
Respuesta: Enlace aleatorio sin repetir

Ahí es donde veo el problema. Indexof retorna la posición del ítem en la matriz, pero nunca podrá encontrarlo puesto que ya no existe. Splice lo ha eliminado. Sigo
__________________
if(ViolenciaDeGénero) {alert('MUJER ASESINADA');}
  #13 (permalink)  
Antiguo 30/11/2015, 13:04
Avatar de Alexis88
Philosopher
 
Fecha de Ingreso: noviembre-2011
Ubicación: Tacna, Perú
Mensajes: 5.552
Antigüedad: 12 años, 5 meses
Puntos: 977
Respuesta: Enlace aleatorio sin repetir

Tampoco hay problema por eso. Basta con tomar la posición aleatoria y almacenarla en una variable, hacer la búsqueda en el array a partir de la posición obtenida y, finalmente, eliminar al elemento del array. Como la búsqueda se hizo antes de eliminar el dato, la respuesta puede ser mostrada sin problema alguno. Incluso después de hacer la eliminación. El script crecerá tan solo dos líneas.

¿Sigues?
__________________
«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
  #14 (permalink)  
Antiguo 30/11/2015, 14:56
Avatar de IsaBelM
Colaborador
 
Fecha de Ingreso: junio-2008
Mensajes: 5.032
Antigüedad: 15 años, 10 meses
Puntos: 1012
Respuesta: Enlace aleatorio sin repetir

Creo entender que te refieres a usar switch. Lo que no entendía era el uso de indeof
__________________
if(ViolenciaDeGénero) {alert('MUJER ASESINADA');}
  #15 (permalink)  
Antiguo 30/11/2015, 15:32
Avatar de Alexis88
Philosopher
 
Fecha de Ingreso: noviembre-2011
Ubicación: Tacna, Perú
Mensajes: 5.552
Antigüedad: 12 años, 5 meses
Puntos: 977
Respuesta: Enlace aleatorio sin repetir

No. Me refiero a dicho método:

Código Javascript:
Ver original
  1. var array = ["Opción 1", "Opción 2", "Opción 3", "Opción N"],
  2.     posicion = Math.floor(Math.random() * array.length),
  3.     elemento = array[posicion];
  4.  
  5. array.splice(posicion, 1); //Lo elimino
  6. console.log("Número de respuesta: " + (posicion + 1)); //Muestro el número de la respuesta
  7. console.log("Respuesta: " + elemento); //Muestro la respuesta

Viéndolo bien, ahora el script tiene menos líneas.
__________________
«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
  #16 (permalink)  
Antiguo 01/12/2015, 05:23
Avatar de IsaBelM
Colaborador
 
Fecha de Ingreso: junio-2008
Mensajes: 5.032
Antigüedad: 15 años, 10 meses
Puntos: 1012
Respuesta: Enlace aleatorio sin repetir

vaya perdida de tiempo. al final ni chicha ni limona

como ya dije anteriormente
Cita:
Iniciado por IsaBelM Ver Mensaje
además, de lo que te comenta alexis88, tienes varios problemas.
  • el conjunto de llaves no es correcto
  • no tienes acceso a la variable "ran" fuera del prototipo. tendrás que hacerla global

en cuanto a usar indexOf(), a bote proto, no me parece viable. splice() retorna el array modificado, con lo que el indice 1, puede que en algún momento sea el indice 0
y lo mejor de todo sin añadir ni una línea más
Código:
<input value="genera link" type="button" onclick="arr.aleatorio();" />
<span id="l"></span>
<script>
var arr = ["Opción 1", "Opción 2", "Opción 3", "Opción 4"], ran;

Array.prototype.aleatorio = function() {

ran = this.splice(Math.floor(Math.random() * this.length), 1);
document.getElementById('l').innerHTML = "" + ran + "";

}
</script>

<input value="Respuesta" onclick="doClick();"
 type="button"><br>
<script>
function doClick() {
if (ran == 'Opción 1') {
alert("Respuesta1");
}
else if(ran == 'Opción 2') {
alert("Respuesta2");
}
}
</script>
__________________
if(ViolenciaDeGénero) {alert('MUJER ASESINADA');}
  #17 (permalink)  
Antiguo 01/12/2015, 11:24
Avatar de Alexis88
Philosopher
 
Fecha de Ingreso: noviembre-2011
Ubicación: Tacna, Perú
Mensajes: 5.552
Antigüedad: 12 años, 5 meses
Puntos: 977
Respuesta: Enlace aleatorio sin repetir

Cita:
Iniciado por IsaBelM Ver Mensaje
vaya perdida de tiempo. al final ni chicha ni limona [...]
¿?

El consejo fue para evitar tener que utilizar varias condiciones para mostrar el número de respuesta. Como no hay necesidad de obtener el elemento aleatorio de forma atolondrada, entonces, con obtener una copia y luego eliminarlo, es suficiente.

La documentación del método es clara al respecto:
Cita:
Iniciado por MDN
Si sólo se ha eliminado un elemento, devuelve un array con un sólo elemento.
Y el objetivo es obtener la posición ya que el valor la opción puede variar y, según lo que muestra ph20, quiere mostrar el número de respuesta:

Código Javascript:
Ver original
  1. if (ran == 'Opción 1') {
  2.     alert("Respuesta1");
  3. }

Mientras que tú muestras a la respuesta:
Código Javascript:
Ver original
  1. ran = this.splice(Math.floor(Math.random() * this.length), 1);
  2. document.getElementById('l').innerHTML = "" + ran + "";

La última impresión de mi ejemplo, la puse como un extra pues no veo que eso sea lo que pida, pero lo considero implícito. En ese escenario, solo se ahorra una línea reemplazando el contenido de la línea 5 en la 3.

A todo esto, ¿te diste cuenta de que ya no utilicé dicho método? Por eso lo planteé de otra forma. Error mío al volver a mencionarlo cuando ya no lo usaba.

Por cierto, aquí nadie está «perdiendo el tiempo»; tratamos de ayudarnos.

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

Última edición por Alexis88; 01/12/2015 a las 11:30 Razón: Me faltó el saludo XD
  #18 (permalink)  
Antiguo 01/12/2015, 12:03
Avatar de IsaBelM
Colaborador
 
Fecha de Ingreso: junio-2008
Mensajes: 5.032
Antigüedad: 15 años, 10 meses
Puntos: 1012
Respuesta: Enlace aleatorio sin repetir

En fin, no trolleare el tema con, me lo dices o me lo cuestas, dimes y diretes, suposiciones, etc
__________________
if(ViolenciaDeGénero) {alert('MUJER ASESINADA');}

Etiquetas: enlace, funcion, repetir
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 09:33.