Що найпростіший спосіб відключити / включити кнопки та посилання (jQuery + Bootstrap)


360

Іноді я використовую якіри, стилізовані як кнопки, а іноді просто використовую кнопки. Я хочу відключити конкретні клікові речі, щоб:

  • Вони виглядають інвалідами
  • Вони перестають клацати

Як я можу це зробити?


дивіться мою публікацію в нижньому кінці, але ось менш описова кнопка $ ("yourSelector"). ("enable"); // увімкнути кнопку або $ ("yourSelector"). button ("відключити"); // відключити кнопку, якщо використовується віджет кнопки від jqueryUI.
El Bayames

У документації BS3 написано, що вона використовується role="button"для посилань, але це, схоже, не впливає на цю проблему. getbootstrap.com/css/#buttons
Джесс

2
З'явившись a.btn[disabled]відключеними, але їх ще не можна натиснути, це помилка в IMO Bootstrap. Атрибут [disabled]повинен відображатися виключеним лише для buttonта input.
Джесс

Відповіді:


575

Кнопки

Кнопки легко відключити, оскільки disabledце властивість кнопок, якими керує браузер:

<input type="submit" class="btn" value="My Input Submit" disabled/>
<input type="button" class="btn" value="My Input Button" disabled/>
<button class="btn" disabled>My Button</button>

Щоб вимкнути їх за допомогою спеціальної функції jQuery, просто скористайтеся fn.extend():

// Disable function
jQuery.fn.extend({
    disable: function(state) {
        return this.each(function() {
            this.disabled = state;
        });
    }
});

// Disabled with:
$('input[type="submit"], input[type="button"], button').disable(true);

// Enabled with:
$('input[type="submit"], input[type="button"], button').disable(false);

Кнопка JSFiddle відключена та демонстрація вводу .

В іншому випадку ви скористаєтесь prop()методом jQuery :

$('button').prop('disabled', true);
$('button').prop('disabled', false);

Якірні теги

Варто зазначити, що disabledце не дійсна властивість для тегів прив’язки. З цієї причини Bootstrap використовує таку стилізацію для своїх .btnелементів:

.btn.disabled, .btn[disabled] {
    cursor: default;
    background-image: none;
    opacity: 0.65;
    filter: alpha(opacity=65);
    -webkit-box-shadow: none;
    -moz-box-shadow: none;
    box-shadow: none;
    color: #333;
    background-color: #E6E6E6;
}

Зверніть увагу, як [disabled]орієнтовано на властивість, а також на .disabledклас. .disabledКлас є те , що потрібно , щоб зробити якір тег з'явиться відключений.

<a href="http://example.com" class="btn">My Link</a>

Звичайно, це не завадить посиланням функціонувати при натисканні. Наведене вище посилання перенесе нас до http://example.com . Щоб запобігти цьому, ми можемо додати в простий фрагмент коду jQuery, щоб націлити теги прив’язки до disabledкласу для виклику event.preventDefault():

$('body').on('click', 'a.disabled', function(event) {
    event.preventDefault();
});

Ми можемо переключити disabledклас за допомогою toggleClass():

jQuery.fn.extend({
    disable: function(state) {
        return this.each(function() {
            var $this = $(this);
            $this.toggleClass('disabled', state);
        });
    }
});

// Disabled with:
$('a').disable(true);

// Enabled with:
$('a').disable(false);

Демо демонстрація посилань JSFiddle .


Комбінований

Потім ми можемо розширити попередню функцію відключення, зроблену вище, щоб перевірити тип елемента, який ми намагаємось відключити is(). Таким чином ми можемо, toggleClass()якщо це не елемент inputчи buttonелемент, або переключити disabledвластивість, якщо вона є:

// Extended disable function
jQuery.fn.extend({
    disable: function(state) {
        return this.each(function() {
            var $this = $(this);
            if($this.is('input, button, textarea, select'))
              this.disabled = state;
            else
              $this.toggleClass('disabled', state);
        });
    }
});

// Disabled on all:
$('input, button, a').disable(true);

// Enabled on all:
$('input, button, a').disable(false);

