2011-01-03 36 views
44

Đây là một loại tương tự trùng lặp với một số người khác ở đây, nhưng tôi nghĩ rằng tôi đang sử dụng event.preventDefault() chính xác trong trường hợp này.jQuery event.preventDefault() không hoạt động trong Firefox (bao gồm JSFiddle)

Dưới đây là một JSFiddle bạn sẽ nhìn thấy mã với: http://jsfiddle.net/SeEw2/2/

Về cơ bản, bấm vào nút Submit.

Trong Chrome: Không có gì xảy ra - phản hồi chính xác.

Trong Firefox: Tải lại trang, oh noes!

Vậy tại sao trang tải lại trong Firefox chứ không phải Chrome? Tôi đã Firebugging nó và không có lỗi đi lên trong một trong hai ...

+14

Lý do này hoạt động trên Chrome là Chrome ném một phần xương đến các trang web phụ thuộc vào IE, bằng cách điền vào 'window.event' với sự kiện hiện tại trước khi kích hoạt trình xử lý.(Và một tham chiếu miễn phí như 'sự kiện' của bạn - bởi vì bạn quên đưa nó vào chữ ký xử lý sự kiện của bạn, vì [ClemDesm là người đầu tiên chỉ ra] (http://stackoverflow.com/questions/4585970/jquery-event -preventdefault-not-working-in-firefox-jsfiddle-included/4586007 # 4586007) - có nghĩa là bạn đang rơi trở lại trên 'window.event'.) Firefox không ném xương như vậy vào mã cụ thể của IE. –

+0

Rất thông tin, cảm ơn T.J. - Tôi không bao giờ biết rằng. – Jack

+2

Vui lòng đăng mã trong câu hỏi, không phải trong jsFiddle. –

Trả lời

90

Biến event trong mã của bạn không được khởi tạo.

http://jsfiddle.net/SeEw2/4/

chiết xuất:

$('#ajaxsearch').click(function(event) { 

     // Stop the Search input reloading the page by preventing its default action 
     event.preventDefault(); 
+0

Aha! Cảm ơn ClemDesm, làm thế nào ngớ ngẩn để bỏ lỡ điều đó. Bây giờ nó có vẻ được hiển thị thẳng lên trong Firebug của Error Console anyway ... hmmm :) – Jack

+7

Tôi tự hỏi tại sao nó hoạt động trong chrome ... đã có cùng một vấn đề chính xác và điều này cố định nó. –

+0

@Shikiryu: bạn đã cứu ngày của tôi .... cảm ơn u :) – Pankaj

1

Bởi vì bạn không đi qua các đối tượng sự kiện như function(event), nhưng câu hỏi của tôi là tại sao thậm chí đi qua tất cả điều này khi bạn có thể làm cho type="button" và onclick vượt qua các giá trị? Về bản chất là những gì bạn làm với toàn bộ quá trình này.

+0

Hey, tại sao tôi không nghĩ về điều đó ?! Chúc mừng! Bây giờ tôi đang cuộn với một nút 'type =" "'. Tôi không sử dụng 'onclick' mặc dù, vì trong phạm vi rộng hơn của những thứ nó thuận tiện hơn để làm điều đó như thế này. – Jack

+0

Tôi có thể sai (và nó không có quan hệ với câu hỏi) nhưng tôi tự hỏi: Có phải một nút 'type =" "' nhận diện được bàn phím _enter_ như là một đệ trình không? Không thể thử nghiệm nó trên jsfiddle, không thể kiểm tra nó theo một cách khác @ công việc của tôi và tôi tò mò :) – Shikiryu

+0

Khi bạn nhấn Enter với tiêu điểm trên hộp văn bản, nó không. Nhưng nhấn Enter với tiêu điểm (có thể là Tabbed) vào nút chính nó, có, nó nhận ra nó như là một trình và 'preventDefault()' xảy ra. Đó có phải là ý bạn không? :) – Jack

8

Tôi đã gặp phải sự cố tương tự trong quá khứ. Thay vì event.preventDefault() thử qua sự kiện này để:

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

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

Tôi biết nó nói IE, nhưng tôi chưa bao giờ có một vấn đề với nó kể từ =]

+0

Nice trick! Cảm ơn bạn đã chia sẻ này :) –

1

Thay vì tìm kiếm một sự kiện nhấp chuột trên nút gửi, tại sao không sử dụng trình xử lý $(form).submit?

Miễn là bạn có 'return false' ở cuối trình xử lý, trang sẽ không tải lại.

+0

Đó là những gì tôi đang sử dụng bây giờ, có vẻ như một cách tốt hơn để làm điều đó. Cảm ơn! – Jack

0

Tôi đã giải quyết theo cách này, do mã của tôi hơi khác một chút, điều này có thể hữu ích cho người khác. Mã ban đầu của tôi trông như thế này.

<form id="enrollstudentform" onsubmit="return enrollStudents()"> 
    ... 
</form> 

chức năng js của tôi trông giống như

function enrollStudents() { 
    // Stop Form. 
    event.preventDefault(); 
    // Other code 
} 

tôi phải vượt qua sự kiện tham số trong lời gọi hàm và nhận được nó trong hàm.

<form id="enrollstudentform" onsubmit="return enrollStudents(event)"> 
    ... 
</form> 

js mã:

function enrollStudents(event) { 
    // Stop Form. 
    event.preventDefault(); 
    // Other code 
} 

Tôi hy vọng nó giúp.

Các vấn đề liên quan