Как отменить привязку слушателя, который вызывает event.preventDefault () (используя jQuery)? - PullRequest
127 голосов
/ 11 октября 2009

jquery переключает вызовы по умолчанию предотвратилое предотвращение дефолта (), поэтому настройки по умолчанию не работают. Вы не можете нажать на флажок, вы не можете нажать на ссылку и т. д. и т. д.

возможно ли восстановить обработчик по умолчанию?

Ответы [ 15 ]

77 голосов
/ 15 февраля 2013

В моем случае:

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

$('#some_link').unbind('click'); работал как единственный метод для восстановления действия по умолчанию.

Как видно здесь: https://stackoverflow.com/a/1673570/211514

55 голосов
/ 14 ноября 2011

Это довольно просто

Предположим, вы делаете что-то вроде

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

Теперь, чтобы вернуть его в исходное положение, сделайте следующее ...

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

С этого сайта .

16 голосов
/ 06 января 2011

Невозможно восстановить 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>

Если вы хотите пойти еще дальше, вы даже можете использовать кнопку запуска для запуска события.

11 голосов
/ 17 февраля 2016
function DoPrevent(e) {
  e.preventDefault();
  e.stopPropagation();
}

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

// UnBind:
$(element).off('click', DoPrevent);
9 голосов
/ 04 декабря 2014

Вы можете восстановить действие по умолчанию (если это HREF), выполнив это:

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

9 голосов
/ 13 октября 2009

в некоторых случаях * вы можете сначала return false вместо e.preventDefault(), затем, когда вы хотите восстановить значение по умолчанию return true.

* То есть, когда вы не возражаете против всплытия событий, и вы не используете e.stopPropagation() вместе с e.preventDefault()

Также см. аналогичный вопрос (также в переполнении стека)

или в случае флажка у вас может быть что-то вроде:

$(element).toggle(function(){
  $(":checkbox").attr('disabled', true);
  },
function(){
   $(":checkbox").removeAttr('disabled');
}) 
2 голосов
/ 03 февраля 2017

, если это ссылка, тогда $(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>

Javascript:

<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 голосов
/ 23 января 2017

Лучший способ сделать это, используя пространство имен. Это безопасный и надежный способ. Здесь .rb - пространство имен, которое гарантирует, что функция отмены привязки работает с этой конкретной клавишей, но не с другими.

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

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

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

ref2: http://jqfundamentals.com/chapter/events

2 голосов
/ 04 декабря 2014

Протестируйте этот код, я думаю, что решить вашу проблему:

event.stopPropagation();

Ссылка

1 голос
/ 13 июня 2013

Отключение:

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

Включить:

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