Hàm event.preventDefault () không hoạt động trong IE


202

Sau đây là mã JavaScript (mootools) của tôi:

$('orderNowForm').addEvent('submit', function (event) {
    event.preventDefault();
    allFilled = false;
    $$(".required").each(function (inp) {
        if (inp.getValue() != '') {
            allFilled = true;
        }
    });

    if (!allFilled) {
        $$(".errormsg").setStyle('display', '');
        return;
    } else {
        $$('.defaultText').each(function (input) {
            if (input.getValue() == input.getAttribute('title')) {
                input.setAttribute('value', '');
            }
        });
    }

    this.send({
        onSuccess: function () {
            $('page_1_table').setStyle('display', 'none');
            $('page_2_table').setStyle('display', 'none');
            $('page_3_table').setStyle('display', '');
        }
    });
});

Trong tất cả các trình duyệt ngoại trừ IE, điều này hoạt động tốt. Nhưng trong IE, điều này gây ra lỗi. Tôi có IE8 vì vậy trong khi sử dụng trình gỡ lỗi JavaScript của nó, tôi phát hiện ra rằng eventđối tượng không có preventDefaultphương thức gây ra lỗi và vì vậy biểu mẫu đang được gửi. Phương pháp này được hỗ trợ trong trường hợp Firefox (mà tôi phát hiện ra bằng cách sử dụng Fireorms).

Có ai giúp đỡ không?


