2012-05-03 32 views
10

Khi tôi sử dụng event.preventDefault() trên một liên kết nó hoạt động, tuy nhiên khi tôi sử dụng nó trên một nút không!
DEMO
mã của tôi:preventDefault() không hoạt động

<a id="link" href="http://www.google.com">link</a> 
<button id="button" onclick="alert('an alert')">button</button>​ 

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

hành động liên kết bị hủy bỏ, nhưng khi tôi nhấp vào nút, vẫn thực hiện các hành động onClick
Bất kỳ sự giúp đỡ? những gì tôi muốn làm là để ngăn chặn các nút onClick hành động mà không thay đổi nút html (Tôi biết làm thế nào để làm

$('#button').removeAttr('onclick');

+0

Không thêm sự kiện bằng thuộc tính html nội tuyến. Sử dụng đăng ký sự kiện thích hợp. –

+0

Tôi không thêm bất cứ điều gì, HTML được tạo ra bởi Framework, Magento nếu bạn muốn biết .. – skafandri

+1

Tại sao bạn không muốn sử dụng removeAttr ('onClick')? –

Trả lời

21

Bạn muốn event.stopImmediatePropagation(); nếu có nhiều xử lý sự kiện trên một phần tử và bạn muốn preventDefault() chỉ chặn hoạt động mặc định (chẳng hạn như gửi biểu mẫu hoặc điều hướng tới một URL khác) trong khi stopImmediatePropagation() ngăn sự kiện phát tán lên cây DOM ngăn bất kỳ trình xử lý sự kiện nào khác trên cùng một phần tử khỏi bị thực thi .

Dưới đây là một số liên kết hữu ích để giải thích các phương pháp khác nhau:

Tuy nhiên, vì nó vẫn không hoạt động có nghĩa là xử lý onclick="" thực hiện trước trình xử lý sự kiện đính kèm. Không có gì bạn có thể làm kể từ khi mã của bạn chạy mã onclick đã được thực thi.

Giải pháp đơn giản nhất là hoàn toàn loại bỏ handler rằng:

$('#button').removeAttr('onclick'); 

Thậm chí thêm một người biết lắng nghe sự kiện thông qua javascript đơn giản (addEventListener()) với useCapture=true không giúp - rõ ràng là sự kiện inline kích hoạt ngay cả trước khi sự kiện bắt đầu giảm dần DOM cây.

Nếu bạn chỉ không muốn để loại bỏ các xử lý bởi vì bạn cần nó, chỉ cần chuyển nó sang một sự kiện gắn đúng cách:

var onclickFunc = new Function($('#button').attr('onclick')); 
$('#button').click(function(event){ 
    if(confirm('prevent onclick event?')) { 
     event.stopImmediatePropagation(); 
    } 
}).click(onclickFunc).removeAttr('onclick'); 
+0

không hoạt động! http://jsfiddle.net/46sbB/1/ – skafandri

+0

có thể 6 người upvoted câu trả lời này cho tôi biết lý do tại sao nó không hoạt động ???? – skafandri

+0

Tôi đã cập nhật câu trả lời của mình – ThiefMaster

2

bạn có thể thử này:

$('#button').show(function() { 
    var clickEvent = new Function($(this).attr('click')); // store it for future use 
    this.onclick = undefined; 
}); 

DEMO

2

Các preventDefault chức năng không chỉ dừng lại xử lý sự kiện được kích hoạt, nhưng thay vì dừng hành động mặc định diễn ra. Đối với các liên kết, nó dừng điều hướng, cho các nút, nó dừng biểu mẫu không được gửi, v.v.

Điều bạn đang tìm kiếm là stopImmediatePropagation.

+0

không hoạt động! Http://jsfiddle.net/46sbB/1/ – skafandri

+0

Ah ... Bạn không thực sự có bất kỳ sự kiểm soát nào đối với các trình xử lý sự kiện khác đã đăng ký trên cùng một phần tử.Những gì bạn có thể làm là ngăn sự kiện Xin lỗi vì tôi đã hiểu lầm câu hỏi của bạn. –