Điều ngược lại với evt.preventDefault ();


185

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?


3
Tôi nghĩ rằng thông thường chức năng của bạn sẽ chạy và sau đó hành vi mặc định sẽ chạy, vì vậy bạn sẽ không bao giờ gọi evt.preventDefault () ở vị trí đầu tiên
Prescott


2
@Nobita - Tôi không chắc lắm ... cái đó là dành riêng cho jQuery.
gilly3

1
Wow, thanx cho các phản ứng nhanh chóng! Vấn đề của tôi là, mặc dù tôi không phải là người bắn evt.preventDefault ();. Tôi đang chạy ứng dụng flash của bên thứ 3 trong hộp đèn. Khi tôi đóng hộp đèn, bằng cách nào đó, con lăn chuột của tôi để cuộn trang dừng lại. Khi thực hiện một số nghiên cứu, tôi thấy rằng ứng dụng flash này vô hiệu hóa cuộn trang vì tính năng thu phóng. Vì vậy, bây giờ tôi đang cố gắng tiếp tục cuộn trang sau khi ứng dụng được đóng lại. Có lẽ có một số phương pháp tôi có thể gọi để tiếp tục sự kiện bánh xe chuột?
Bryan

Câu trả lời:


90

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

Cảm ơn bạn! Đã gãi đầu trong một lúc về điều này (tôi cần dừng lại và kiểm tra một vài điều trước khi gửi biểu mẫu, không gửi trong một số trường hợp nhất định, gửi người khác).
Katharine Ostern

1
Nó hoạt động nhưng tôi không hiểu tại sao hình thức gửi tiếp theo lại gọi chức năng này, tôi nghĩ rằng nó sẽ hủy liên kết nó một cách chắc chắn, nhưng có vẻ như nó không liên kết với cuộc gọi hiện tại ... Tôi không thể giải thích nó, nó không chính xác những gì tôi muốn nhưng đó không phải là những gì tôi mong đợi.
Vadorequest

53
function(evt) {evt.preventDefault();}

và ngược lại

function(evt) {return true;}

chúc mừng


8
Điều này làm việc cho tôi, nhưng tôi tự hỏi liệu có ai có thể giải thích nó tốt hơn một chút là tại sao không?
edhedges

11
Điều này không hoàn tác ngăn chặnDefault (), trên thực tế, nó hoạt động giống như khi bạn sử dụng return true: không có gì.
br4nnigan

19

Để xử lý một lệnh trước khi tiếp tục một liên kết từ một clicksự 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();


3
Đúng, nhưng điều này giả định rằng ngăn chặn là một liên kết và không nói touchmove trên thân tài liệu.
Bangkok

4
Đây không phải là những gì câu hỏi.
Matt Fletcher

8

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

Một tùy chọn khác trong kịch bản này có thể là sử dụng kiểu đầu vào = "nút" và liên kết với sự kiện nhấp thay vì sử dụng kiểu đầu vào = "gửi" và ràng buộc với sự kiện gửi.
Strixy

8

ĐỒNG Ý ! nó hoạt động cho sự kiện nhấp chuột:

$("#submit").click(function(e){ 

   e.preventDefault();

  -> block the click of the sumbit ... do what you want

$("#submit").unbind('click').click(); // the html click submit work now !

});


4

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ì đó.

http://jsfiddle.net/DvcX/


4

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ự.


4

Đâ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>

2

Đâ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");

2

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

2

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

1

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ì ..


1

Đâ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

});


0

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

0

Bạn luôn có thể sử dụng điều này kèm theo một số sự kiện nhấp chuột trong tập lệnh của bạn:

location.href = this.href;

ví dụ về việc sử dụng là:

jQuery('a').click(function(e) {
    location.href = this.href;
});

-1

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;

-2

Tôi đã sử dụng mã sau đây. Việc này ổn với tôi.

$('a').bind('click', function(e) {
  e.stopPropagation();
});

2
Như đã giải thích trong tài liệu API jQuery , điều này ngăn sự kiện nổi lên trên cây DOM, ngăn không cho bất kỳ trình xử lý cha mẹ nào được thông báo về sự kiện này. Điều đó không giống với / hoặc ngược lại event.preventDefault();
ᴍᴀᴛᴛ

2
Đây không phải là những gì câu hỏi yêu cầu.
Matt Fletcher
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.