Laden Sie das CSS-Stylesheet dynamisch und warten Sie, bis es geladen ist

Lesezeit: 3 Minuten

Benutzer-Avatar
Meskeeb

Ich habe ein Skript, das einen Klick auf eine Schaltfläche erkennt, auf die es mit jQuery ein CSS-Stylesheet an den “Kopf” anfügt:

const link = "<link class="listcss" rel="stylesheet" href="http://....list.css">";
$("head").append(link);

Dann muss ich einige Berechnungen basierend auf den CSS-Eigenschaften Breite und Höhe durchführen:

function CSSDone(){
            if($(window).width()>640){
                $(".grid-item").css({"height":$(".grid-item").width()*0.2});
                $(".grid_item_img").css({"height":$(".grid-item").width()*0.2});
            console.log("a");
            }else{
                $(".grid-item").css({"height":$(".grid-item").width()*0.33});
                $(".grid_item_img").css({"height":$(".grid-item").width()*0.33});
            console.log("b");       
            }
        }
        CSSDone();

Wenn ich jedoch CSSDone(); Unmittelbar nach dem Hinzufügen des Stylesheets finden die Berechnungen statt, bevor das CSS geladen wird. Ich habe wie verrückt im Internet gesucht, aber alles, was ich versucht habe, funktioniert nicht:

Ich habe diese Optionen ausprobiert:

  1. Funktioniert nicht:

    link.onload = Funktion () { CSSDone (); }

  2. Funktioniert nicht:

     if (link.addEventListener) {
       link.addEventListener('load', function() {
         CSSDone();
       }, false);
     }
    
  3. Funktioniert nicht:

     link.onreadystatechange = function() {
       var state = link.readyState;
       if (state === 'loaded' || state === 'complete') {
         link.onreadystatechange = null;
         CSSDone();
       }
     };
    
  4. Funktioniert nicht:

     $(window).load(function () {
         CSSDone();
     });
    
  5. Funktioniert nicht:

     $(window).bind("load", function() {
         CSSDone();
     });
    

Glaub mir. Nichts funktioniert……


**Eine Problemumgehung:**

Ich lade das CSS in das DOM und entferne es sofort wieder mit jQuery. Auf diese Weise ist es schnell genug, wenn Sie den Link später zum Kopf hinzufügen.

  • Mögliches Duplikat von CSS-Link ändern und warten, bis neues CSS geladen ist. Als Dupe für das Schließen zu stimmen, nicht weil dies eine schlechte Frage ist, sondern im Interesse der Konsolidierung von Informationen.

    – James McMahon

    30. August 2019 um 20:18 Uhr


  • Ich würde lieber dafür stimmen, die andere Frage statt dieser zu schließen.

    – Mesqueeb

    30. August 2019 um 22:23 Uhr

Benutzer-Avatar
TeaCoder

Sie müssen ein einfügen link Knoten im Kopf und dann befestigen onload Veranstaltung dazu. In Ihrem Code-Link ist ein String. Sehen Sie sich den Beispielcode unten an, um zu erfahren, wie Sie das Gewünschte implementieren.

var link = document.createElement('link');
link.setAttribute("rel", "stylesheet");
link.setAttribute("type", "text/css");
link.onload = CSSDone;
link.setAttribute("href", 'https://maxcdn.bootstrapcdn.com/bootstrap/3.3.6/css/bootstrap.min.css');
document.getElementsByTagName("head")[0].appendChild(link);

Überprüfen jsfiddle.

MDN-Referenz auf Link-Element falls Sie neugierig sind

  • @mesqueeb, ich glaube nicht, dass es funktionieren wird, ich glaube nicht, dass der Link ein Onload-Ereignis hat

    – YugoAmaryl

    16. November 2018 um 7:00 Uhr

  • @mok naja. Daran kann ich mich jedenfalls nicht erinnern. Es ist mehr als zwei Jahre her XD

    – Mesqueeb

    16. November 2018 um 7:01 Uhr

  • Am Ende verwende ich einen Hack mit dem Image.onerror-Ereignis

    – YugoAmaryl

    16. November 2018 um 8:54 Uhr

  • link.onload = CSSDone ….es gibt keinen Grund, eine anonyme Funktion zu haben, die nur eine andere Funktion aufruft.

    – I habe einmal mit einem Bär gekämpft.

    9. Juni 2019 um 1:41 Uhr

Sie können dies versuchen, glaube ich CSSDone() Code ein $("head").append(link)Rückruf von

$(document).ready(function(){
$('.btn').on('click', function(){
link = "<link class="listcss" rel="stylesheet" href="https://stackoverflow.com/list.css">";
        $("head").append(link, function(){
        if($(window).width()>640){
                $(".grid-item").css({"height":$(".grid-item").width()*0.2});
                $(".grid_item_img").css({"height":$(".grid-item").width()*0.2});
            console.log("a");
            }else{
                $(".grid-item").css({"height":$(".grid-item").width()*0.33});
                $(".grid_item_img").css({"height":$(".grid-item").width()*0.33});
            console.log("b");       
            }

        }); // append link

        }); // button click
}); // document ready

Verwendung von jQuery:

var head = $('head');
var link = $('<link>')
    .attr('rel', 'stylesheet')
    .attr('type', 'text/css')
    .attr('href', url)
                        .on('load', callback)
                        .on('error', error)
                       .appendTo(head);

1011470cookie-checkLaden Sie das CSS-Stylesheet dynamisch und warten Sie, bis es geladen ist

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy