Cómo evitar que los botones permanezcan presionados con Bootstrap 3

79

¿Cómo se hace que un botón en Bootstrap 3 se desactive automáticamente después de hacer clic?

Para replicar mi problema, crea una página con algunos botones, dales las clases de arranque apropiadas (e incluye bootstrap):

<input id="one" type="button" class="btn btn-default" value="one">
<input id="two" type="button" class="btn btn-primary" value="two">

Cargue la página y haga clic en uno de los botones. Se deprime y se resalta hasta que hace clic en otro lugar de la página (usando FF29 y chrome35beta).

Inspeccionar el elemento de entrada mientras se hace clic y no se hace clic no muestra ninguna clase adicional adjunta y eliminada de él.

Aquí hay un ejemplo de botones de Bootstrap que permanecen presionados: http://jsfiddle.net/52VtD/5166/

Robert Byers
fuente

Respuestas:

100

En su ejemplo, los botones no permanecen presionados. Se mantienen concentrados . Si desea ver la diferencia, haga lo siguiente:

  1. Haga clic y mantenga presionado un botón.
  2. Lanzamiento. Verás que cuando sueltas el mouse, la apariencia del botón cambia ligeramente, porque ya no se presiona.

Si no desea que sus botones se mantengan enfocados después de soltarlos, puede indicarle al navegador que los quite el foco cada vez que suelte el mouse.

Ejemplo

Este ejemplo usa jQuery pero puede lograr el mismo efecto con JavaScript vanilla.

$(".btn").mouseup(function(){
    $(this).blur();
})

Violín

abl
fuente
25

O simplemente puede usar una etiqueta de anclaje que puede tener exactamente el mismo estilo, pero como no es un elemento de formulario, no retiene el foco:

<a href="#" role="button" class="btn btn-default">one</a>.

Consulte la sección de elementos de anclaje aquí: http://getbootstrap.com/css/#buttons

jme11
fuente
Creo que es una mejor solución que el método blur (). En muchos navegadores, aparecerá un destello del estilo de enfoque con el método de desenfoque () que es posible que no desee. Una idea sería usar un elemento <span> en lugar de un ancla que apunte a un fragid vacío, ya que esto puede causar un comportamiento de desplazamiento hacia la parte superior. Aquí hay un violín que compara los tres.
David K.
14
este método no funcionó para mí. Todavía obtengo un elemento de botón enfocado usando la etiqueta de anclaje
Hinrich
7
Una prueba rápida en Chrome y Firefox actuales muestra que funciona para una etiqueta de anclaje sin un href ( <a role="button" class="btn btn-default">yada</a>), pero permanece seleccionado si tiene un href (según el ejemplo de @ jme11). Hubiera pensado que un ancla sin href no era válido, pero la consistencia entre Chrome y Firefox lo hace atractivo, oh, y también funciona en IE11 sin un href.
Typhlosaurus
1
@Typhlosaurus: una hrefetiqueta de ancla -less es HTML 5 válido: "Si el aelemento no tiene ningún hrefatributo, entonces el elemento representa un marcador de posición para el lugar donde un enlace podría haberse colocado" ( especificación W3C HTML 5 ). El enfoque funcionó bien para mí, sin los posibles efectos secundarios de vincular a un fragid vacío.
Daniel Saner
11

El botón permanece enfocado. Para eliminar esto de manera eficiente, puede agregar este código de consulta a su proyecto.

$(document).ready(function () {
  $(".btn").click(function(event) {
    // Removes focus of the button.
    $(this).blur();
  });
});

Esto también funciona para enlaces de anclaje

$(document).ready(function () {
  $(".navbar-nav li a").click(function(event) {
    // Removes focus of the anchor link.
    $(this).blur();
  });
});
chris31389
fuente
Esta respuesta funcionó para mí después de que me retirara eventde click(function()).
Diaa
9

Mi preferencia:

<button onmousedown="event.preventDefault()" class="btn">Calculate</button>
Drazen Bjelovuk
fuente
8

O forma angular:

function blurElemDirective() {
  return {
    restrict: 'E',
    link: function (scope, element, attrs) {
      element.bind('click', function () {
        element.blur();
      });
    }
  };
}

app.directive('button', blurElemDirective);
app.directive('_MORE_ELEMENT_', blurElemDirective);

Reemplaza _MORE_ELEMENT_ con tus otros elementos.

O forma de atributo:

function blurElemDirective() {
  return {
    restrict: 'A',
    link: function (scope, element, attrs) {
      element.bind('click', function () {
        element.blur();
      });
    }
  };
}

app.directive('blurMe', blurElemDirective);

Luego agregue el atributo a su elemento html: blur-me

<button blur-me></button>
naorz
fuente
1
Esto me llevó en la dirección correcta, pero arrojó el siguiente error y element.blur() is not a functionasí lo hiceevent.target.blur()
Andrei
¡No olvide desvincular a ese oyente cuando se destruya la directiva!
Peter Kirby
@PeterKirby, si se vincula directamente al nodo html, ¿no se destruirá automáticamente?
Stalinko
3

Es el foco del navegador ya que es un elemento de formulario ( input). Puede quitar fácilmente el enfoque con un poco de CSS

input:focus {
    outline: 0;
}

Aquí está el violín con su ejemplo: http://jsfiddle.net/52VtD/5167/

EDITAR

Ah, acabo de ver ahora que el color del botón también cambia. Bootstrap cambia el botón de, por ejemplo, su btn-defaultbotón con este CSS:

.btn-default:focus {
    color: #333;
    background-color: #ebebeb;
    border-color: #adadad;
}

Si no desea este comportamiento, simplemente sobrescríbalo con su css.

Anthony Weber
fuente
1

Esto tiene que ver con los estados de los elementos :activey :focus. Necesita modificar los estilos de esos estados para estos botones. Por ejemplo, para el botón predeterminado:

.btn-default:focus, .btn-default:active, .btn-default.active, .open .dropdown-toggle.btn-default {
    color: #333;
    background-color: #ccc;
    border-color: #fff;
}
rnevius
fuente