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

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

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

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

4b9b3361

Ответ 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?') }));

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