버튼과 링크를 비활성화 / 활성화하는 가장 쉬운 방법은 무엇입니까 (jQuery + Bootstrap)


360

때로는 버튼으로 스타일이 지정된 앵커를 사용하고 때로는 버튼 만 사용합니다. 특정 클릭 콘텐츠를 비활성화하고 싶습니다.

  • 그들은 장애인 보인다
  • 클릭이 중지됩니다

어떻게해야합니까?


하단에서 내 게시물을 참조하십시오. 그러나 여기에 덜 설명적인 $ ( "yourSelector"). button ( "enable"); // 버튼 또는 $ ( "yourSelector"). button ( "disable"); // jqueryUI의 버튼 위젯을 사용하는 경우 버튼을 비활성화합니다.
El Bayames

BS3 설명서에는 role="button"링크 에 사용한다고 나와 있지만이 문제에는 영향을 미치지 않습니다. getbootstrap.com/css/#buttons
Jess

2
a.btn[disabled]사용할 수 표시 아직 클릭을 유지하는 것은 IMO 부트 스트랩의 버그입니다. 이 속성 [disabled]button및에 대해서만 비활성화 된 것으로 나타납니다 input.
Jess

답변:


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 비활성화 버튼 및 입력 데모 .

그렇지 않으면 jQuery의 prop()메소드를 사용합니다.

$('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으로 연결됩니다 . 이를 방지하기 위해 disabled호출 할 클래스로 앵커 태그를 대상으로하는 간단한 jQuery 코드를 추가 할 수 있습니다 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')맞춤 클릭 핸들러 를 유지해야 합니까? 해당 줄이 없으면 해당 처리기는 관계없이 실행됩니다.
biofractal

1
앞에서 언급 한 @biofractal disabled은 유효한 앵커 태그 속성이 아니므로 사용해서는 안됩니다. 내가 제공 한 클릭 이벤트는 .disabled클래스를 기반으로 하지만 사용할 수있는 것은 hasClass('disabled')-참인 경우입니다 preventDefault.
James Donnelly

그래. 감사. 왜 disabled앵커 에서 속성을 만들고 사용해서는 안 됩니까? 앵커의 기능 세트를 확장하는 것처럼 동적 객체로 설정하고 사용할 수 있습니까? 이것을 보여주기 위해 아래 답변을 업데이트했습니다. 어떻게 생각해? 사악한가요? 또한, 당신이해야 할 당신이 링크를 다시 활성화 할 때 클릭 이벤트? .off()preventDefault
biofractal

사양에 위배되며 유효성 검사 테스트를 통과하지 못합니다. 사용자 지정하려면 disabled속성을 사용하면 사용 할 수 있습니다 data-*속성 . 부트 스트랩은 이미 동일한 disabled속성 스타일을 적용 class="disabled"하므로 클래스에 의존 할 수도 있습니다.
James Donnelly

알겠습니다-귀하의 의견을 반영하여 답변을 수정했습니다. preventDefault모든 앵커 클릭 이벤트에 연결하면 링크를 다시 활성화 할 때 이벤트를 분리해야 한다고 걱정합니다 . 아니면 뭔가 오해하고 있습니까?
biofractal

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/>

'disabled'속성이 추가되었습니다 .

활성화 :

텍스트 필드에 텍스트가있을 때와 같은 활성화 버튼 다음과 같이 disable 버튼을 활성화 하려면 disable 속성 을 제거해야합니다 .

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

진짜 영웅, 이것이 내가 필요한 전부입니다.
Ricks

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 버튼과 '로드 중'상태를 사용하는 경우 이상한 문제가 있습니다. 왜 이런 일이 발생하는지 모르겠지만 문제를 해결하는 방법은 다음과 같습니다.

버튼이 있고 로딩 상태로 설정했다고 가정 해보십시오.

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

이제로드 상태에서 꺼내고 비활성화 할 수도 있습니다 (예 : 버튼은 저장 버튼,로드 상태는 진행중인 유효성 검사를 나타내며 유효성 검사에 실패했습니다). 이것은 합리적인 부트 스트랩 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

이러한 종류의 동작을 위해 항상 jQueryUI button위젯을 사용하고 링크 및 버튼에 사용합니다.

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를 UI 버튼하지 에 대한 부트 스트랩 버튼 일반 바닐라 jQuery를, 영업가 사용하는 어떤 후자와 함께 사용. Btw, 질문에 대한 의견에 답을하는 것은 선호되는 보급 방법이 아닙니다. ; ^)
ruffin

3

다음은 저에게 매우 효과적이었습니다.

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

2

이것은 다소 늦은 답변이지만 부스트 랩 버튼을 클릭 한 후 비활성화하고 멋진 효과를 추가하는 방법 (스피너)을 찾는 동안이 질문에 우연히 빠져 들었습니다. 나는 그것을 정확하게하는 훌륭한 도서관을 발견했다.

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

당신은 필요한 CSS와 JS를 포함하고, 버튼에 몇 가지 속성을 추가하고, 자바 스크립트로 lada를 활성화합니다 ... 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속성은 앵커 태그에 유효한 속성이 아닙니다.
biofractal

0

클릭 할 수있는 기능을 비활성화하려면 html로 인라인을 추가 할 수도 있습니다

style="cursor: not-allowed;"
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.