2011-07-13 12 views
30

Tôi hiện đang xây dựng trang web công ty cho khách hàng sử dụng phông chữ tùy chỉnh rộng rãi.Cách biết khi nào phông chữ đã được áp dụng

Trên jQuery sẵn sàng DOM Tôi đang thực hiện tính toán vị trí để tìm ra nơi một số menu bật lên có chiều rộng và chiều cao động phải được đặt dựa trên nội dung động của chúng.

Những tính toán này không thành công, vì DOM sẵn sàng được kích hoạt trước khi áp dụng phông chữ và do đó chiều rộng và chiều cao không chính xác.

Ngay bây giờ (đối với nguyên mẫu) tôi đang thực hiện các phép tính 500ms sau khi DOM sẵn sàng để giảm bớt vấn đề này, nhưng điều này không thể đi vào sản xuất vì lý do rõ ràng.

Sự cố đã được quan sát thấy trong Firefox và chrome mới nhất. IE 8 dường như không có vấn đề, nhưng sau đó đám cháy sẵn sàng DOM khá muộn, vì vậy sự chậm trễ là loại xây dựng trong tôi đoán :)

Đang chờ sự kiện tải không phải là một lựa chọn, vì vậy câu hỏi của tôi bạn là:

Có cách nào đáng tin cậy để tìm ra khi áp dụng phông chữ?

+0

Vâng, tôi không chắc chắn nếu điều này sẽ giúp, nhưng thay vì làm ma thuật của bạn trên document.ready cố gắng để làm điều đó trên window.load. Nó cháy một chút sau khi hình ảnh, vv được tải, nhưng có thể có một số font-nhấp nháy, mà dường như không mong muốn. – ddinchev

+0

Như tôi đã nói, Đang chờ sự kiện tải không phải là một tùy chọn. –

+0

OK, sau đó bạn sử dụng điều gì để áp dụng phông chữ? Có những thư viện để làm những việc như thế này có thể có sự kiện thích hợp được bắn vào đúng chỗ rồi. Cufon, FLIR và SIFR là rất ít mà tôi nhớ lại đó là chính xác có nghĩa là để đối phó với font-thay thế và tôi sẽ ngạc nhiên nếu họ đã không quản lý để khắc phục vấn đề trên! – ddinchev

Trả lời

54

Tôi đã tìm thấy giải pháp sau khi tự hỏi tại sao IE không gặp phải vấn đề này.

Firefox và Chrome/Safari kích hoạt sự kiện DOMContentLoaded trước khi áp dụng phông chữ, do đó gây ra sự cố.

Giải pháp là để không nghe cho DOMContentLoaded nhưng thay vì đi oldschool và nghe onreadystatechange và đợi cho đến khi document.readyState === 'complete' mà luôn được kích hoạt sau khi font-face được áp dụng (như xa như tôi có thể biết được các bài kiểm tra của tôi) - đó là của tất nhiên những gì luôn xảy ra trong IE vì nó không hỗ trợ DOMContentLoaded.

Vì vậy, về cơ bản bạn có thể cuộn-của riêng bạn sự kiện trong jQuery gọi fontfaceapplied - có thể nó sẽ được xây dựng tại;)

document.onreadystatechange = function() { 
    if (document.readyState === 'complete') 
     $(document).trigger('fontfaceapplied'); 
}; 

thực tế vui: Opera làm nó đúng và chờ đợi để kích hoạt DOMContentLoaded cho đến phông chữ -face được áp dụng.

+0

+1. Hmm. Rất thú vị, và một chút nghiên cứu tuyệt vời. Cảm ơn vì đã chia sẻ nó. Tôi sẽ phải nhớ điều này. (btw, tôi cảm thấy một huy hiệu 'Tự Học viên' trong tương lai gần .... ;-)) – Spudley

+4

Câu trả lời hay, tuy nhiên tôi thấy rằng Chrome (16.0.912.77) sẽ báo cáo rằng sự đọc là 'hoàn thành' ngay cả khi phông chữ -face chưa được áp dụng. Chính xác hơn nếu nó đã được áp dụng, nó sẽ không nhất thiết có sẵn nếu bạn đang cố gắng sử dụng nó trong một cái gì đó giống như một bối cảnh Canvas. Ngoài ra, một cái bẫy tôi chỉ rơi vào, jQuery sẽ không chờ đợi để cháy sự kiện sẵn sàng của nó cho đến khi 'hoàn thành', nó cũng sẽ cháy nếu trạng thái là 'tương tác' – tapi

+0

@tapi: Sự kiện sẵn sàng của jQuery lắng nghe DOMContentLoaded để nó vô ích khi được sử dụng với phông chữ tùy chỉnh. –

1

Đặt chức năng kích hoạt sau khi hết thời gian chờ 200ms giải quyết vấn đề này khi sử dụng Google Fonts.

Có một bước nhảy đáng chú ý, nhưng thường có độ cao bằng nhau, đối với những người theo chủ nghĩa thuần túy, điều này có thể không hoàn hảo nhưng nó hoạt động trên trình duyệt chéo.