비활성화 된 입력 이벤트


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.