jQuery를 사용하여 event.preventDefault ()를 호출하는 리스너를 바인딩 해제하는 방법은 무엇입니까?


128

jquery 토글은 기본적으로 preventDefault ()를 호출하므로 기본값이 작동하지 않습니다. 당신은 확인란을 클릭 할 수 없습니다, 당신은 링크 등을 클릭 할 수 없습니다

기본 핸들러를 복원 할 수 있습니까?


예제 코드를 줄 수 있습니까?
Jojo

4
제목의 질문은 환상적입니다! 실제 질문이 너무 나쁘지 않습니다 ... 나는 여기서 찾을 수 있기를 바랐습니다. (가능한 경우) preventDefault그것이 호출 된 후에 그 효과를 '설정 해제'할 수있는 방법에 대한 대답 . 현재이 질문은 실제로 'jQuery와 이벤트 리스너의 바인딩을 어떻게 해제합니까?'입니다.
Stijn de Witt

답변:


80

나의 경우에는:

$('#some_link').click(function(event){
    event.preventDefault();
});

$('#some_link').unbind('click'); 기본 작업을 복원하는 유일한 방법으로 작동했습니다.

여기에서 볼 수 있듯이 : https://stackoverflow.com/a/1673570/211514


2
이 요소에 다른 클릭 핸들러가있는 경우, 방지 된 핸들러뿐만 아니라 첨부 된 모든 이벤트를 바인드 해제합니다.
Aure77

56

상당히 간단합니다

당신이 같은 것을한다고 가정 해 봅시다.

document.ontouchmove = function(e){ e.preventDefault(); }

이제 원래 상황으로 되돌리려면 다음을 수행하십시오.

document.ontouchmove = function(e){ return true; }

웹 사이트에서 .


이 솔루션은 $ ( '# a_link'). click (function (e) {e.preventDefault ();}); 이후에는 작동하지 않습니다. 바인드 해제 기능을 사용하십시오.
Denis Makarskiy 2016

2
제공 한 링크가 손상되었습니다.
스택

16

복원 preventDefault()할 수는 없지만 할 수있는 일은 속입니다 :)

<div id="t1">Toggle</div>
<script type="javascript">
$('#t1').click(function (e){
   if($(this).hasClass('prevented')){
       e.preventDefault();
       $(this).removeClass('prevented');
   }else{
       $(this).addClass('prevented');
   }
});
</script>

한 단계 더 나아가려면 트리거 버튼을 사용하여 이벤트를 트리거 할 수도 있습니다.


나는 그것이 확신합니다-나는 최근에 디자인에서 이것을했습니다. 처음에는 버튼을 클릭하면 touchmove 이벤트에 e.preventDefault를 추가하여 iPhone에서 스크롤을 방지 한 다음 애니메이션이 완료된 후 true를 반환하고 매력처럼 작동했습니다.
foxybagga

11
function DoPrevent(e) {
  e.preventDefault();
  e.stopPropagation();
}

// Bind:
$(element).on('click', DoPrevent);

// UnBind:
$(element).off('click', DoPrevent);

그것이 나를 위해 일한 방식은 다음과 같습니다. $ (document) .off ( 'touchmove'); $ (document) .on ( 'touchmove', function () {return true;});
rogervila

9

경우에 따라 * return false대신에 대신에 e.preventDefault()기본값을으로 복원 할 수 있습니다 return true.

* 이벤트 버블 링을 신경 쓰지 않고 e.stopPropagation()함께 사용하지 않을 때의 의미e.preventDefault()

유사한 질문 도 참조하십시오 (스택 오버플로에도 있음)

또는 확인란의 경우 다음과 같은 것을 가질 수 있습니다.

$(element).toggle(function(){
  $(":checkbox").attr('disabled', true);
  },
function(){
   $(":checkbox").removeAttr('disabled');
}) 

9

다음을 수행하여 기본 조치 (HREF 추적 인 경우)를 복원 할 수 있습니다.

window.location = $(this).attr('href');


2
아이디어는 옳았지만 상자에서 나온 코드는 나를 위해 작동하지 않았습니다 (jquery의 구문 변경이 아닌 한) 내가 사용한 : window.location = $ (this) .attr ( 'href');
Modika

3

링크 인 경우 $(this).unbind("click");링크 클릭을 다시 활성화하고 기본 동작이 복원됩니다.

이것이 어떻게 작동하는지 보여주는 데모 JS 바이올린 을 만들었습니다 .

다음은 JS 바이올린 코드입니다.

HTML :

<script src="https://code.jquery.com/jquery-1.10.2.js"></script>
<a href="http://jquery.com">Default click action is prevented, only on the third click it would be enabled</a>
<div id="log"></div>

자바 스크립트 :

<script>
var counter = 1;
$(document).ready(function(){
$( "a" ).click(function( event ) {
  event.preventDefault();

  $( "<div>" )
    .append( "default " + event.type + " prevented "+counter )
    .appendTo( "#log" );

    if(counter == 2)
    {
        $( "<div>" )
    .append( "now enable click" )
    .appendTo( "#log" );

    $(this).unbind("click");//-----this code unbinds the e.preventDefault() and restores the link clicking behavior
    }
    else
    {
        $( "<div>" )
    .append( "still disabled" )
    .appendTo( "#log" );
    }
    counter++;
});
});
</script>

