2009-10-11 3 views
120

jquery toggle вызывает preventDefault() по умолчанию, поэтому значения по умолчанию не работают. вы не можете нажать на флажок, вы не можете нажать ссылку и т. Д.Как развязать прослушиватель, вызывающий event.preventDefault() (используя jQuery)?

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

+0

Можете ли вы дать некоторый пример кода? – Jojo

+1

Вопрос в названии фантастический! Слишком плохо, на самом деле вопрос не ... Я надеялся найти здесь, ответ на то, как (если это вообще возможно) мы можем «отключить» эффект «preventDefault» после его вызова. В настоящее время этот вопрос на самом деле «как отключить прослушиватель событий с помощью jQuery?». –

ответ

8

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

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

Также см similar question (также в переполнении стека)

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

$(element).toggle(function(){ 
    $(":checkbox").attr('disabled', true); 
    }, 
function(){ 
    $(":checkbox").removeAttr('disabled'); 
}) 
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> 

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

+0

Я уверен, что это - я сделал это на дизайне в последнее время. Сначала одним нажатием кнопки я запретил прокрутку в iphone, добавив e.preventDefault к событию touchmove, а затем после того, как анимация была выполнена, я вернулась и работала как шарм. – foxybagga

51

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

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

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

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

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

Из этого website.

+0

Это решение не работает после $ ('# a_link'). Click (function (e) { e.preventDefault(); }); использование unbind функция. –

+1

Ссылка, предоставленная вами, не работает. – Stacked

-9

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

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

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

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

+0

Я уверен, что вы не получите вопрос правильно – Stacked

71

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

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

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

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

+1

Если у этого элемента есть другой обработчик кликов, вы отключаете все прикрепленные события, не только предотвращаете обработчик ... – Aure77

1

Disable:

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

Включить:

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

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

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

+2

идеи были правильными, но код из коробки не работал для меня (если это просто изменение синтаксиса в jquery), я использовал: window.location = $ (this) .attr ('href'); – Modika

1

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

event.stopPropagation(); 

Reference

+1

Это не сработало для меня, вместо этого я использовал 'unbind'. – Micer

+0

вам нужно остановитьпрограммирование на обработчике, который возникает перед обработчиком, который предотвращает по умолчанию. Вы можете сделать это на capturePhase, если ваш другой обработчик зарегистрирован на фазе пузыря. –

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

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

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

То, как это сработало для меня, было: $ (document) .off ('touchmove'); $ (document) .on ('touchmove', function() {return true;}); – rogervila

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()}) ', поскольку никакие параметры не передаются. –

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

Лучший способ сделать это с помощью пространства имен. Это безопасный и безопасный способ. Здесь .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

1

если это ссылка, то $(this).unbind("click"); будет повторно активировать ссылку мыши и по умолчанию будут восстановлены.

Я создал a demo JS fiddle, чтобы продемонстрировать, как это работает:

Вот код 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> 
0

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

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(); 

});