2017-09-29 15 views
1

私はCSSファイルを読み込むのを怠惰にしてから、をロードした後に、のページをjavascriptで修正したいと思っています。ここに示したようにそのために、私は、thisアプローチを使用しています:コールバックと遅延読み込みCSS with vanilla javascript

lazyLoadCSS = function (pathToStyleSheet, options, callback) { 
    var stylesheet = document.createElement('link'); 
    stylesheet.href = pathToStyleSheet; 
    stylesheet.rel = 'stylesheet'; 
    stylesheet.type = 'text/css'; 
    // temporarily set media to something inapplicable to ensure 
    // it'll fetch without blocking render 
    stylesheet.media = 'only x'; 
    // set the media back when the stylesheet loads 
    stylesheet.onload = function() { 
     stylesheet.media = 'all'; 

     // here be callbacks... 
     callback(); 
    }; 
    document.getElementsByTagName('head')[0].appendChild(stylesheet); 
}; 

ので、アイデアはJavaScriptをCSSを取り出しますが、ブラウザはそれを考えていない「だけx」のようにそれをsmuggles、ありますページの残りの部分をレンダリングする前にファイルを待つ必要があります。これが全体のポイントです。このapproachはかなり標準的なようで、上記のコードは動作しません。

唯一の問題はコールバックです。これは、CSSがロードされた後でスタイルが文書に適用される前に発生します。

私のようなので、コールバックにタイマーを置く場合:

window.setTimeout(function(){ 
    callback(); 
}, 2000); 

をその後、すべてがまさにそれは(のみ遅い)すべきであるように動作します。

質問:CSSをロードするだけでなく、に適用する前に、callback()を実行するにはどうすればよいですか。

function waitForStylesToApply(cycleNumber, canary, callback){ 
    if(cycleNumber < 100){ 
     window.setTimeout(function(){ 
      var computedValue = window 
       .getComputedStyle(window.document.body, null) 
       .getPropertyValue('max-width'); 
      if(computedValue !== canary){ 
       if(typeof callback === 'function'){ 
        console.log('done in ' + cycleNumber + ' cycles'); 
        callback();            
       } 
      } 
      else { 
       waitForStylesToApply(cycleNumber++, canary, callback);       
      } 
     }, 10);  
    } 
} 

のチェックを計算したスタイルに<body>のために何度も繰り返し、それまで:上記のいくつかのコメントを1として

+0

レンダリング後にコードを実行する一般的な方法は、遅延値なしで 'setTimeout'を呼び出すことです:' setTimeout(()=> callback()) '。それを試してみてください。それがあなたのシナリオのために働くならば、それは十分であるはずです。 – ideaboxer

+0

私はこのようなものに傾いていましたが、ちょっと...シンプルなようでしたか?あまりにも明らかだ?誰かにそれがうまくいくことに同意するのは良いことです。 – crowhill

+0

あなたは 'onIdle'と考えることができます。 AngularJSでもそれを採用して( '$ timeout'と呼んでいます)、アイドルコールバックをシミュレートするために使用されます。例えば:https://stackoverflow.com/questions/20610450/angularjs-timeout-without-delay-parameters-reason – ideaboxer

答えて

0

が、これは(それが徹底的にテストされていないですが)私が作ってみた、それは素晴らしい仕事何です変更。その後、コールバックを行います。これまでのところ、コードは何度も繰り返されることはありませんでしたので、待ち時間は極限です。

10の遅延も多すぎます。コードは0の遅延で動作し、それでも1回だけ循環します。

EDIT:上記の例では単にcallback()を使用する代わりに、この関数を使用します。

関連する問題