Khi tôi đã sa thải evt.preventDefault()
, làm thế nào tôi có thể tiếp tục các hành động mặc định một lần nữa?
Khi tôi đã sa thải evt.preventDefault()
, làm thế nào tôi có thể tiếp tục các hành động mặc định một lần nữa?
Câu trả lời:
Theo nhận xét của @Prescott, ngược lại:
evt.preventDefault();
Có thể là:
Về cơ bản tương đương với 'làm mặc định' , vì chúng tôi không còn ngăn chặn điều đó nữa.
Mặt khác, tôi có xu hướng chỉ cho bạn các câu trả lời được cung cấp bởi các nhận xét và câu trả lời khác:
Làm cách nào để hủy liên kết người nghe đang gọi event.preventDefault () (sử dụng jQuery)?
Làm thế nào để reenable event.preventDefault?
Lưu ý rằng giải pháp thứ hai đã được chấp nhận với một giải pháp ví dụ, được đưa ra bởi redsapes (được đăng ở đây để có giải pháp trực tiếp trong trường hợp điều này không bị đóng dưới dạng trùng lặp):
$('form').submit( function(ev) {
ev.preventDefault();
//later you decide you want to submit
$(this).unbind('submit').submit()
});
function(evt) {evt.preventDefault();}
và ngược lại
function(evt) {return true;}
chúc mừng
return true
: không có gì.
Để xử lý một lệnh trước khi tiếp tục một liên kết từ một click
sự kiện trong jQuery:
Ví dụ: <a href="http://google.com/" class="myevent">Click me</a>
Ngăn chặn và làm theo thông qua với 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");
}
});
Hoặc đơn giản là chạy window.location = this.href;
theopreventDefault();
Tôi đã phải trì hoãn việc gửi biểu mẫu trong jQuery để thực hiện cuộc gọi không đồng bộ. Đây là mã đơn giản hóa ...
$("$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;
và ngược lại (tiêu chuẩn):
event.returnValue = true;
nguồn: https://developer.mozilla.org/en-US/docs/Web/API/Event/returnValue
Tôi muốn đề xuất mô hình sau:
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>
... Trừ khi tôi thiếu một cái gì đó.
Không có phương pháp ngược lại event.preventDefault()
để hiểu lý do tại sao trước tiên bạn phải xem xét những gìevent.preventDefault()
làm khi bạn gọi nó.
Bên dưới mui xe, chức năng cho notifyDefault về cơ bản là gọi return return để tạm dừng mọi thực thi tiếp theo. Nếu bạn đã quen với các cách sử dụng Javascript cũ, thì trước đây người ta thường sử dụng return false để hủy các sự kiện trên những thứ như đệ trình biểu mẫu và các nút sử dụng return true (trước cả jQuery cũng xuất hiện).
Như bạn có thể đã làm việc dựa trên lời giải thích đơn giản ở trên: điều ngược lại event.preventDefault()
là không có gì. Bạn chỉ không ngăn chặn sự kiện, theo mặc định trình duyệt sẽ cho phép sự kiện nếu bạn không ngăn chặn sự kiện đó.
Xem bên dưới để giải thích:
;(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);
Trong đoạn mã trên, bạn sẽ thấy chúng tôi đang kiểm tra xem allowSubmit có sai không. Điều này có nghĩa là chúng tôi sẽ ngăn chặn biểu mẫu của chúng tôi gửi bằng cách sử dụngevent.preventDefault
và sau đó chúng tôi sẽ thực hiện một số logic xác thực và nếu chúng tôi hài lòng, hãy đặt allowSubmit thành true.
Đây thực sự là phương pháp hiệu quả duy nhất để làm ngược lại event.preventDefault()
- bạn cũng có thể thử loại bỏ các sự kiện mà về cơ bản sẽ đạt được điều tương tự.
Đây là một cái gì đó hữu ích ...
Trước hết chúng tôi sẽ nhấp vào liên kết, chạy một số mã và hơn là chúng tôi sẽ thực hiện hành động mặc định. Điều này sẽ có thể sử dụng event.cienTarget Hãy xem. Ở đây chúng tôi sẽ cố gắng truy cập Google trên một tab mới, nhưng trước khi chúng tôi cần chạy một số mã.
<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>
Đây là những gì tôi đã sử dụng để thiết lập nó:
$("body").on('touchmove', function(e){
e.preventDefault();
});
Và để hoàn tác nó:
$("body").unbind("touchmove");
Không có giải pháp nào giúp tôi ở đây và tôi đã làm điều này để giải quyết tình huống của mình.
<a onclick="return clickEvent(event);" href="/contact-us">
Và chức năng 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();
}
Tôi cho rằng "đối diện" sẽ là mô phỏng một sự kiện. Bạn đã có thể sử dụng.createEvent()
Theo ví dụ của 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");
}
}
Tham chiếu: document.createEvent
jQuery có .trigger()
để bạn có thể kích hoạt các sự kiện trên các phần tử - đôi khi hữu ích.
$('#foo').bind('click', function() {
alert($(this).text());
});
$('#foo').trigger('click');
jquery on () có thể là một giải pháp khác cho vấn đề này. một cách bí mật khi nói đến việc sử dụng các không gian tên .
jquery on () chỉ là cách hiện tại của các sự kiện ràng buộc (thay vì ràng buộc ()). tắt () là để hủy bỏ những điều này. và khi bạn sử dụng một không gian tên, bạn có thể thêm và xóa nhiều sự kiện khác nhau.
$( 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");
}
});
bây giờ với việc sử dụng không gian tên, bạn có thể thêm nhiều sự kiện này và có thể xóa những sự kiện đó, tùy thuộc vào nhu cầu của bạn .. trong khi gửi có thể không phải là ví dụ tốt nhất, điều này có thể hữu ích khi nhấp hoặc nhấn phím hoặc bất cứ điều gì ..
Đây không phải là một câu trả lời trực tiếp cho câu hỏi nhưng nó có thể giúp đỡ một ai đó. Quan điểm của tôi là bạn chỉ gọi ngăn chặnDefault () dựa trên một số điều kiện vì không có sự kiện nào xảy ra nếu bạn gọi ngăn chặnDefault () cho tất cả các trường hợp. Vì vậy, chỉ có điều kiện và gọi ngăn chặnDefault () khi điều kiện / s thỏa mãn sẽ hoạt động chức năng theo cách thông thường cho các trường hợp khác.
$('.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
});
bạn có thể sử dụng phương thức này sau phương thức "notifyDefault"
// Ở đây evt.target trả lại sự kiện mặc định (ví dụ: defult url, v.v.)
var defaultEvent=evt.target;
// Ở đây chúng tôi lưu sự kiện mặc định ..
if("true")
{
//activate default event..
location.href(defaultEvent);
}
mã này hoạt động với tôi để khởi tạo lại sự kiện sau khi tôi đã sử dụng:
event.preventDefault(); to disable the event.
event.preventDefault = false;
Tôi đã sử dụng mã sau đây. Việc này ổn với tôi.
$('a').bind('click', function(e) {
e.stopPropagation();
});
event.preventDefault()
;