2

이 코드를 테스트하면 문제가 해결됩니다.

event.stopPropagation();

참고


기본값을 막는 핸들러 앞에 발생하는 핸들러에서 전파를 중지해야합니다. 다른 핸들러가 버블 단계에 등록 된 경우 capturePhase에서이를 수행 할 수 있습니다.
Vitim.us

2

네임 스페이스를 사용하여이를 수행하는 가장 좋은 방법입니다. 안전하고 안전한 방법입니다. 여기에서 .rb는 바인딩 해제 기능이 특정 키 다운에서 작동하지만 다른 키 다운에서는 작동하지 않도록하는 네임 스페이스입니다.

$(document).bind('keydown.rb','Ctrl+r',function(e){
            e.stopImmediatePropagation();
            return false;
        });

$(document).unbind('keydown.rb');

심판 1 : http://idodev.co.uk/2014/01/safely-binding-to-events-using-namespaces-in-jquery/

심판 2 : http://jqfundamentals.com/chapter/events


1

비활성화 :

document.ontouchstart = function(e){ e.preventDefault(); }

사용 :

document.ontouchstart = function(e){ return true; }

1

이벤트 인터페이스의 preventDefault () 메소드는 이벤트가 명시 적으로 처리되지 않으면 기본 조치가 정상적으로 수행되지 않아야 함을 사용자 에이전트에 알려줍니다. 이벤트 리스너 중 하나가 stopPropagation () 또는 stopImmediatePropagation ()을 호출하지 않으면 한 번에 전파가 종료되지 않는 한 이벤트는 평소와 같이 계속 전파됩니다.

이벤트 플로우 단계 중 preventDefault ()를 호출하면 이벤트가 취소됩니다. 즉, 이벤트의 결과로 구현에서 일반적으로 수행하는 기본 조치가 발생하지 않습니다.

Event.cancelable을 사용하여 이벤트가 취소 가능한지 확인할 수 있습니다. 취소 할 수없는 이벤트에 대해 preventDefault ()를 호출해도 효과가 없습니다.

window.onKeydown = event => {
    /*
        if the control button is pressed, the event.ctrKey 
        will be the value  [true]
    */

    if (event.ctrKey && event.keyCode == 83) {
        event.preventDefault();
        // you function in here.
    }
}

0

일부 사용자 정의 작업 (양식에서 입력 필드를 사용하지 않도록 설정)이 끝난 후에 만 ​​기본 작업이 필요한 문제가있었습니다. 기본 동작 (submit ())을 자체 재귀 함수 (dosubmit ())로 래핑했습니다.

var prevdef=true;
var dosubmit=function(){
    if(prevdef==true){
        //here we can do something else first//
        prevdef=false;
        dosubmit();
    }
    else{
        $(this).submit();//which was the default action
    }
};

$('input#somebutton').click(function(){dosubmit()});

1
일반적인 참고 사항 : 일부 코더 if (predef == true)는 더 명확 하다고 느끼지만 아무런 이유없이 JS 코드에 7자를 추가하고 있습니다. if (prevdef)읽기만하면됩니다. 또한 매개 변수가 전달되지 않은 .click(dosubmit)것과 동일한 경우 중복 익명 이벤트 처리기를 추가했습니다 .click(function(){dosubmit()}).
사라진 코딩

0

부울을 사용하십시오.

let prevent_touch = true;
document.documentElement.addEventListener('touchmove', touchMove, false);
function touchMove(event) { 
    if (prevent_touch) event.preventDefault(); 
}

프로그레시브 웹 앱에서 이것을 사용하여 일부 '페이지'에서 스크롤 / 확대를 방지하고 다른 페이지는 허용하지 않습니다.


0

2 개의 수업을 구성 할 수 있습니다. JS 스크립트 중 하나를 JS 스크립트로 설정 한 후 스크립트를 사용하지 않으려면이 양식에서 바인드 된 스크립트가있는 클래스를 삭제하면됩니다.

HTML :

<form class="form-create-container form-create"> </form>   

JS

$(document).on('submit', '.form-create', function(){ 
..... ..... ..... 
$('.form-create-container').removeClass('form-create').submit();

});

-3
$('#my_elementtt').click(function(event){
    trigger('click');
});

-10

나는 당신이 무슨 뜻인지 잘 모르겠습니다. 그러나 비슷한 (그리고 아마도 같은) 문제에 대한 해결책이 있습니다 ...

나는 종종 preventDefault ()를 사용하여 항목을 가로 챕니다. 그러나 이것이 유일한 차단 방법은 아닙니다. 종종 행동이 이전과 같이 계속되거나 중단되는 "질문"을 원할 수도 있습니다. 최근에는 다음 솔루션을 사용했습니다.

$("#content").on('click', '#replace', (function(event){ return confirm('Are you sure you want to do that?') }));

기본적으로 "prevent default"는 다른 것을 가로 채고 다른 것을하기위한 것입니다. "confirm"은 ... 잘 사용하도록 설계되었습니다!

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