Wie kann ich laden Sie ein stylesheet, das durch ajax UND eine callback-wenn der laden fertig ist

Ich brauche, zu laden, eine Reihe von CSS-Dateien durch ajax und eine animation, wenn Sie das stylesheet geladen wurde, andernfalls wird die animation scheitern.

Was habe ich so gemacht und funktioniert ziemlich gut, bis ich kam accross tun, diese cross-domain ist:

$.get(resource.url, {cache:true}, function(css) {
    //Now that the stylesheet is in the browser cache, it will load instantly:  

    $("head").append($("<link>",{
       rel: "stylesheet",
       type: "text/css",
       href: resource.url
    }));

}).then(function(){
   //Animation here that depends on the loaded css
});

Dies funktioniert gut, solange resource.url ist auf der gleichen domain. Sobald ich versuche, das laden der css von einer anderen Domäne $.get wird scheitern wie diese:

XMLHttpRequest cannot load https://example.com/style.css. Origin https://example.com is not allowed by Access-Control-Allow-Origin.

Also habe ich versucht, hinzufügen von CORS in der Kopfzeile durch .htaccess:

<IfModule mod_headers.c>
    #cross domain access is okay for resources (#107)
    <FilesMatch "\.(css|js)$"> 
        Header add Access-Control-Allow-Origin "*"
    </FilesMatch>
</IfModule>

Dadurch wird die CORS-header, um alle CSS-und JS-Ressourcen.

Aus irgendeinem Grund CORS scheint nicht zu haben eine Wirkung auf, entweder chrome oder firefox (neueste Versionen).

Kam ich auch zu bemerken, dass dieselbe Domäne-Richtlinie wird nicht erzwungen, wenn dabei $.getScript für js-Dateien, aber es ist für $.get:

$.get("https://example.com/script.js", {cache: false}, $.noop, "script"); 

//works regardless of CORS

aber:

$.get("https://example.com/script.js", {cache: false}, $.noop); 

//does not work (cross domain policy violation)

So, da CORS ist nicht allgemein unterstützt und nicht einmal scheinen, das problem zu lösen für Sie einen modernen browser, ich brauche etwas, das verhält sich wie $.getScript, aber für CSS-stylesheets.

Muss es asynchrone und eine callback-Mechanismus.

Irgendwelche Ideen? Vielen Dank im Voraus...

  • Zur Klärung: deine Seite auf foo.com ist das ausführen einer fetch-Anweisung eine CSS-Ressource auf einer anderen domain bar.com. Sie haben Hinzugefügt die CORS-Header der Seiten, die auf bar.com, richtig?
  • ich habe den Header für die css-Ressourcen. Sollte es auf der html-Seiten?
  • Nein, ich wollte nur sicherstellen, dass Sie nicht versehentlich die Einstellung der CORS-Header auf der Seite/domain, mit dem Abruf. Sie müssen CORS-Header für die cross-domain-Ressourcen, die heruntergeladen wird, was bedeutet, dass Sie Steuern müssen, dass cross-domain-Ressourcen. CORS ist eine Art zu sagen, "hey, jeder, es ist okay, auf diese Ressource zuzugreifen, die im cross-domain-Weise," nicht eine Art zu sagen: "okay, die Seite auf meiner domain ist, gehen Sie weiter, einen Zugang, was auch immer-domains, die Sie wollen". Sie machen nicht klar, was Sie versuchen zu tun, so wollte ich das klären.
  • gut, dass ist es, was ich dachte und wie ich es umgesetzt. Letzteres würde keinen Sinn machen überhaupt...
  • Okay, Super. Schreiben Sie eine Antwort jetzt!
  • Toll, wir freuen uns auf Sie. Danke.
  • Soweit die CORS betroffen ist-nicht mein cup of joe. Allerdings würde ich gerne teilen (was ich denke) ist etwas wertvolles wissen. jQuery append() ist eine synchrone Funktion. Was bedeutet, dass nichts ausgeführt wird, bis das anfügen abgeschlossen ist. Dies bedeutet, dass Sie brauchen keine then Anweisung, einfach die animate() nach der $('head').append() Funktion.
  • ja du hast Recht, aber die Art und Weise ist es wirklich implementiert ist (ich habe gerade eded die entsprechenden Schnipsel hier) ist wie dieser: return $.get(...,function(){...}); und die dann so: `$.getStyleSheet(...).dann();, aber thx. Auch dies ist nicht so viel über CORS. CORS ist nur ein Grund, warum ich die aktuelle Methode nicht funktioniert, aber die Lösung sollte es nicht sein, in Bezug auf cors als alte Browser (IE ofc) nicht unterstützen.
  • Sie, sir, sind Sie ein Gentleman und ein Gelehrter. Ich Wünsche Ihnen das allerbeste!
  • Ich denke JsFiddle.net hat bereits eine Lösung für das einbinden von stylesheets und/oder andere Ressourcen wie JS. Sie können die Ansicht-Quelltext Ihrer Website.

InformationsquelleAutor d_inevitable | 2012-07-12
Schreibe einen Kommentar