Nó làm; theo các tài liệu ( mootools.net/docs/core/Native/Event#Event:preventDefault ) những gì anh ta nên làm: "Phương thức sự kiện: ngăn chặn Default - Phương pháp trình duyệt chéo để ngăn chặn hành động mặc định của sự kiện."
Paolo Bergantino

Thật tệ, tôi đã xóa bình luận của mình, đó là "không phải mootools có phương pháp để ngăn chặn sự kiện không?". Vì vậy, có vấn đề với mootools trên
eg8

2
Không thể tái tạo vấn đề này. Fiddle này "hoạt động với tôi trên tức là 8" Bạn có thể thiết lập một fiddle giảm để hiển thị lỗi không? jsfiddle.net
eerne

Câu trả lời:


472

trong IE, bạn có thể sử dụng

event.returnValue = false;

để đạt được kết quả tương tự.

Và để không gặp lỗi, bạn có thể kiểm tra sự tồn tại của notifyDefault:

if(event.preventDefault) event.preventDefault();

Bạn có thể kết hợp cả hai với:

event.preventDefault ? event.preventDefault() : (event.returnValue = false);

48
Đoạn mã sau hoạt động với tôi: if (event.preventDefault) {event.preventDefault (); } other {event.returnValue = false; }
sv_in

229
event.preventDefault ? event.preventDefault() : event.returnValue = false;
mortiy

31
Điều đáng chú ý là "sự kiện" phải là đối tượng sự kiện toàn cầu trong IE8. Bạn không thể sử dụng sự kiện được truyền vào trình xử lý sự kiện, như e.preventDefault, nó phải là event.preventDefault để điều này hoạt động trong IE8.
jmort253

event.preventDefault();đã ngừng làm việc cho tôi trong FireFox vì một số lý do. Sử dụng mã đạo đức và nó hoạt động rất tốt. Cảm ơn ~
James

8
Chỉ cần thêm một số sự rõ ràng vào nhận xét của @ jmort253:$('.something').click(function(e){ e.preventDefault ? e.preventDefault() : event.returnValue = false; });
Luke

23

Nếu bạn liên kết sự kiện thông qua chức năng addEvent của mootools, trình xử lý sự kiện của bạn sẽ nhận được một sự kiện cố định (tăng cường) được truyền dưới dạng tham số. Nó sẽ luôn chứa phương thức notifyDefault ().

Hãy thử câu đố này để thấy sự khác biệt trong ràng buộc sự kiện. http://jsfiddle.net/pFqrY/8/

// preventDefault always works
$("mootoolsbutton").addEvent('click', function(event) {
 alert(typeof(event.preventDefault));
});

// preventDefault missing in IE
<button
  id="htmlbutton"
  onclick="alert(typeof(event.preventDefault));">
  button</button>

Đối với tất cả người dùng jQuery ngoài đó, bạn có thể sửa một sự kiện khi cần. Giả sử bạn đã sử dụng HTML onclick = ".." và nhận được một sự kiện cụ thể của IE thiếu phần mềmDefDefault (), chỉ cần sử dụng mã này để lấy nó.

e = $.event.fix(e);

Sau đó e.preventDefault (); hoạt động tốt


2
Thật không may, thủ thuật này không hiệu quả với tôi. Tôi đang sử dụng IE 10 và trước khi gọi e.preventDefault (); Tôi gọi $ .event.fix (e); không thành công :(
Beatles1692

Nó có thể đã bị xóa khỏi jquery 2? Nhưng IE10 không cần sửa.
Oldwizard

Bạn đã chỉ định sự kiện cố định cho biến e một lần nữa?
Oldwizard

11

Tôi biết đây là một bài viết khá cũ nhưng tôi chỉ dành một chút thời gian để làm cho nó hoạt động trong IE8.

Dường như có một số khác biệt trong các phiên bản IE8 vì các giải pháp được đăng ở đây và trong các chủ đề khác không phù hợp với tôi.

Hãy nói rằng chúng ta có mã này:

$('a').on('click', function(event) {
    event.preventDefault ? event.preventDefault() : event.returnValue = false;
});

Trong preventDefault()phương thức IE8 của tôi tồn tại vì jQuery, nhưng không hoạt động (có thể là do điểm bên dưới), vì vậy điều này sẽ thất bại.

Ngay cả khi tôi đặt thuộc returnValuetính trực tiếp thành false:

$('a').on('click', function(event) {
    event.returnValue = false;
    event.preventDefault();
});

Điều này cũng sẽ không hoạt động, vì tôi chỉ đặt một số thuộc tính của đối tượng sự kiện tùy chỉnh jQuery.

Giải pháp duy nhất phù hợp với tôi là đặt returnValuethuộc tính của biến toàn cục event như thế này:

$('a').on('click', function(event) {
    if (window.event) {
        window.event.returnValue = false;
    }
    event.preventDefault();
});

Chỉ để giúp người nào đó cố gắng thuyết phục IE8 hoạt động dễ dàng hơn. Tôi hy vọng rằng IE8 sẽ chết khủng khiếp trong cái chết đau đớn sớm.

CẬP NHẬT:

Như sv_in chỉ ra, bạn có thể sử dụng event.originalEventđể lấy đối tượng sự kiện ban đầu và đặt returnValuethuộc tính trong đối tượng ban đầu. Nhưng tôi chưa thử nó trong IE8.


1
Bạn cũng có thể lấy đối tượng sự kiện trình duyệt ban đầu từ event.originalEvent. Thông tin thêm: stackoverflow.com/a/16675056/22550
sv_in

6

Mootools định nghĩa lại ngăn chặn Lỗi trong các đối tượng Sự kiện. Vì vậy, mã của bạn sẽ hoạt động tốt trên mọi trình duyệt. Nếu không, thì có vấn đề với hỗ trợ eg8 trong mootools.

Bạn đã kiểm tra mã của mình trên eg6 và / hoặc eg7 chưa?

Tài liệu nói

Mọi sự kiện được thêm bằng addEvent đều tự động lấy phương thức mootools mà không cần phải thủ công nó.

nhưng trong trường hợp không, bạn có thể muốn thử

new Event(event).preventDefault();

1
Có một số vấn đề khi gói như thế này cũng trong IE. Ôi chúa ơi! Tại sao IE?
sv_in

Cô ấy không muốn dừng sự kiện, tuy nhiên, chỉ ngăn chặn hành động mặc định của nó.
Alsciende

5
if (e.preventDefault) {
    e.preventDefault();
} else {
    e.returnValue = false;
}

Đã thử nghiệm trên IE 9 và Chrome.


2
Không hoạt động trong IE 11 (e.preventDefault là một chức năng, mặc dù nó dường như không làm gì cả)
GreySage

4

Để tắt phím bàn phím sau IE9, hãy sử dụng: e.preventDefault();

Để tắt khóa bàn phím thông thường trong IE7 / 8, hãy sử dụng: e.returnValue = false;hoặcreturn false;

Nếu bạn cố gắng tắt một phím tắt (bằng Ctrl, như Ctrl+F), bạn cần thêm các dòng đó:

try {
    e.keyCode = 0;
}catch (e) {}

Dưới đây là một ví dụ đầy đủ cho IE7 / 8:

document.attachEvent("onkeydown", function () {
    var e = window.event;

    //Ctrl+F or F3
    if (e.keyCode === 114 || (e.ctrlKey && e.keyCode === 70)) {
        //Prevent for Ctrl+...
        try {
            e.keyCode = 0;
        }catch (e) {}

        //prevent default (could also use e.returnValue = false;)
        return false;
    }
});

Tham khảo: Cách tắt phím tắt trong IE7 / IE8


Bạn là người trả lời duy nhất đánh vào đầu đinh. Lý do duy nhất bất cứ ai ở đây nói về IE sớm là họ cần chức năng đa nền tảng. "e.keyCode = 0;" sẽ giết mọi hành động mặc định trong IE sớm.
www-0av-Com

3

Đây là một chức năng tôi đã thử nghiệm với bản dựng hàng đêm của jquery 1.3.2 và 09-18-2009. Hãy cho tôi biết kết quả của bạn với nó. Mọi thứ đều hoạt động tốt ở phần cuối này trong Safari, FF, Opera trên OSX. Nó chỉ dành riêng để sửa lỗi IE8 có vấn đề và có thể có kết quả ngoài ý muốn:

function ie8SafePreventEvent(e) {
    if (e.preventDefault) {
        e.preventDefault()
    } else {
        e.stop()
    };

    e.returnValue = false;
    e.stopPropagation();
}

Sử dụng:

$('a').click(function (e) {
    // Execute code here
    ie8SafePreventEvent(e);
    return false;
})

1
Tôi chưa bao giờ thấy stopphương pháp này trước đây và tôi không thể tìm thấy nó trong msdn. Nó làm gì?
Oriol

1
.stop()ném một ngoại lệ, bởi vì nó không tồn tại. Bất kỳ ngoại lệ sẽ có hiệu quả mong muốn.
Jay Bazuzi

và tại sao bạn muốn ném một ngoại lệ? Ý tôi là, nếu bạn muốn ném ngoại lệ, bạn có thể gọi đơn giản e.preventDefault()vì dù sao nó cũng sẽ ném ngoại lệ ...
Matthias Burger

2

preventDefaultlà một tiêu chuẩn rộng rãi; sử dụng một adhoc mỗi khi bạn muốn tuân thủ các phiên bản IE cũ là cồng kềnh, tốt hơn là sử dụng một polyfill:

if (typeof Event.prototype.preventDefault === 'undefined') {
    Event.prototype.preventDefault = function (e, callback) {
        this.returnValue = false;
    };
}

Điều này sẽ sửa đổi nguyên mẫu của Sự kiện và thêm chức năng này, một tính năng tuyệt vời của javascript / DOM nói chung. Bây giờ bạn có thể sử dụng e.preventDefaultmà không có vấn đề.


0

return false trong trình nghe của bạn nên hoạt động trong tất cả các trình duyệt.

$('orderNowForm').addEvent('submit', function () {
    // your code
    return false;
}

0

FWIW, trong trường hợp bất kỳ ai xem lại câu hỏi này sau đó, bạn cũng có thể kiểm tra những gì bạn đang trao cho chức năng xử lý onKeyPress của bạn.

Tôi gặp phải lỗi này khi tôi chuyển nhầm onKeyPress (cái này) thay vì onKeyPress (sự kiện).

Chỉ cần một cái gì đó khác để kiểm tra.


0

Tôi đã được giúp đỡ bằng một phương pháp kiểm tra chức năng. Phương pháp này hoạt động trong IE8

if(typeof e.preventDefault == 'function'){
  e.preventDefault();
} else {
  e.returnValue = false;
}
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.