После того, как я запустил evt.preventDefault()
, как я могу возобновить действия по умолчанию снова?
После того, как я запустил evt.preventDefault()
, как я могу возобновить действия по умолчанию снова?
Ответы:
Согласно комментарию @Prescott, противоположность:
evt.preventDefault();
Может быть:
По сути, приравнивается к «сделать по умолчанию» , так как мы больше не препятствуем этому.
В противном случае я склонен указать вам ответы, предоставленные другими комментариями и ответами:
Как отменить привязку слушателя, который вызывает event.preventDefault () (используя jQuery)?
Как включить event.preventDefault?
Обратите внимание, что второй вариант был принят с примером решения, заданного redsquare (здесь размещено прямое решение, если оно не закрыто как дубликат):
$('form').submit( function(ev) {
ev.preventDefault();
//later you decide you want to submit
$(this).unbind('submit').submit()
});
function(evt) {evt.preventDefault();}
и его противоположность
function(evt) {return true;}
ура!
return true
: nothing.
Чтобы обработать команду перед продолжением ссылки из click
события в jQuery:
Например: <a href="http://google.com/" class="myevent">Click me</a>
Предотвратите и выполните с помощью jQuery:
$('a.myevent').click(function(event) {
event.preventDefault();
// Do my commands
if( myEventThingFirst() )
{
// then redirect to original location
window.location = this.href;
}
else
{
alert("Couldn't do my thing first");
}
});
Или просто беги window.location = this.href;
заpreventDefault();
Мне пришлось отложить отправку формы в jQuery, чтобы выполнить асинхронный вызов. Вот упрощенный код ...
$("$theform").submit(function(e) {
e.preventDefault();
var $this = $(this);
$.ajax('/path/to/script.php',
{
type: "POST",
data: { value: $("#input_control").val() }
}).done(function(response) {
$this.unbind('submit').submit();
});
});
event.preventDefault(); //or event.returnValue = false;
и его противоположность (стандартная):
event.returnValue = true;
источник: https://developer.mozilla.org/en-US/docs/Web/API/Event/returnValue
Я хотел бы предложить следующий шаблон:
document.getElementById("foo").onsubmit = function(e) {
if (document.getElementById("test").value == "test") {
return true;
} else {
e.preventDefault();
}
}
<form id="foo">
<input id="test"/>
<input type="submit"/>
</form>
... если я что-то упустил.
Нет противоположного способа event.preventDefault()
понять, почему вы сначала должны посмотреть, что event.preventDefault()
делает, когда вы это называете.
Под капотом, функция для protectDefault по сути вызывает возврат false, который останавливает любое дальнейшее выполнение. Если вы знакомы со старыми способами Javascript, было когда-то в моде использовать return false для отмены событий в таких вещах, как отправка формы и кнопки, используя return true (до того, как jQuery появился даже вокруг).
Как вы, возможно, уже разработали, основываясь на простом объяснении выше: противоположность event.preventDefault()
ничто. Вы просто не предотвращаете событие, по умолчанию браузер разрешит событие, если вы не запрещаете его.
Смотрите объяснение ниже:
;(function($, window, document, undefined)) {
$(function() {
// By default deny the submit
var allowSubmit = false;
$("#someform").on("submit", function(event) {
if (!allowSubmit) {
event.preventDefault();
// Your code logic in here (maybe form validation or something)
// Then you set allowSubmit to true so this code is bypassed
allowSubmit = true;
}
});
});
})(jQuery, window, document);
В приведенном выше коде вы заметите, что мы проверяем, имеет ли значение allowSubmit значение false. Это означает, что мы event.preventDefault
запретим отправку нашей формы с использованием, а затем сделаем некоторую логику проверки, и, если мы довольны, установите для allowSubmit значение true.
Это действительно единственный эффективный метод сделать противоположное event.preventDefault()
- вы также можете попробовать удалить события, которые по сути достигли бы того же самого.
Вот что-то полезное ...
Прежде всего, мы перейдем по ссылке, запустим некоторый код, а затем выполним действие по умолчанию. Это будет возможно с помощью event.currentTarget. Посмотрите. Здесь мы попытаемся получить доступ к Google на новой вкладке, но прежде чем нам нужно будет запустить код.
<a href="https://www.google.com.br" target="_blank" id="link">Google</a>
<script type="text/javascript">
$(document).ready(function() {
$("#link").click(function(e) {
// Prevent default action
e.preventDefault();
// Here you'll put your code, what you want to execute before default action
alert(123);
// Prevent infinite loop
$(this).unbind('click');
// Execute default action
e.currentTarget.click();
});
});
</script>
Вот что я использовал для его установки:
$("body").on('touchmove', function(e){
e.preventDefault();
});
И отменить это:
$("body").unbind("touchmove");
Ни одно из решений не помогло мне здесь, и я сделал это, чтобы решить мою ситуацию.
<a onclick="return clickEvent(event);" href="/contact-us">
И функция clickEvent()
,
function clickEvent(event) {
event.preventDefault();
// do your thing here
// remove the onclick event trigger and continue with the event
event.target.parentElement.onclick = null;
event.target.parentElement.click();
}
Я полагаю, что «противоположность» будет моделировать событие. Вы могли бы использовать.createEvent()
Следуя примеру Mozilla:
function simulateClick() {
var evt = document.createEvent("MouseEvents");
evt.initMouseEvent("click", true, true, window,
0, 0, 0, 0, 0, false, false, false, false, 0, null);
var cb = document.getElementById("checkbox");
var cancelled = !cb.dispatchEvent(evt);
if(cancelled) {
// A handler called preventDefault
alert("cancelled");
} else {
// None of the handlers called preventDefault
alert("not cancelled");
}
}
Ссылка: document.createEvent
jQuery имеет .trigger()
так что вы можете запускать события на элементах - иногда полезно.
$('#foo').bind('click', function() {
alert($(this).text());
});
$('#foo').trigger('click');
jquery on () может быть другим решением этой проблемы. особенно когда речь идет об использовании пространств имен .
jquery on () - это просто текущий способ привязки событий (вместо bind ()). off () это отменить привязку. и когда вы используете пространство имен, вы можете добавлять и удалять несколько различных событий.
$( selector ).on("submit.my-namespace", function( event ) {
//prevent the event
event.preventDefault();
//cache the selector
var $this = $(this);
if ( my_condition_is_true ) {
//when 'my_condition_is_true' is met, the binding is removed and the event is triggered again.
$this.off("submit.my-namespace").trigger("submit");
}
});
теперь, используя пространство имен, вы можете добавить несколько таких событий и удалить их в зависимости от ваших потребностей ... хотя отправка может быть не лучшим примером, это может пригодиться при нажатии, нажатии клавиши или любом другом ...
Это не прямой ответ на вопрос, но может кому-то помочь. Моя точка зрения заключается в том, что вы можете вызывать warnDefault () только на основании некоторых условий, поскольку не имеет смысла иметь событие, если вы вызываете warnDefault () для всех случаев. Таким образом, наличие условий if и вызов метода protectDefault () только тогда, когда выполняется условие / условия, будут работать в обычном режиме для других случаев.
$('.btnEdit').click(function(e) {
var status = $(this).closest('tr').find('td').eq(3).html().trim();
var tripId = $(this).attr('tripId');
if (status == 'Completed') {
e.preventDefault();
alert("You can't edit completed reservations");
} else if (tripId != '') {
e.preventDefault();
alert("You can't edit a reservation which is already attached to a trip");
}
//else it will continue as usual
});
Вы можете использовать это после метода "protectDefault"
// Здесь evt.target возвращает событие по умолчанию (например, defult url и т. Д.)
var defaultEvent=evt.target;
// Здесь мы сохраняем событие по умолчанию ..
if("true")
{
//activate default event..
location.href(defaultEvent);
}
этот код работал для меня, чтобы восстановить экземпляр события после того, как я использовал:
event.preventDefault(); to disable the event.
event.preventDefault = false;
Я использовал следующий код. Он отлично работает для меня.
$('a').bind('click', function(e) {
e.stopPropagation();
});
event.preventDefault()
;