Повний комбінований JSFiddle демо .

Варто далі зазначити, що вищевказана функція також буде працювати на всіх типах введення.


Дякую за вичерпну відповідь. Перегляньте мою редакцію 1 для версії сценарію кави. Я все ще намагаюся отримати посилання, щоб не натискати. Ви мали на увазі для мене збереження return false if $(@).prop('disabled')у користувальницьких обробниках кліків? Без цього рядка ці обробники запускаються незалежно.
біофрактал

1
Як я вже згадував, @biofractal disabledне є дійсним властивістю тега якоря, тому його не слід використовувати. Подія клацання Я дав заснований на .disabledкласі, але то , що ви можете використовувати це hasClass('disabled')- якщо це правда, preventDefault.
Джеймс Доннеллі

а, добре. Дякую. То чому б мені не створити та використовувати disabledвластивість на якорі. Це динамічний об'єкт, щоб я міг його просто встановити та використовувати, як би я розширював набір функцій якоря? Я оновив свою відповідь нижче, щоб це показати. Як ти гадаєш? Це зло? Також, чи доводиться вам .off()проводити preventDefaultподію натискання, коли ви знову вмикаєте посилання?
біофрактал

Це суперечить специфікації та не пройшло перевірки валідації. Якщо ви хочете користувальницьку disabledвластивість, ви можете використовувати data-*атрибути . Оскільки Bootstrap вже застосовує ті самі disabledстилі властивостей, class="disabled"ви також можете покластись на клас.
Джеймс Доннеллі

Зрозумів - я адаптував свою відповідь, щоб відображати ваші коментарі. Я все ще стурбований тим, що якщо я підключуся preventDefaultдо всіх подій на якірних клацаннях, тоді мені потрібно буде від'єднати їх, коли посилання знову ввімкнено. Або я щось нерозумію?
біофрактал

48

Я не можу думати простіший / простіший спосіб! ;-)


Використання якорних тегів (посилань):

<a href="#delete-modal" class="btn btn-danger" id="delete">Delete</a>

Щоб увімкнути тег Якір:

 $('#delete').removeClass('disabled');
 $('#delete').attr("data-toggle", "modal");

введіть тут опис зображення


Щоб вимкнути тег Якір:

 $('#delete').addClass('disabled');
 $('#delete').removeAttr('data-toggle');

введіть тут опис зображення


27

Припустимо, у вас є текстове поле та кнопка для надсилання,

<input type="text" id="text-field" />
<input type="submit" class="btn" value="Submit"/>

Відключення:

Наприклад, щоб відключити будь-яку кнопку, наприклад, кнопку надіслати, потрібно просто додати відключений атрибут як,

$('input[type="submit"]').attr('disabled','disabled');

Після виконання верхнього рядка, HTML-тег кнопки для надсилання виглядатиме так:

<input type="submit" class="btn" value="Submit" disabled/>

Зауважте, доданий атрибут "вимкнено" .

Увімкнення:

Для активації кнопки, наприклад, коли у вас є текст у текстовому полі. Вам потрібно буде видалити атрибут відключення, щоб увімкнути кнопку як,

 if ($('#text-field').val() != '') {
     $('input[type="submit"]').removeAttr('disabled');
 }

Тепер наведений вище код видалить атрибут 'disabled'.


22

Я знаю, що спізнююсь на вечірку, але щоб конкретно відповісти на два запитання:

"Я просто хочу відключити конкретні клікові речі, щоб:

  • Вони перестають клацати
  • Вони виглядають інвалідами

Наскільки це важко? "

Вони перестають клацати

1. Для кнопок подобається <button>або <input type="button">додати атрибут: disabled.

<button type="submit" disabled>Register</button>
<input type="button" value="Register" disabled>

2. Для посилань, будь-якого посилання ... насправді, будь-який HTML-елемент, ви можете використовувати події вказівника CSS3 .

.selector { pointer-events:none; }

