জাভাস্ক্রিপ্ট ব্যবহার করে সিএসএস ফাইলগুলি কীভাবে লোড করবেন?


316

জাভাস্ক্রিপ্ট ব্যবহার করে কি এইচটিএমএল পৃষ্ঠায় CSS স্টাইলশিট আমদানি করা সম্ভব? যদি তা হয় তবে কীভাবে এটি করা যায়?

পিএস জাভাস্ক্রিপ্টটি আমার সাইটে হোস্ট করা হবে তবে আমি চাই যে ব্যবহারকারীরা <head>তাদের ওয়েবসাইটের ট্যাগ এনে দিতে সক্ষম হন এবং এটি আমার সার্ভারে হোস্ট করা একটি সিএসএস ফাইলটি বর্তমান ওয়েব পৃষ্ঠায় আমদানি করতে সক্ষম হওয়া উচিত। (সিএসএস ফাইল এবং জাভাস্ক্রিপ্ট ফাইল উভয়ই আমার সার্ভারে হোস্ট করা হবে)।


এছাড়া jQuery সম্পর্কে প্রশ্ন হল stackoverflow.com/questions/2685614/...
jcubic

উত্তর:


416

এখানে এটি করার "পুরাতন স্কুল" পদ্ধতিটি রয়েছে, যা আশা করা যায় যে সমস্ত ব্রাউজার জুড়ে কাজ করে। তত্ত্বের ক্ষেত্রে, আপনি setAttributeদুর্ভাগ্যবশত আই 6 ব্যবহার করবেন এটি ধারাবাহিকভাবে সমর্থন করে না।

var cssId = 'myCss';  // you could encode the css path itself to generate id..
if (!document.getElementById(cssId))
{
    var head  = document.getElementsByTagName('head')[0];
    var link  = document.createElement('link');
    link.id   = cssId;
    link.rel  = 'stylesheet';
    link.type = 'text/css';
    link.href = 'http://website.com/css/stylesheet.css';
    link.media = 'all';
    head.appendChild(link);
}

এই উদাহরণটি সিএসএস ইতিমধ্যে যুক্ত করা হয়েছে কিনা তা পরীক্ষা করে তাই এটি কেবল একবার যুক্ত করে।

সেই কোডটিকে জাভাস্ক্রিপ্ট ফাইলে রাখুন, শেষ-ব্যবহারকারীকে কেবল জাভাস্ক্রিপ্ট অন্তর্ভুক্ত করুন এবং নিশ্চিত করুন যে সিএসএসের পথটি নিখুঁত তাই এটি আপনার সার্ভার থেকে লোড হয়েছে।

VanillaJS

এখানে headইউআরএল এর ফাইল নাম অংশের উপর ভিত্তি করে উপাদানটিতে সিএসএস লিঙ্ক ইনজেক্ট করার জন্য সরল জাভাস্ক্রিপ্ট ব্যবহার করে এমন একটি উদাহরণ এখানে দেওয়া হয়েছে :

<script type="text/javascript">
var file = location.pathname.split( "/" ).pop();

var link = document.createElement( "link" );
link.href = file.substr( 0, file.lastIndexOf( "." ) ) + ".css";
link.type = "text/css";
link.rel = "stylesheet";
link.media = "screen,print";

document.getElementsByTagName( "head" )[0].appendChild( link );
</script>

ক্লোজিং headট্যাগের ঠিক আগে কোডটি প্রবেশ করুন এবং পৃষ্ঠাটি রেন্ডার হওয়ার আগে সিএসএস লোড হবে। একটি বাহ্যিক জাভাস্ক্রিপ্ট ( .js) ফাইল ব্যবহারের ফলে স্টাইলবিহীন সামগ্রীর একটি ফ্ল্যাশ উপস্থিত হতে পারে ( FOUC )।


6
সিএসএস ফাইল লোড হয়ে গেলে কলব্যাক চালানোর বিষয়ে কী বলা যায়?
jchook

1
এটি নির্ভরযোগ্যভাবে করা আরও জটিল। জনপ্রিয় জাভাস্ক্রিপ্ট লাইব্রেরিতে এখন সাধারণত একটি কলব্যাক সহ জাভাস্ক্রিপ্ট এবং স্টাইলশিট লোড করার কিছু ফর্ম থাকে। উদাহরণ হিসাবে, YUI পান দেখুন

9
ডকুমেন্ট শর্টকাটের জন্য than এর চেয়ে আলাদা চরিত্রটি ব্যবহার করা ভাল হবে, কারণ এটি সহজেই jQuery এ হস্তক্ষেপ করতে পারে (আমার ক্ষেত্রে যেমন হয়েছে);)
জাথ্রাস লেখক

2
@ jonnybojangles jQuery.noConflict ব্যবহার করার অর্থ আপনার সমস্ত রেফারেন্সের নাম jQuery এর নামকরণ $ হিসাবে করা হবে $ সিএসএস লোডারটির জন্য ভিন্ন ভিন্ন ভেরিয়েবলের নামটি ব্যবহার করা এত সহজ।
টমমিপ্যাট

2
@jchook আমি যোগ করার link.onload = function(){ ... }আগে যোগ করে একটি কলব্যাক সংযুক্ত করতে সক্ষম হয়েছি
লাউঞ্জ 9

74

আপনি যদি jquery ব্যবহার করেন:

$('head').append('<link rel="stylesheet" type="text/css" href="style.css">');

1
পেজলোডের ঠিক আগে স্টাইলশিটটি ইনজেকশন করা হলে এটি কাজ করবে? আমি যখন ড্রপবক্সে হোস্ট করেছি এমন একটি সিএসএস ফাইল সহ একটি ভারী পৃষ্ঠায় কনসোলের ভিতরে এই কমান্ডটি চালিত করি তখন এটি কাজ করবে না। আমি কিভাবে এই কাজ করতে পারেন কোন ধারণা:$('head').append('<link rel="stylesheet" type="text/css" href="https://dl.dropboxusercontent.com/s/ep1nzckmvgjq7jr/remove_transitions_from_page.css">');
টমাস

50

আমার ধারণা, এই স্ক্রিপ্টটি এমন কিছু করবে:

<script type="text/javascript" src="/js/styles.js"></script>

এই জেএস ফাইলটিতে নিম্নলিখিত বিবৃতি রয়েছে:

if (!document.getElementById) document.write('<link rel="stylesheet" type="text/css" href="https://stackoverflow.com/css/versions4.css">');

জাভাস্ক্রিপ্ট এবং সিএসএসের ঠিকানাটি যদি আপনার সাইটে উল্লেখ করা হয় তবে তা নিখুঁত হওয়া দরকার।

অনেকগুলি সিএসএস আমদানি কৌশলগুলি এই "ব্রাঞ্চিং কৌশলগুলির সাথে সিএসএস হ্যাকগুলিকে বলুন না" নিবন্ধে আলোচনা করা হয়েছে।

তবে "পোর্টলেট সিএসএস স্টাইলশিটগুলি গতিশীলভাবে যুক্ত করার জন্য জাভাস্ক্রিপ্ট ব্যবহার করে" নিবন্ধে ক্রিয়েটস্টাইলশিট সম্ভাবনার কথাও বলা হয়েছে (আই-এর স্বত্বাধিকারী পদ্ধতি):

<script type="text/javascript">
//<![CDATA[
if(document.createStyleSheet) {
  document.createStyleSheet('http://server/stylesheet.css');
}
else {
  var styles = "@import url(' http://server/stylesheet.css ');";
  var newSS=document.createElement('link');
  newSS.rel='stylesheet';
  newSS.href='data:text/css,'+escape(styles);
  document.getElementsByTagName("head")[0].appendChild(newSS);
}
//]]>

document.createStyleSheet()ব্রাউজারগুলিতে যা যুক্ত নেই সেগুলি
ক্রিস্টোফ

1
কোন ক্ষেত্রে ঠিক তা নিশ্চিত নয়, তবে কিছু ক্ষেত্রে document.writeএটি প্রস্তাবিত নয় কারণ এটি আপনার ওয়েবসাইটের পুরো অংশকে ওভাররাইট করে।
এডুয়ার্ড লুকা

@ ভনসি, <style>এটির <head>মাধ্যমে প্রথম সন্তানের ধারণা না করে উপাদানটি সরাসরি পাওয়ার জন্য কোনও ফাংশন আছে কি ("head")[0]?
পেসারিয়ার

@ পেসারিয়র আমি বিশ্বাস করি যে আপনি এটি জিআরএল জিএস / ফর্ম / টোপটপিক / প্রোটোটাইপ- স্ক্রিপ্ট্যাকুলিয়াস/… তে আলোচনা করেছেন । এটি উদাহরণস্বরূপ হবে:var style = document.getElementsByTagName("style")[0];
ভোনসি

