2012-03-13 11 views
5

Tôi đã nhận thấy có vấn đề lạ với cách Chrome xử lý sự kiện tập trung javascript. Thực tế là, nó liên tục kích hoạt sự kiện tập trung, ngay cả khi nó chỉ xảy ra một lần. Tôi đã thực hiện một chút nghiên cứu ở đây và tìm thấy câu hỏi mà mọi người gặp phải vấn đề tương tự khi sử dụng alert(). Khi họ đóng cửa sổ cảnh báo, tiêu điểm sẽ trở về đầu vào của chúng và trình xử lý kích hoạt lặp đi lặp lại. Trong trường hợp của tôi, vấn đề là khác nhau, khi tôi đang sử dụng console.log(), và theo thời gian tôi nhận được cùng một bản ghi 2 hoặc thậm chí 3 lần. Tôi đã nhận thấy nó thường xảy ra khi tôi xóa giao diện điều khiển, và sau đó tập trung vào một yếu tố. Khi tôi cố gắng lặp lại nó, nó không xảy ra nữa.Google Chrome sao chép sự kiện JavaScript 'tập trung'

Kịch bản:

  1. Rõ ràng console
  2. Tập trung vào các yếu tố (2 hoặc 3 giao diện điều khiển thông điệp)
  3. Tập trung vào các yếu tố giống hệt nhau khác hoặc Không tập trung và tập trung một lần nữa trên cùng một (không có vấn đề)
  4. Xóa bảng điều khiển
  5. Tập trung vào yếu tố (2 hoặc 3 thông báo bàn điều khiển - sự cố đã trở lại!)

Tôi đã tạo một jsfiddle, xin vui lòng kiểm tra xem nó ra: http://jsfiddle.net/ffuWT/3/

Câu hỏi đặt ra là, lý do cho vấn đề này là gì và làm thế nào tôi có thể làm việc xung quanh nó?

+1

Hoạt động như mong đợi (không phải cách bạn mô tả) cho tôi, chạy Chrome 17.0.963.78 m – m90

+0

Tôi không thể tạo lại sự cố của bạn và tôi không thấy cách xóa bảng điều khiển trong '# 4' tạo sự cố với sự kiện kích hoạt hai lần? Bạn đã thử dừng sự kiện từ sủi bọt trong chức năng của bạn chưa? Thử thêm 'e.stopPropagation()' –

+0

Tôi có thể tạo lại vấn đề. 'e.stopPropagation' không giải quyết nó cho tôi. –

Trả lời

3

Tôi đã có thể tạo lại sự cố (sử dụng jsFiddle) và từ những gì tôi có thể thấy nó chỉ xảy ra khi bạn nhấp vào select mà không tập trung vào/trong khung kết quả.

Nhấp vào trong khung chứ không phải trên select giây trước khi bạn nhấp để mở rộng một trong số select giây và bạn sẽ chỉ thấy một dòng được ghi lại.

Bạn cũng có thể thêm /show vào URL jsFiddle để xem result in a separate window.

Dường như việc lấy nét cửa sổ bằng cách nhấp vào điều khiển select sẽ kích hoạt sự kiện nhiều lần.

Open this demo và không lấy nét cửa sổ trình duyệt (bằng cách nhấp vào màn hình, thanh tác vụ hoặc cửa sổ khác) và sau đó nhấp vào một trong số select s để mở rộng option s và xem bảng điều khiển.

Sử dụng Chrome 17.0.963.79 m.

6

Thật đáng sợ khi những điều này có thể xảy ra. Tôi đã chạy vào vấn đề này chính xác tại nơi làm việc ngày hôm nay, nhưng đã nhanh chóng bằng văn bản này tắt nghi ngờ lắng nghe sự kiện và tuyên truyền dodgy trong một plugin của bên thứ 3 (jQuery customInput). Tôi sẽ kiểm tra lại jsfiddle của bạn vào ngày mai.

Tôi không thể tạo lại kết quả chính xác của mình trên thiết bị hiện có sẵn (Chrome v17 trên máy Mac) nhưng tôi có lý thuyết để chia sẻ. Trong kịch bản của bạn và trong Ben Lee 's bình luận phần nhất quán là chuyển tập trung vào một cửa sổ khác (giao diện điều khiển trong trường hợp của bạn).

Check-out http://www.quirksmode.org/dom/events/blurfocus.html dưới "Window + yếu tố thể đặt tiêu điểm":

Nếu cửa sổ sẽ được gửi ngược trong khi một yếu tố có thể đặt tiêu là tập trung, sự kiện mờ nên kích hoạt trên cả hai. Nếu cửa sổ được đưa ra một lần nữa, sự kiện tập trung sẽ kích hoạt trên cả hai.

Và tiếp theo, trong bảng tính tương thích nó lưu ý rằng

Safari của Windows bắn hai sự kiện tập trung.

Có lẽ Chrome cuối cùng cũng có "tính năng" này, đến từ gia đình Webkit và tất cả?

+0

Cảm ơn bạn, câu trả lời của bạn là chính xác và liên kết cũng hữu ích. Tôi đã quyết định chọn câu trả lời của Stefan, bởi vì anh ấy đã cho tôi thông tin chính xác và chính xác về lý do của vấn đề này (hoặc chỉ hành vi khác, nếu bạn muốn), trong khi bạn chỉ đăng lý thuyết của mình. Đó là sự thật, thực sự, vì vậy +1, anyway. – noname

+0

@noname: tiết kiệm cho tôi sự cần thiết phải kiểm tra lại nó :) –