Підтримка браузера подій вказівника дивовижна сьогоднішнім рівнем сучасності (5.12.14). Але нам зазвичай доводиться підтримувати застарілі браузери у царині IE, тому IE10 і нижче НЕ підтримують події вказівника: http://caniuse.com/pointer-events . Тож використання одного з рішень JavaScript, згаданих іншими тут, може стати способом використання застарілих браузерів.

Детальніше про події вказівника:

Вони виглядають інвалідами

Очевидно, що це відповідь CSS, так що:

1. Для кнопок на кшталт <button>або <input type="button">використання [attribute]селектора:

button[disabled] { ... }

input[type=button][disabled] { ... }

-

Ось основна демонстрація матеріалів, про які я згадав тут: http://jsfiddle.net/bXm5B/4/

Сподіваюсь, це допомагає.


17

Якщо, як і я, ви просто хочете відключити кнопку, не пропустіть просту відповідь, тонко приховану в цій довгій нитці:

 $("#button").prop('disabled', true);

справжній герой, це все, що мені потрібно.
рик

7

@James Donnelly надав вичерпну відповідь, яка спирається на розширення jQuery з новою функцією. Це відмінна ідея, тому я збираюся адаптувати його код, щоб він працював так, як мені потрібно.

Розширення jQuery

$.fn.disable=-> setState $(@), true
$.fn.enable =-> setState $(@), false
$.fn.isDisabled =-> $(@).hasClass 'disabled'

setState=($el, state) ->
    $el.each ->
        $(@).prop('disabled', state) if $(@).is 'button, input'
        if state then $(@).addClass('disabled') else $(@).removeClass('disabled')

    $('body').on('click', 'a.disabled', -> false)

Використання

$('.btn-stateful').disable()
$('#my-anchor').enable()

Код буде обробляти один елемент або список елементів.

Кнопки та введення підтримують disabledвластивість, і якщо вони встановлені true, вони виглядатимуть відключеними (завдяки завантажувальній програмі) і не натискатимуть при натисканні.

Якорі не підтримують вимкнено властивість, тому замість цього ми будемо покладатися на .disabledклас, щоб вони виглядали відключеними (завдяки знову завантажувальній програмі) та підключили подію натискання за замовчуванням, що запобігає натисканню, повертаючи помилкові (не потрібно preventDefaultдивитись тут ) .

Примітка . Не потрібно знімати цю подію під час повторного ввімкнення якорів. Просто вилучення .disabledкласу робить трюк.

Звичайно, це не допомагає, якщо ви додали до посилання спеціальний обробник кліків, що дуже часто зустрічається при використанні завантажувального і jQuery. Тож для вирішення цього питання ми використовуємо isDisabled()розширення для тестування .disabledкласу, наприклад:

$('#my-anchor').click -> 
    return false if $(@).isDisabled()
    # do something useful

Я сподіваюся, що це допоможе трохи спростити речі.


7

Зауважте, що існує дивна проблема, якщо ви використовуєте JS-кнопки Bootstrap і стан "завантаження". Я не знаю, чому це відбувається, але ось як це виправити.

Скажіть, у вас є кнопка, і ви встановите її в стан завантаження:

var myButton = $('#myBootstrapButton');
myButton.button('loading');

Тепер ви хочете вийняти його з стану завантаження, але також відключити його (наприклад, кнопка була кнопкою "Зберегти"; стан завантаження вказував на поточну перевірку, а перевірку не вдалося). Це виглядає як розумний Bootstrap JS:

myButton.button('reset').prop('disabled', true); // DOES NOT WORK

На жаль, це скине кнопку, але не відключить її. Мабуть, button()виконує якесь запізніле завдання. Тож вам також доведеться відкласти своє відключення:

myButton.button('reset');
setTimeout(function() { myButton.prop('disabled', true); }, 0);

Трохи дратує, але це шаблон, який я багато використовую.


6

Чудова відповідь та внесок від усіх! Мені довелося трохи розширити цю функцію, щоб включити відключення вибраних елементів:

jQuery.fn.extend({
disable: function (state) {
    return this.each(function () {
        var $this = jQuery(this);
        if ($this.is('input, button'))
            this.disabled = state;
        else if ($this.is('select') && state)
            $this.attr('disabled', 'disabled');
        else if ($this.is('select') && !state)
            $this.removeAttr('disabled');
        else
            $this.toggleClass('disabled', state);
    });
}});