20

Element.insertAdjacentHTML- তে খুব ভাল ব্রাউজার সমর্থন রয়েছে এবং এটি একটি লাইনে একটি স্টাইলশিট যুক্ত করতে পারে।

document.getElementsByTagName("head")[0].insertAdjacentHTML(
    "beforeend",
    "<link rel=\"stylesheet\" href=\"path/to/style.css\" />");

12

যদি আপনি জানতে চান (বা অপেক্ষা করুন) যতক্ষণ না শৈলী নিজেই এই কাজগুলি লোড করে দেয়:

// this will work in IE 10, 11 and Safari/Chrome/Firefox/Edge
// add ES6 poly-fill for the Promise, if needed (or rewrite to use a callback)

let fetchStyle = function(url) {
  return new Promise((resolve, reject) => {
    let link = document.createElement('link');
    link.type = 'text/css';
    link.rel = 'stylesheet';
    link.onload = function() { resolve(); console.log('style has loaded'); };
    link.href = url;

    let headScript = document.querySelector('script');
    headScript.parentNode.insertBefore(link, headScript);
  });
};

আমি এটি কীভাবে ব্যবহার করব
রাজ শর্মা

আপনি কি করবেন fetchStyle (URL) .then (ফাংশন () {কাপড় এখানে যায়}) প্রতিশ্রুতি উপর পড়তে
বেন Taliadoros

8

আমি জানি এটি বেশ পুরানো থ্রেড তবে এখানে আমার 5 সেন্ট আসবে।

আপনার প্রয়োজনীয়তাগুলির উপর নির্ভর করে এটি করার আরও একটি উপায় আছে।

আমার একটি কেস রয়েছে যেখানে আমি চাই যে একটি সিএসএস ফাইলটি কেবলমাত্র কিছুক্ষণ সক্রিয় থাকে। সিএসএস স্যুইচিংয়ের মতো। CSS সক্রিয় করুন এবং তারপরে অন্য ইভেন্টের পরে এটি ডিএটিভেট করুন।

সিএসএসকে গতিশীলভাবে লোড করার পরিবর্তে এবং এরপরে সরিয়ে আপনি নতুন সিএসএসে সমস্ত উপাদানগুলির সামনে একটি শ্রেণি / একটি আইডি যুক্ত করতে পারেন এবং তারপরে আপনার সিএসএসের বেস নোডের (বডি ট্যাগের মতো) শ্রেণি / আইডিটি স্যুইচ করতে পারেন।

আপনার এই সমাধানটির সাথে আরও সিএসএস ফাইল প্রাথমিকভাবে লোড হবে তবে আপনি সিএসএস লেআউটগুলিকে স্যুইচ করার আরও গতিশীল উপায় পাবেন।


7

একটি আধুনিক ব্রাউজারে আপনি এটি ব্যবহার করতে পারেন promise। এতে প্রতিশ্রুতি সহ একটি লোডার ফাংশন তৈরি করুন:

function LoadCSS( cssURL ) {

    // 'cssURL' is the stylesheet's URL, i.e. /css/styles.css

    return new Promise( function( resolve, reject ) {

        var link = document.createElement( 'link' );

        link.rel  = 'stylesheet';

        link.href = cssURL;

        document.head.appendChild( link );

        link.onload = function() { 

            resolve(); 

            console.log( 'CSS has loaded!' ); 
        };
    } );
}

তারপরে স্পষ্টতই আপনি CSS লোড হওয়ার পরে কিছু করতে চান। সিএসএস এর পরে লোড হওয়ার পরে যে ফাংশনটি চালানো দরকার তা আপনি কল করতে পারেন:

LoadCSS( 'css/styles.css' ).then( function() {

    console.log( 'Another function is triggered after CSS had been loaded.' );

    return DoAfterCSSHasLoaded();
} );

এটি কীভাবে কাজ করে তা যদি আপনি গভীরতার সাথে বুঝতে চান তবে দরকারী লিঙ্কগুলি:

প্রতিশ্রুতি উপর অফিসিয়াল ডক্স

প্রতিশ্রুতিবদ্ধ কার্যকর গাইড

প্রতিশ্রুতি উপর একটি দুর্দান্ত পরিচয় ভিডিও


6

