Как развязать прослушиватель, вызывающий event.preventDefault() (используя jQuery)?

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

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

Ответ 1

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

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

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

Как видно здесь: fooobar.com/questions/49251/...

Ответ 2

Его довольно простой

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

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

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

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

Из этого веб-сайта.

Ответ 3

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

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

Ответ 4

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

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

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

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

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

Ответ 5

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

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

Ответ 6

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

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

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

Ответ 7

Отключить:

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

Включить:

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

Ответ 8

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

event.stopPropagation();

Ссылка

Ответ 9

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

Ответ 10

У меня возникла проблема, когда мне понадобилось действие по умолчанию только после того, как было выполнено какое-то пользовательское действие (разрешить иначе отключенные поля ввода в форме). Я завернул действие по умолчанию (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()});

Ответ 11

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

$(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

Ответ 12

Используйте boolean:

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

Я использую это в прогрессивном веб-приложении, чтобы предотвратить прокрутку/масштабирование на некоторых "страницах", позволяя другим.

Ответ 13

Вы можете установить 2 класса. После того, как вы установите JS script в один из них, когда вы хотите отключить свой script, вы просто удаляете класс с привязанным script из этой формы.

HTML:

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

JS

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

});

Ответ 14

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

Ответ 15

Я не уверен, что вы имеете в виду: но вот решение для аналогичной (и, возможно, той же) проблемы...

Я часто использую функцию preventDefault() для перехвата элементов. Однако: это не единственный метод перехвата... часто вы можете просто хотеть "вопрос", после которого поведение продолжается по-прежнему или останавливается. В последнем случае я использовал следующее решение:

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

В принципе, "предотвращать дефолт" означает перехват и выполнение чего-то еще: "подтверждение" предназначено для использования в... хорошо подтверждении!