¿Desactivar un botón luego de hacerle click?

R

Tengo un hipervínculo que al hacerle click te lleva a otro archivo y luego ese archivo te regresa a la página en donde está el hipervínculo, pero necesito hacer que cuando regreses el botón este deshabilitado (osea que si lo vuelves a tocar no te mande nuevamente a la página)

intente muchas cosas pero no me funcionaron

<a class="button" id="elementId" onClick=";" href="cartAction.php?action=addToCart&id=<?php echo $row["id"]; ?>" on class="btn btn-primary">Añadir al carrito</a>

y en addtocart tengo esto

$insertItem = $cart->insert($itemData);
$redirectLoc = 'index.php#' . $productID;

y esta es la función insert

    public function insert($item = array()){
        if(!is_array($item) OR count($item) === 0){
            return FALSE;
        }else{
            if(!isset($item['id'], $item['name'], $item['price'], $item['qty'])){
                return FALSE;
            }else{
                $item['qty'] = (float) $item['qty'];
                if($item['qty'] == 0){
                    return FALSE;
                }
                $item['price'] = (float) $item['price'];
                $rowid = md5($item['id']);
                $old_qty = isset($this->cart_contents[$rowid]['qty']) ? (int) $this->cart_contents[$rowid]['qty'] : 0;
                $item['rowid'] = $rowid;
                $item['qty'] += $old_qty;
                $this->cart_contents[$rowid] = $item;

            if($this->save_cart()){
                return isset($rowid) ? $rowid : TRUE;
            }else{
                return FALSE;
            }
        }
    }
}
EnderFX

Yokse tio, tienes varias formas.
Métele un onclick, y luego haces un event.preventDefault() creo que es, si te viene un query param o como detectes la navegación. Si aún así al ser un <a> te navega, pues coges y lo cambias por un span y haces que navegue solo si no viene un query param en el onClick con un window.location = loquesea.

Estoy en el móvil así que ahora mismo no puedo probar.

1 respuesta
bLaKnI

Piensa. Logica de servidor. En la ida pintas el boton (pag primera vez). En la vuelta no (pag segunda vez). Siempre devuelves un repsonse a tu request con el HTML del servidor.
En la vuelta puedes pintarlo, pero con un disabled. Gestiona el backend. No el frontend.

PHP no? En el trozo que pintas el botón, ahí está tu logica. Si no eres capaz de resolverlo así, reprograma porque lo tienes mal planteado.
Vuelves con un header("./") o parecido? Vuelve entonces con un header("whatever?wtf=1"). Luego al pintar la pag original, comprueba el GET o el REQUESTS.

Sino, ajax al backend y desde ahí, prop(disabled, true) en el onClick().

2 respuestas
R

#3 #2 gracias a los dos, probaré primero con el #2 que me pareció un poco mas facilito!

2 respuestas
bLaKnI

#4 Si de A vas a B, y lueho con B vuelves a A, a no ser que estes haciendo locuras del tipo window.location y demás, solo podrás resolverlo con AJAX. No te conviene.
La logica del backend es la que manda. Luego en el forntend corriges. Pero no al reves. Logica de negocio, en el backend. Luego pasa lo que pasa... (abres un inspector en el navegador, alteras el codigo, tiras padentro y a correr...).

1 respuesta
EnderFX

#4 lo mío es tirado, pero es más pensando en una SPA y tocando sólo el front, porque tengo el cerebro ya acostumbrado a eso.

Pero, efectivamente, como te dice #3, desde el servidor si estás generando las templates debería ser más limpio. En cualquier caso debería valerte.

#5 qué va, puedes hacer locuras con query params, incluso puedes hacer aún más locuras con localStorage, pero eso ya sería rizar el rizo de forma absurda. Pero por poder, puedes.

1 respuesta
bLaKnI

#6 Para mi el verbo problemático aquí no es "poder". Es "deber"! xD

Troyer

#1 Si estás utilizando php plano con html, de entrada la estas cagando al crear el archivo cartAction.php, la manera correcta de trabajar sería añadir el cart cuando vayas a la cesta o hayan opciones de modificar/enseñar el cart.

Meter los atributos de los items por GET con un hipervinculo es otra cagada, porque el usuario podría refrescar sin querer y añadir mil productos que no quiere además que GET debería de usarse solamente para cuando quieres coger datos, como por ejemplo cuando filtras algo.

Haz un form que llame al archivo actual y pase parametros por POST, si existe POST haz el insert y si quieres, deshabilita el botón.

<?php
Include("Cart.php");
$cart = new Cart();
$cart->populateCart(); //esto debería de ir en el construct

if(isset($_POST['product_id']) && isset($_POST['qnt '])) 
{ 
    $product_id= $_POST['product_id'];
    $qnt = $_POST['qnt'];
    $cart->addItem($product_id, $qnt);
}
?>
<form method="post" action="<?php echo $_SERVER['PHP_SELF']; ?>">
   <input type="hidden" name="product_id" value="<?php echo $row['id']; ?>"  >
   <input type="text" name="qnt" value="1"  >
   <br>
   <input type="submit" class="btn btn-primary" name="submit" value="Submit Form" 
     <?php isset($_POST['product_id'] ? "disabled": "";?> >
   <br>
</form>
1

Usuarios habituales