비활성화 된 입력 이벤트


234

분명히 장애인 <input>은 어떤 이벤트로도 처리되지 않습니다.

이 문제를 해결하는 방법이 있습니까?

<input type="text" disabled="disabled" name="test" value="test" />
$(':input').click(function () {
    $(this).removeAttr('disabled');
})

여기서 입력을 클릭하여 활성화해야합니다. 그러나 활성화하지 않으면 입력이 게시되지 않아야합니다.


여기에 좋은 대안이다 blog.pengoworks.com/index.cfm/2010/4/23/...

CSS-pretend-disable을 사용하고 onSubmit 핸들러의 입력을 반복하여 활성화되지 않은 입력을 실제로 비활성화 할 수 있습니다.
— ptrk

답변:


267

비활성화 된 요소는 마우스 이벤트를 발생시키지 않습니다. 대부분의 브라우저는 비활성화 된 요소에서 시작된 이벤트를 DOM 트리까지 전파하므로 이벤트 핸들러는 컨테이너 요소에 배치 될 수 있습니다. 그러나 Firefox는이 동작을 나타내지 않으며 비활성화 된 요소를 클릭 할 때 아무 것도 수행하지 않습니다.

더 나은 솔루션을 생각할 수는 없지만 완벽한 크로스 브라우저 호환성을 위해 비활성화 된 입력 앞에 요소를 배치하고 해당 요소를 클릭 할 수 있습니다. 다음은 내가 의미하는 바의 예입니다.

<div style="display:inline-block; position:relative;">
  <input type="text" disabled />
  <div style="position:absolute; left:0; right:0; top:0; bottom:0;"></div>
</div>​

jq :

$("div > div").click(function (evt) {
    $(this).hide().prev("input[disabled]").prop("disabled", false).focus();
});​

예 : http://jsfiddle.net/RXqAm/170/ ( prop대신 jQuery 1.7을 사용하도록 업데이트 attr)


2
작은 것 : disabled값이없는 속성을 사용 하는 경우 XHTML이 아닌 HTML을 의미하므로 닫는 슬래시가 필요하지 않습니다.
— Tim Down

11
@Tim : 실제로는 불필요하지만 여전히 유효한 HTML입니다. 그것은 단지 습관의 힘일 뿐이고 나는 그것이 더 좋아 보인다고 느낍니다.
— Andy E

1
Thx Andy, 이것은 꽤 똑똑합니다. 더 간단하지 않습니까? desabled 입력을 처리 할 수없는 이유를 알고 있습니까?
— Pierre de LESPINAY

2
이것은 이해가되지 않습니다 : 다른 HTML 요소 핸들 마우스 이벤트를, 왜 장애인 요소 (예. mouseenter, 등)
— 아우구스틴 Riedinger

7
input[disabled] {pointer-events:none}CSS를 사용하여 사용 중지 된 요소가 클릭을 "버릴"수 없도록 중지 할 수 있습니다 . 그러면 부모 요소를 클릭 한 것처럼 클릭이 동작합니다. IMHO 이것은 가장 간단하고 깨끗한 솔루션이지만 불행히도 pointer-eventsCSS 속성 을 지원하는 브라우저에서만 작동 합니다. caniuse.com/#search=pointer-events
— Doin

70

어쩌면 필드를 읽기 전용으로 만들 수 있고 제출시 모든 읽기 전용 필드를 비활성화 할 수 있습니다

$(".myform").submit(function(e) {
    $("input[readonly]", this).attr("disabled", true);
});

입력 (+ 스크립트)은

<input type="text" readonly="readonly" name="test" value="test" />

$('input[readonly]').click(function () {
    $(this).removeAttr('readonly');
})

5
+1, 이것은 적절한 대안 제안입니다. 유일한 단점은 입력 상자가 비활성화 된 스타일을 취하지 않는다는 것입니다.이 스타일은 브라우저마다 다르므로 사용자의 비활성화 된 입력에 대한 기대와 일치하기 어렵습니다.
— Andy E

진실. 아마도 이것은 CSS로 해결할 수 있습니까? 그러나 네, 일반적인
— diabled

