Як від’єднати слухача, який викликає event.preventDefault () (використовуючи jQuery)?


128

jquery перемикання викликів за замовчуванням prevenDefault (), тому типові настройки не працюють. ви не можете натиснути прапорець, не можете натиснути посилання тощо тощо

чи можливо відновити обробник за замовчуванням?


Чи можете ви навести якийсь приклад коду?
Джоджо

4
Питання у назві - фантастичне! Шкода, що актуальне питання не є ... Я сподівався знайти тут відповідь на те, як (якщо це взагалі можливо) ми можемо "зняти" ефект preventDefaultпісля того, як він буде викликаний. В даний час це питання насправді "як я відв’яжу слухача події за допомогою jQuery?".
Штійн де Вітт

Відповіді:


80

У моєму випадку:

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

$('#some_link').unbind('click'); працював як єдиний метод відновлення дії за замовчуванням.

Як видно тут: https://stackoverflow.com/a/1673570/211514


2
Якщо в цьому елементі є ще один обробник кліків, ви скасуєте всі приєднані події, а не лише запобіжник
обробці

56

Його досить просто

Припустимо, ви робите щось на кшталт

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

Тепер, щоб повернути його до початкової ситуації, виконайте наведене нижче ...

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

З цього веб-сайту .


Це рішення не працює після $ ('# a_link'). Click (функція (e) {e.preventDefault ();}); використовувати функцію відключення.
Денис Макарський

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>

Якщо ви хочете зробити крок далі, ви навіть можете скористатися кнопкою тригера, щоб викликати подію.


Я майже впевнений, що це так - я робив це на дизайні нещодавно. Спочатку одним натисканням кнопки я перешкоджав прокрутці в iphone, додавши e.preventDefault до події touchmove, а потім після того, як анімація була зроблена, я повернув справжнє, і це спрацювало як шарм.
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()

Дивіться також подібне запитання (також у стеці Overflow)

або у випадку прапорця у вас може бути щось на кшталт:

$(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');
Модіка

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>

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

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

event.stopPropagation();

Довідково


ви повинні зупинити розповсюдження на оброблювачем, який виникає перед обробником, який запобігає замовчуванню. Це можна зробити на catchPhase, якщо ваш інший обробник зареєстрований на фазі бульбашки.
Vitim.us

2

Найкращий спосіб зробити це за допомогою простору імен. Це безпечний і безпечний спосіб. Тут .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



1

Метод prevenDefault () інтерфейсу події повідомляє агенту користувача, що якщо подія не обробляється явно, її дії за замовчуванням не слід вживати так, як це було б зазвичай. Подія продовжує поширюватися як завжди, якщо один із слухачів її події не викликає stopPropagation () або stopImmediatePropagation (), який із них припиняє розповсюдження відразу.

Виклик prevenDefault () під час будь-якої стадії потоку подій скасовує подію, тобто будь-які дії за замовчуванням, які зазвичай виконуються реалізацією в результаті події, не відбудуться.

Ви можете використовувати Event.cancelable, щоб перевірити, чи подію можна скасувати. Виклик prevenDefault () для події, що не скасовується, не впливає.

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)більш явним, ви додаєте 7 символів у свій JS-код без причини. 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-скрипт на один із них, коли ви хочете відключити свій скрипт, ви просто видалите клас із прив’язаним сценарієм із цієї форми.

HTML:

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

JS

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

});


-10

Я не впевнений, що ви маєте на увазі: але ось рішення подібної (і, можливо, тієї ж) проблеми ...

Я часто використовую prevenDefault () для перехоплення елементів. Однак: це не єдиний метод перехоплення ... часто вам просто потрібно "питання", яке слідкує за поведінкою, як і раніше, або припиняється. Нещодавно я використав таке рішення:

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

В основному, "запобігти дефолту" мається на увазі, щоб перехопити і зробити щось інше: "підтвердити" призначений для використання в ... ну - підтвердження!

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.