Botón deshabilitar en jQuery
-
Deshabilite el botón en jQuery pasando el objeto
evento
al controlador de eventosonclick
-
Deshabilitar botón en jQuery con la referencia
this
en el controlador de eventosonclick
-
Deshabilitar botón en jQuery usando el método
bind()
para asignar el valor correcto aesto
-
Deshabilitar botón en jQuery usando el método
call()
para asignar el valor correcto aesto
- Deshabilitar botón en jQuery con ID de elemento aprovechando la escritura dinámica flexible de JavaScript
-
Deshabilitar botón en jQuery con la propiedad DOM
deshabilitada
usando el método jQuery.prop()
Usaremos el controlador de eventos onclick
con diferentes argumentos como el objeto evento
, la referencia este
y la identificación del elemento
para deshabilitar el botón en jQuery en este tutorial. También encontrará consejos sobre escritura dinámica en argumentos de función, event.target
frente a event.currentTarget
y los métodos jQuery .prop()
frente a .attr()
aquí.
Deshabilite el botón en jQuery pasando el objeto evento
al controlador de eventos onclick
El controlador de eventos onclick
se activa cada vez que hacemos clic en el elemento de destino. De forma predeterminada, la devolución de llamada a onclick
solo toma un argumento, el objeto evento
.
Usemos este argumento predeterminado como nuestro primer método para deshabilitar el botón en jQuery.
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Default event argument</title>
<script type="text/javascript" src="jQuery.js"></script>
<script type="text/javascript">
function disable(e){
$(e.currentTarget).attr("disabled","disabled");
//updating the text to disabled
$(e.currentTarget).html("I am disabled");
}
</script>
<link rel="stylesheet" href="disable_button_jQuery.css">
</head>
<body>
<div id="main">
<button id="disable_me" onclick="disable(event)">Click to disable me</button>
</div>
</body>
</html>
Tenemos un elemento botón
donde adjuntamos un controlador de eventos onclick
. La devolución de llamada toma el argumento de objeto de evento
predeterminado.
Deshabilitamos el botón con la línea de código clave:
$(e.currentTarget).attr("disabled","disabled")
La propiedad currentTarget
del objeto event
identifica el elemento al que se adjunta el controlador de eventos, el elemento button
en nuestro caso.
Finalmente, establecemos el atributo HTML deshabilitado de este elemento botón
en deshabilitado
con el método jQuery .attr()
.
También actualizamos el texto del botón
para mostrar su estado deshabilitado en la siguiente línea de código con el método jQuery .html()
.
Aquí está la demostración de trabajo de esta solución.
Consejo profesional:
La propiedad event target
es similar a la propiedad currentTarget
, pero se refiere al elemento en el que se activa el evento. Esto podría ser diferente cuando el elemento DOM se propaga en casos de burbujeo de eventos.
Por lo tanto, es mejor usar la propiedad currentTarget
en este caso.
Deshabilitar botón en jQuery con la referencia this
en el controlador de eventos onclick
el problema con la referencia predeterminada this
en el controlador de eventos onclick
La palabra clave this
dentro del controlador de eventos onclick
se refiere al elemento en el que se activa. Pero sabemos que la palabra clave JavaScript this
toma su contexto dinámicamente en tiempo de ejecución.
Entonces, por defecto, no se refiere al elemento desencadenante en este caso.
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Default this Keyword</title>
<script type="text/javascript" src="jQuery.js"></script>
<link rel="stylesheet" href="disable_button_jQuery.css"/>
<script type="text/javascript">
function disable(){
console.log("The value of this by default is : " + this);
$(this).attr("disabled","disabled");
}
</script>
</head>
<body>
<div id="main">
<button id="disable_me" onclick="disable()">Click to disable me</button>
</div>
</body>
</html>
Usamos la referencia this
dentro de la función de devolución de llamada onclick
disable
. También registramos el valor del objeto this
para una mejor comprensión.
Veamos la salida de este código a continuación:
Aquí pasaron dos cosas:
- Primero, nuestro código no deshabilitó el botón como queríamos.
- En segundo lugar, cuando miramos el valor de
esto
en la consola, se refiere al objetoventana
. Este es el comportamiento esperado.
A medida que ejecutamos la devolución de llamada disable
fuera de cualquier función en el controlador de eventos en línea, JavaScript remite dinámicamente su palabra clave this
al objeto global window
.
Hay un par de formas de solucionar este problema.
Deshabilitar botón en jQuery usando el método bind()
para asignar el valor correcto a esto
Podemos establecer la referencia de la palabra clave this
en la devolución de llamada disable
del controlador onclick
con el método bind()
.
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Bind method</title>
<script type="text/javascript" src="jQuery.js"></script>
<link rel="stylesheet" href="disable_button_jQuery.css"/>
<script type="text/javascript">
function disable(e){
console.log("The value of 'this' by explicity specifying it with bind method is : " + this);
$(this).attr("disabled","disabled");
//updating the text to disabled
$(this).html("I am disabled");
}
</script>
</head>
<body>
<div id="main">
<button id="disable_me" onclick="disable.bind(this)()">Click to disable me</button>
</div>
</body>
</html>
Establecemos el contexto adecuado con la línea onclick = "disable.bind(this)()"
. Como léxicamente, la palabra clave this
de onclick
se refiere al elemento button
, pasamos this
al método bind()
para establecer este valor como el valor permanente.
Después de esto, el valor de esto
no cambia en tiempo de ejecución.
El resto del código es similar a nuestras soluciones anteriores. Veamos la salida a continuación:
Nuestro código ahora deshabilita el botón como queríamos. Además, el valor de this
en la salida de la consola ahora se refiere a un HTMLButtonElement
.
Gotcha a tener en cuenta
No olvides el par de corchetes después del método .bind()
, así:
onclick = "disable.bind(this)()"
.bind()
envuelve la función subyacente en una nueva función con el nuevo valor this
y devuelve esta función. Por lo tanto, asegúrese de llamar a esta función contenedora con el par de corchetes finales ()
.
Deshabilitar botón en jQuery usando el método call()
para asignar el valor correcto a esto
También podemos asignar el valor correcto a this
cuando lo llamamos con el método call()
. Tenga en cuenta que call()
solo asigna un contexto particular a this
para la llamada de función específica, mientras que .bind()
fija el valor de this
de forma permanente.
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Call method</title>
<script type="text/javascript" src="jQuery.js"></script>
<link rel="stylesheet" href="disable_button_jQuery.css"/>
<script type="text/javascript">
function disable(e){
console.log("The value of 'this' by specicifying it during execution with call method is : " + this);
$(this).attr("disabled","disabled");
//updating the text to disabled
$(this).html("I am disabled");
}
</script>
</head>
<body>
<div id="main">
<button id="disable_me" onclick="disable.call(this)">Click to disable me</button>
</div>
</body>
</html>
Asignamos el valor adecuado de esto
durante la ejecución con el fragmento de código:
onclick = "disable.call(this)"
Ya hemos desglosado la lógica del resto del código anteriormente.
Aquí está la salida de este programa.
Gotcha a tener en cuenta
No hay un par de corchetes finales ()
después del método .call()
aquí. El método .call()
no devuelve una nueva función, como lo hace el método .bind()
.
Solo establece el nuevo contexto this
en la misma llamada de función, por lo que no necesitamos volver a llamarlo con los corchetes al final.
Deshabilitar botón en jQuery con ID de elemento aprovechando la escritura dinámica flexible de JavaScript
Una de las cosas hermosas de JavaScript es su flexibilidad. Puedes hacer que haga lo que quieras con casi el mismo código.
Lo mismo se aplica a las funciones de JavaScript. Cada función en JavaScript puede tomar tantos argumentos como deseemos pasar.
No necesitamos pasar los mismos tipos de datos de argumento que en la definición de la función porque JS es un lenguaje de tipo dinámico.
Aprovechemos esta función de JavaScript para deshabilitar el botón en jQuery con el ID de elemento utilizando un código casi similar al que hemos escrito anteriormente.
Mencionamos que la devolución de llamada al onclick
acepta solo un argumento, el objeto event
, según su definición de función. ¡Pero le pasaremos el argumento del elemento id
, y JavaScript no se quejará!
Aquí está el código mágico:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Using Dynamic Typing</title>
<script type="text/javascript" src="jQuery.js"></script>
<link rel="stylesheet" href="disable_button_jQuery.css"/>
<script type="text/javascript">
function disable(id){ // replace id with e when you want to display the default event object type
$("#"+id).attr("disabled","disabled");
console.log("The type of argument \nwhen we pass the \n'id' type object as argument is : \n"
+ typeof arguments[0]);
// console.log("The type of argument \nwhen we pass the \ndefault 'event' object as argument is : \n"
// + typeof arguments[0]);
//update the text to disabled
$("#"+id).html("I am disabled");
}
</script>
</head>
<body>
<div id="main">
<button id="disable_me" onclick="disable('disable_me')">Click to disable me</button>
</div>
</body>
</html>
Pasamos el id
a la devolución de llamada al controlador de eventos onclick ="disable('disable_me')"
JavaScript nos permite usar este argumento sin quejarnos de que su tipo es diferente al tipo de argumento de evento
codificado de forma rígida en la definición de la función.
Luego lo usamos para establecer el atributo HTML deshabilitado
del elemento botón
en el valor deshabilitado
, así:
$("#" + id).attr("deshabilitado","deshabilitado");
Veamos la salida:
Vemos que nuestro código funciona correctamente. Además, en la salida de la consola a la derecha, el tipo de argumento es una cadena, que es nuestro elemento id
pasado a la devolución de llamada.
Comparemos también el tipo de argumento cuando pasamos el argumento de tipo de evento
predeterminado.
<script type="text/javascript">
function disable(event){ // replace id with e when you want to display the default //event object type
//$("#"+id).attr("disabled","disabled");
// console.log("The type of argument \nwhen we pass the \n'id' type object as //argument is : \n"
// + typeof arguments[0]);
console.log("The type of argument \nwhen we pass the \ndefault 'event' object as argument is : \n"
+ typeof arguments[0]);
//update the text to disabled
// $("#"+id).html("I am disabled");
}
</script>
</head>
<body>
<div id="main">
<button id="disable_me" onclick="disable(event)">Click to disable me</button>
</div>
Aquí está la salida:
Aquí vemos que el tipo de argumento en la consola es objeto
ya que evento
es un objeto en JavaScript.
Deshabilitar botón en jQuery con la propiedad DOM deshabilitada
usando el método jQuery .prop()
Por último, también podemos usar la propiedad DOM deshabilitada
en todas nuestras soluciones anteriores. Esta propiedad corresponde al atributo disabled
de HTML, y podemos acceder a ella con el método .prop()
de jQuery.
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Using prop method</title>
<script type="text/javascript" src="jQuery.js"></script>
<script type="text/javascript">
function disable(e){
$(e.currentTarget).prop("disabled",true);
//updating the text to disabled
$(e.currentTarget).html("I am disabled");
}
</script>
<link rel="stylesheet" href="disable_button_jQuery.css">
</head>
<body>
<div id="main">
<button id="disable_me" onclick="disable(event)">Click to disable me</button>
</div>
</body>
</html>
El código es casi el mismo que usamos para el método usando el argumento predeterminado de evento
anterior. Solo usamos la propiedad DOM disabled
, así:
$(e.currentTarget).prop("disabled",true);
Aquí está la demostración de trabajo:
Gotcha a tener en cuenta
Tenga en cuenta que la propiedad DOM deshabilitada
toma un valor booleano, a diferencia del atributo HTML deshabilitado
, que toma el valor deshabilitado
. Por lo tanto, asegúrese de pasar el valor true
en el método .prop()
para este método.