Як зупинити натискання кнопок за допомогою Bootstrap 3


79

Як автоматично натиснути на кнопку в Bootstrap 3 undepress після натискання?

Щоб повторити мою проблему, створіть сторінку з деякими кнопками, надайте їм відповідні класи завантаження (і включіть завантаження):

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

Завантажте сторінку та натисніть на одну з кнопок. Вона стає натиснутою та виділеною, доки ви не клацнете де-небудь ще на сторінці (за допомогою FF29 та chrome35beta).

Перевірка вхідного елемента під час натискання та вилучення не показує додаткових класів, які приєднуються та видаляються з нього.

Ось приклад того, як кнопки Bootstrap залишаються в натиснутому стані: http://jsfiddle.net/52VtD/5166/

Відповіді:


100

У вашому прикладі кнопки не залишаються натиснутими. Вони залишаються зосередженими . Якщо ви хочете побачити різницю, виконайте наступне:

  1. Натисніть і утримуйте кнопку.
  2. Звільнення. Ви побачите, що коли ви відпускаєте мишу, зовнішній вигляд кнопки дещо змінюється, оскільки вона більше не натискається.

Якщо ви не хочете, щоб ваші кнопки залишалися сфокусованими після відпускання, ви можете доручити браузеру знімати фокус з них щоразу, коли ви відпускаєте мишу.

Приклад

У цьому прикладі використовується jQuery, але ви можете досягти такого ж ефекту за допомогою ванільного JavaScript.

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

Скрипка


25

Або ви можете просто використовувати прив'язувальний тег, який можна стилізувати точно так само, але оскільки це не елемент форми, він не зберігає фокус:

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

Дивіться розділ Anchor element тут: http://getbootstrap.com/css/#buttons


Я думаю, це краще рішення, ніж метод blur (). У багатьох браузерах з’являється спалах стилю фокусування за допомогою методу blur (), який вам може не сподобатися. Однією з думок було б використовувати елемент <span> замість якоря, що вказує на порожній жорсткий, оскільки це може спричинити прокручування до верхньої поведінки. Ось скрипка порівняння трьох.
Девід К.

14
цей метод у мене не спрацював. я все ще отримую сфокусований елемент кнопки, використовуючи тег прив’язки
Гінріх,

7
Швидкий тест у поточному chrome та firefox показує, що він працює для прив'язки тегу без href ( <a role="button" class="btn btn-default">yada</a>), але залишається вибраним, якщо він має href (як на прикладі @ jme11). Я б подумав, що прив'язка без HREF є недійсною, але узгодженість між chrome та firefox робить це привабливим - о, і це працює в IE11 і без href.
Тифлозавр

1
@Typhlosaurus: hrefтег -less anchor є дійсним HTML 5: "Якщо aелемент не має hrefатрибута, тоді елемент являє собою заповнювач місця, де посилання могло бути розміщено в іншому випадку" ( специфікація W3C HTML 5 ). Підхід для мене спрацював нормально, без потенційних побічних ефектів прив’язки до порожнього непомітного.
Даніель Санер,

11

Кнопка залишається сфокусованою. Щоб це ефективно видалити, ви можете додати цей код запиту до свого проекту.

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

Це також працює для якірних посилань

$(document).ready(function () {
  $(".navbar-nav li a").click(function(event) {
    // Removes focus of the anchor link.
    $(this).blur();
  });
});

Ця відповідь працював для мене після того, як я зняв eventз click(function()).
Diaa


8

Або кутовий спосіб:

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);

Замінити _MORE_ELEMENT_ іншими елементами.

Або спосіб атрибуту:

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

app.directive('blurMe', blurElemDirective);

Потім додайте атрибут до свого елемента html: blur-me

<button blur-me></button>

1
Це привело мене в правильному напрямку, але я викинув таку помилку, element.blur() is not a functionтому я і зробивevent.target.blur()
татандрей

Не забудьте розв'язати слухача, коли директива знищена!
Пітер Кірбі,

@PeterKirby, якщо він прив'язується безпосередньо до html-вузла, він не буде знищений автоматично?
Сталінко

3

Це фокус браузера, оскільки це елемент форми ( input). Ви можете легко зняти фокусування за допомогою невеликого css

input:focus {
    outline: 0;
}

Ось скрипка з вашим прикладом: http://jsfiddle.net/52VtD/5167/

РЕДАГУВАТИ

Ах, я щойно побачив, що колір самої кнопки теж змінюється. Bootstrap змінює кнопку, наприклад, вашої btn-defaultкнопки за допомогою цього css:

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

Якщо ви не хочете такої поведінки, просто перепишіть її своїм css.


1

Це пов’язано із станами :activeта :focusелементами. Вам потрібно змінити стилі для цих станів для цих кнопок. Наприклад, для кнопки за замовчуванням:

.btn-default:focus, .btn-default:active, .btn-default.active, .open .dropdown-toggle.btn-default {
    color: #333;
    background-color: #ccc;
    border-color: #fff;
}
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.