এই কোডটি ব্যবহার করুন:

var element = document.createElement("link");
element.setAttribute("rel", "stylesheet");
element.setAttribute("type", "text/css");
element.setAttribute("href", "external.css");
document.getElementsByTagName("head")[0].appendChild(element);

4

একটি সাধারণ jquery প্লাগইন রয়েছে যা সিএসএস এবং জেএস ফাইল সিঙ্ক এবং চাহিদা অনুযায়ী অ্যাসিচ লোড করে। এটি ইতিমধ্যে কী লোড হয়েছে তা ট্র্যাক করে রাখে :) দেখুন: http://code.google.com/p/rloader/


4

এখানে jQuery এর উপাদান তৈরি পদ্ধতি (আমার পছন্দ) এবং কলব্যাক সহ একটি উপায় onLoad:

var css = $("<link>", {
  "rel" : "stylesheet",
  "type" :  "text/css",
  "href" : "style.css"
})[0];

css.onload = function(){
  console.log("CSS IN IFRAME LOADED");
};

document
  .getElementsByTagName("head")[0]
  .appendChild(css);



2

জেএস এবং / অথবা সিএসএস লোড করার জন্য ব্যবহার করে একটি পূর্ণ কোডের নীচে

function loadScript(directory, files){
  var head = document.getElementsByTagName("head")[0]
  var done = false
  var extension = '.js'
  for (var file of files){ 
    var path = directory + file + extension 
    var script = document.createElement("script")
    script.src = path        
    script.type = "text/javascript"
    script.onload = script.onreadystatechange = function() {
        if ( !done && (!this.readyState ||
            this.readyState == "loaded" || this.readyState == "complete") ) {
            done = true
            script.onload = script.onreadystatechange = null   // cleans up a little memory:
            head.removeChild(script)  // to avoid douple loading
        }
  };
  head.appendChild(script) 
  done = false
 }
}

function loadStyle(directory, files){
  var head = document.getElementsByTagName("head")[0]
  var extension = '.css'
  for (var file of files){ 
   var path = directory + file + extension 
   var link = document.createElement("link")
   link.href = path        
   link.type = "text/css"
   link.rel = "stylesheet" 
   head.appendChild(link) 
 }
}

(() => loadScript('libraries/', ['listen','functions', 'speak', 'commands', 'wsBrowser', 'main'])) ();
(() => loadScript('scripts/', ['index'])) ();

(() => loadStyle('styles/', ['index'])) ();

1

আমি কেবল সিএসএস নয়, সমস্ত সম্পদ (জেএসএস, সিএসএস, চিত্র) লোড করার জন্য আরও একটি উপায় ভাগ করতে চাই এবং ফাইলগুলির গুচ্ছগুলির জন্য ওভারলোড ইভেন্টটি পরিচালনা করব । এটা async-assets-loader। নীচের উদাহরণটি দেখুন:

<script src="https://unpkg.com/async-assets-loader"></script>
<script>
var jsfile = "https://code.jquery.com/jquery-3.4.1.min.js";
var cssfile = "https://cdnjs.cloudflare.com/ajax/libs/materialize/1.0.0/css/materialize.min.css";
var imgfile = "https://logos.keycdn.com/keycdn-logo-black.png";
var assetsLoader = new asyncAssetsLoader();
assetsLoader.load([
      {uri: jsfile, type: "script"},
      {uri: cssfile, type: "style"},
      {uri: imgfile, type: "img"}
    ], function () {
      console.log("Assets are loaded");
      console.log("Img width: " + assetsLoader.getLoadedTags()[imgfile].width);
    });
</script> 

মতে ASYNC-সম্পদ-লোডার ডক্স


0
var fileref = document.createElement("link")
fileref.setAttribute("rel", "stylesheet")
fileref.setAttribute("type", "text/css")
fileref.setAttribute("th:href", "@{/filepath}")
fileref.setAttribute("href", "/filepath")

আমি থাইমেলিফ ব্যবহার করছি এবং এটি ভাল কাজ করছে। ধন্যবাদ


th:hrefক্লায়েন্ট পক্ষের এ্যাট্রিবিউট যুক্ত করার বিন্দুটি কী ? এটি থাইমালিফ দ্বারা প্রক্রিয়া করা হবে না তাই এটি এখানে অপ্রয়োজনীয় বলে মনে হয়।
স্লাভা সেমুশিন
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.