탁월한 대안 솔루션. CSS를 사용하여 필요한 스타일링을 수행 할 수 있기 때문에 (즉, 사용하지 않도록 설정) 여전히 이벤트를 사용할 수 있기 때문에이 기능이 더 좋습니다.
— Joshua

62

비활성화 된 요소는 일부 브라우저에서 클릭을 "먹습니다"-응답하지 않으며 요소 나 컨테이너의 어느 곳에서나 이벤트 처리기에서 캡처 할 수 없습니다.

IMHO가 이것을 간단하게 수정하는 가장 간단하고 깨끗한 방법 (실제로 OP처럼 비활성화 된 요소에 대한 클릭을 캡처해야하는 경우)은 다음 CSS를 페이지에 추가하는 것입니다.

input[disabled] {pointer-events:none}

비활성화 된 입력을 클릭하면 부모 요소로 넘어 가서 정상적으로 캡처 할 수 있습니다. (여러 개의 비활성화 된 입력이있는 경우, 각각이 별도의 <span>또는 <div>, 예를 들어-비활성화 된 입력을 쉽게 구별 할 수 있도록 그러한 방식으로 배치되지 않은 경우 각 컨테이너를 개별 컨테이너에 넣기를 원할 수 있습니다) 클릭).


단점은 불행히도이 속임수는 pointer-eventsCSS 속성을 지원하지 않는 구형 브라우저에서는 작동하지 않는다는 것 입니다. (IE 11, FF v3.6, Chrome v4에서 작동해야 함) : caniuse.com/#search=pointer-events

구형 브라우저를 지원해야하는 경우 다른 답변 중 하나를 사용해야합니다!


input[disabled]JavaScript ( element.disabled = true;)에 의해 비활성화 된 요소와 일치 하는지 확실 하지 않지만 그렇게 보입니다. 어쨌든, 나는 input:disabled더 깨끗합니다.
— Martin

이것은 좋은 해결책 인 것 같습니다 .IE11에서는 작동하지 않습니다! 또한 FF 38+ 및 Chrome 31+라고 말하지만 캐니 우스 링크에 FF 3.6+ 및 Chrome 4+라고 표시되어 있습니까?
— user764754

@ user764754 ... 내 실수로, 이전 브라우저 버전을 얻으려면 캐니 우스 페이지에서 "모두 표시"를 클릭해야한다는 것을 몰랐습니다! 그 문제를 해결했습니다. IE11의 경우 방금 테스트했으며 제대로 작동합니다 ( 코드 는 jsfiddle.net/7kkszq1c/1 참조) . htm 파일 대신)
— Doin

업데이트 해 주셔서 감사합니다! 그동안 IE11의 웹 사이트에서는 작동하지만 jsfiddle에서는 작동하지 않는 것으로 나타났습니다. 아마도 jsfiddle iframe 때문에 ...
— user764754

2
@Protectorone : disabled는 CSS 3 이후 의사 클래스입니다. w3.org/TR/css3-selectors/#UIstates
— Martin

15

CSS를 사용하는 대안을 제안합니다.

input.disabled {
    user-select : none;
    -moz-user-select : none;
    -webkit-user-select : none;
    color: gray;
    cursor: pointer;
}

disabled 속성 대신 그런 다음 자체 CSS 속성을 추가하여 비활성화 된 입력을 시뮬레이트 할 수 있지만 더 많은 제어가 가능합니다.


4
ie10에서만 작동하며 너무 많은 사용자가 ie9 / 8을 가지고 있으므로 신뢰할 수있는 대안이 아닙니다.
— 인코딩

이로 인해 양식을 제출할 때 필드가 계속 게시되므로 많은 경우에 바람직하지 않습니다.
— cimmanon

7

$(function() {

  $("input:disabled").closest("div").click(function() {
    $(this).find("input:disabled").attr("disabled", false).focus();
  });

});
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.7.2/jquery.min.js"></script>

<div>
  <input type="text" disabled />
</div>


5
그러나 이것은 FireFox에서는 작동하지 않습니다. 이것이 요점입니다!
— GarethOwen

6

대신을 disabled사용하는 것을 고려할 수 readonly있습니다. 몇 가지 추가 CSS를 사용하면 disabled필드 처럼 보이도록 입력 스타일을 지정할 수 있습니다 .