Здається, це працює для мене. Дякую всім!


5

Для такої поведінки я завжди використовую buttonвіджет jQueryUI , я використовую його для посилань та кнопок.

Визначте тег у HTML:

<button id="sampleButton">Sample Button</button>
<a id="linkButton" href="yourHttpReferenceHere">Link Button</a>

Використовуйте jQuery для ініціалізації кнопок:

$("#sampleButton").button();
$("#linkButton").button();

Використовуйте buttonметоди віджетів, щоб їх відключити / включити:

$("#sampleButton").button("enable"); //enable the button
$("#linkButton").button("disable"); //disable the button

Це допоможе подбати про поведінку кнопки та курсору, але якщо вам потрібно заглибитися та змінити стиль кнопки при відключенні, перезапишіть наступні класи CSS у вашому файлі стилю CSS.

.ui-state-disabled,
.ui-widget-content .ui-state-disabled,
.ui-widget-header .ui-state-disabled {
      background-color:aqua;
      color:black;
 }

Але пам’ятайте: ці класи CSS (якщо вони змінені) змінять стиль і для інших віджетів.


1
Досить впевнений, що ця відповідь стосується кнопок інтерфейсу jQuery, а не для кнопок Bootstrap, які використовуються із звичайною ванільною jQuery, останньою є те, що використовується ОП. Btw, додаючи відповідь у коментарі до питання, не є кращим методом поширення. ; ^)
ruffin

3

Наступне дуже добре працювало для мене:

$("#button").attr('disabled', 'disabled');

2

Це досить пізня відповідь, проте я натрапив на це питання, шукаючи спосіб відключити кнопки завантаження після натискання на них і, можливо, додати приємний ефект (наприклад, спінер). Я знайшов чудову бібліотеку, яка робить саме це:

http://msurguy.github.io/ladda-bootstrap/

Ви просто включаєте необхідні css та js, додаєте деякі властивості до своїх кнопок та включаєте lada за допомогою JavaScript ... Presto! У ваших кнопок з’явилося нове життя (перевірте демонстрацію, щоб побачити, як це красиво)!


2

Це вище не працює, бо іноді

$(this).attr('checked') == undefined

коригуйте свій код за допомогою

if(!$(this).attr('checked') || $(this).attr('checked') == false){

2

Я знаю, що моя відповідь запізнюється, але IMO це найпростіший спосіб переключити кнопку "включити" та кнопку "відключити"

function toggleButtonState(button){

  //If button is enabled, -> Disable
  if (button.disabled === false) {
    button.disabled = true;

  //If button is disabled, -> Enable
  } else if (button.disabled === true) {
    button.disabled = false;
  }
}

1

Припустимо, у вас на сторінці такі кнопки, як:

<input type="submit" class="byBtn" disabled="disabled" value="Change"/>
<input type="submit" class="byBtn" disabled="disabled" value="Change"/>
<input type="submit" class="byBtn" disabled="disabled" value="Change"/>
<input type="submit" class="byBtn" disabled="disabled" value="Change"/>
<input type="submit" class="byBtn" disabled="disabled" value="Change"/>
<input type="submit"value="Enable All" onclick="change()"/>

Код js:

function change(){
   var toenable = document.querySelectorAll(".byBtn");        
    for (var k in toenable){
         toenable[k].removeAttribute("disabled");
    }
}

1

Скажіть, у вас це виглядає так, як це в даний час увімкнено.

<button id="btnSave" class="btn btn-info">Save</button>

Просто додайте це:

$("#btnSave").prop('disabled', true);

і ви отримаєте це, що відключить кнопку

<button id="btnSave" class="btn btn-primary" disabled>Save</button>

2
Питання про кнопки та анкери. disabledВластивість не є допустимим властивістю для якірних тегів.
біофрактал

0

Якщо ви хочете відключити функцію натискання, ви також можете додати вбудовану в HTML

style="cursor: not-allowed;"
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.