Saya menautkan ke stylesheet jQuery Mobile di CDN dan ingin kembali ke stylesheet versi lokal saya jika CDN gagal. Untuk skrip, solusinya terkenal:
<!-- Load jQuery and jQuery mobile with fall back to local server -->
<script src="http://code.jquery.com/jquery-1.6.3.min.js"></script>
<script type="text/javascript">
if (typeof jQuery == 'undefined') {
document.write(unescape("%3Cscript src='jquery-1.6.3.min.js'%3E"));
}
</script>
Saya ingin melakukan sesuatu yang serupa untuk style sheet:
<link rel="stylesheet" href="http://code.jquery.com/mobile/1.0b3/jquery.mobile-1.0b3.min.css" />
Saya tidak yakin apakah pendekatan serupa dapat dicapai karena saya tidak yakin apakah browser memblokir dengan cara yang sama saat menautkan skrip seperti saat memuat skrip (mungkin mungkin untuk memuat lembar gaya di tag skrip dan kemudian masukkan ke dalam halaman)?
Jadi pertanyaan saya adalah: Bagaimana cara memastikan stylesheet dimuat secara lokal jika CDN gagal?
Jawaban:
Tidak diuji lintas-browser tetapi saya pikir ini akan berhasil. Akan harus setelah Anda memuat jquery, atau Anda harus menulis ulang dalam Javascript biasa.
sumber
CSSStyleSheet
objek js yang berasal dari bootstrapcdn.com semuanya kosongrules
dancssRules
bidang di browser saya (Chrome 31). UPD : sebenarnya mungkin masalah lintas domain, file css di jawaban juga tidak berfungsi untuk saya.onerror
acara. stackoverflow.com/questions/30546795/….rules
/.cssRules
untuk lembar gaya eksternal. jsfiddle.net/E6yYN/13Saya kira pertanyaannya adalah untuk mendeteksi apakah stylesheet dimuat atau tidak. Salah satu pendekatan yang mungkin adalah sebagai berikut:
1) Tambahkan aturan khusus di akhir file CSS Anda, seperti:
2) Tambahkan div yang sesuai di HTML Anda:
3) Pada dokumen siap, periksa apakah
#foo
terlihat atau tidak. Jika stylesheet dimuat, itu tidak akan terlihat.Demo di sini - memuat tema kelancaran jquery-ui; tidak ada aturan yang ditambahkan ke stylesheet.
sumber
Dengan asumsi Anda menggunakan CDN yang sama untuk css dan jQuery, mengapa tidak melakukan satu tes saja dan menangkap semuanya ??
sumber
document.write("<script type='text/javascript' src='path/to/file.js'>")
?<script>
di dalam string JS dan yang ditemukan di luar. Inilah alasan umum mengapa Anda juga melihat<\/script>
saat menulis tag untuk penggantian CDN.why not just do one test and catch it all?
- Karena ada sejuta alasan mengapa seseorang mungkin gagal, dan yang lainnya berhasil.artikel ini menyarankan beberapa solusi untuk bootstrap css http://eddmann.com/posts/providing-local-js-and-css-resources-for-cdn-fallbacks/
alternatifnya ini bekerja untuk fontawesome
sumber
Anda mungkin dapat menguji keberadaan stylesheet di
document.styleSheets
.Uji sesuatu yang spesifik untuk file CSS yang Anda gunakan.
sumber
Seseorang dapat menggunakannya
onerror
untuk itu:Ini
this.onerror=null;
untuk menghindari loop tanpa akhir jika fallback itu sendiri tidak tersedia. Namun, ini juga dapat digunakan untuk memiliki beberapa fallback.Namun, saat ini ini hanya berfungsi di Firefox dan Chrome.
sumber
Ini perpanjangan dari jawaban katy lavallee. Saya telah membungkus semuanya dalam sintaks fungsi yang dijalankan sendiri untuk mencegah tabrakan variabel. Saya juga membuat skrip tidak spesifik untuk satu tautan. IE, sekarang semua tautan lembar gaya dengan atribut url "data-fallback" akan diurai secara otomatis. Anda tidak perlu melakukan hard-code url ke dalam skrip ini seperti sebelumnya. Perhatikan bahwa ini harus dijalankan di akhir
<head>
elemen daripada di akhir<body>
elemen, jika tidak maka dapat menyebabkan FOUC .http://jsfiddle.net/skibulk/jnfgyrLt/
.
sumber
document.styleSheets[i].ownerNode.dataset
Anda dapat mengakses<link data-* />
atributApakah Anda benar-benar ingin menggunakan rute javascript ini untuk memuat CSS jika CDN gagal?
Saya belum memikirkan semua implikasi kinerja tetapi Anda akan kehilangan kendali ketika CSS dimuat dan secara umum untuk kinerja pemuatan halaman, CSS adalah hal pertama yang ingin Anda unduh setelah HTML.
Mengapa tidak menangani ini di tingkat infrastruktur - petakan nama domain Anda sendiri ke CDN, berikan TTL singkat, pantau file di CDN (misalnya menggunakan Watchmouse atau yang lainnya), jika CDN gagal, ubah DNS ke situs cadangan.
Opsi lain yang mungkin membantu adalah "cache forever" pada konten statis, tetapi tidak ada jaminan browser akan menyimpannya atau menggunakan app-cache.
Pada kenyataannya seperti yang dikatakan seseorang di atas, jika CDN Anda tidak dapat diandalkan, dapatkan yang baru
Andy
sumber
Lihatlah fungsi-fungsi ini:
Dan inilah versi JavaScript vanilla:
Sekarang fungsi sebenarnya:
Pastikan AddLocalCss dipanggil di kepala.
Anda juga dapat mempertimbangkan untuk menggunakan salah satu cara berikut yang dijelaskan dalam jawaban ini :
Muat menggunakan AJAX
Muat menggunakan yang dibuat secara dinamis
atau
sumber
Saya mungkin akan menggunakan sesuatu seperti yepnope.js
Diambil dari readme.
sumber
sumber