실제로 다른 문제가 있습니다. change요소가 포커스를 잃을 때만 이벤트가 트리거되는데, 이는 disabled필드를 고려하는 논리가 아닙니다 . 아마도 다른 호출에서이 필드로 데이터를 푸시하고있을 것입니다. 이 작업을 수행하려면 '바인드'이벤트를 사용할 수 있습니다.

$('form').bind('change', 'input', function () {
    console.log('Do your thing.');
});

내가 실수하지 않으면 읽기 전용 입력이 여전히 양식과 함께 제출됩니다.
— Pierre de LESPINAY

맞습니다. 그런 다음 @npth anwsner와 결합해야합니다.
— Nykac

고마워, 그것은 나의 경우에 똑똑하고 깨끗했습니다.
— 술탄 노스

4

또는 jQuery와 CSS 로이 작업을 수행하십시오!

$('input.disabled').attr('ignore','true').css({
    'pointer-events':'none',
     'color': 'gray'
});

이렇게하면 요소를 비활성화하고 포인터 이벤트가 발생하지 않지만 전파가 가능하며 제출되면 'ignore'속성을 사용하여 무시할 수 있습니다.


@Precastic, 그건 사실이지만,이 시점에서 거의 모든 다른 브라우저에서 작동하며 <11 등 의 polyfill을 사용할 수 있습니다 . sidonaldson, 스타일을 적용하기 위해 직접 CSS를 사용하지 않겠습니까?
— KyleMit

@KyleMit 스타일을 설정하는 대신 클래스를 추가 할 수는 있지만 이것이 스레드가 아닙니다! 나는 당신이 만들고있는 브라우저 매트릭스에 따라 여전히 정확하고 올바른 대답 인 포인터 이벤트 만 제안하고있었습니다. 그리고이 대답을 표시 한 모든 사람들에게 감사합니다.
— sidonaldson

1
@sidonaldson, 좋은 답변이므로 순위가 더 높기를 바랍니다. 난 반드시이 속성이하는 무시 것이 아닙니다 . 그러나 CSS에 대한 나의 요점은 CSS를 적용하는 수단으로 jQuery가 필요하다고 생각하지 않는다는 것입니다. 동일한 선택자를 대상으로하고 CSS 이벤트를 비활성화하는 CSS 규칙을 설정할 수 있습니다. 이 바이올린 에서 jQuery와 CSS는 동일한 작업을 수행해야하지만 CSS는 훨씬 성능이 좋습니다.
— KyleMit

@KyleMit ah, 양식이 제출되었다고 가정하면 백엔드에 값을 포함하는 경우 해당 필드를 무시하도록 백엔드에 알려 주어야합니다 (스푸핑이 비활성화되어 있기 때문에).
— sidonaldson

속성을 기반으로 선택기를 사용할 수 있으므로 CSS가 더 강력 할 수 있다는 데 동의합니다! jsfiddle.net/KyleMit/pxx8pk6v
— sidonaldson

0

우리는 오늘 이와 같은 문제를 겪었지만 HTML을 바꾸고 싶지 않았습니다. 우리는 mouseenter 이벤트를 사용 하여

var doThingsOnClick = function() {
    // your click function here
};

$(document).on({
    'mouseenter': function () {
        $(this).removeAttr('disabled').bind('click', doThingsOnClick);
    },
    'mouseleave': function () {
        $(this).unbind('click', doThingsOnClick).attr('disabled', 'disabled');
    },
}, 'input.disabled');

-1

다른 해결책을 찾았습니다.

<input type="text" class="disabled" name="test" value="test" />

클래스 "disabled"는 비활성화 된 요소를 불투명도로 모방합니다.

<style type="text/css">
    input.disabled {
        opacity: 0.5;
    }
</style>

요소가 비활성화되어 있으면 이벤트를 취소하고 클래스를 제거하십시오.

$(document).on('click','input.disabled',function(event) {
    event.preventDefault();
    $(this).removeClass('disabled');
});

JavaScript 부분이 작동하지 않습니다. 그 외에도 비활성화 된 입력을 활성화하는 것과 관련하여 질문에 대답하지 않습니다. 그러나이 예제에서는 시작시 비활성화되지 않으므로 제출시 전송됩니다.
— Raimund Krämer

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