পৃষ্ঠাটি পুনরায় লোড না করে সিএসএস পুনরায় লোড করার কোনও সহজ উপায় আছে?


90

আমি একটি পূর্বরূপ ফাংশন সহ একটি ইন-পেজ সিএসএস সম্পাদক করার চেষ্টা করছি যা স্টাইলশিটটি পুনরায় লোড করবে এবং পৃষ্ঠাটি পুনরায় লোড করার প্রয়োজন ছাড়াই এটি প্রয়োগ করবে। এটি সম্পর্কে সবচেয়ে ভাল উপায় কি হবে?


4
2014 এবং এই প্রশ্নটি হোম পৃষ্ঠায় ...
ক্রোল্টন

4
2019, প্রায় 2020, এবং এই প্রশ্নটি এখনও হোম পৃষ্ঠায় পপ করছে ...
ZER0

উত্তর:


51

"সম্পাদনা" পৃষ্ঠায়, আপনার সিএসএসকে স্বাভাবিক উপায়ে ( <link>ট্যাগ সহ) অন্তর্ভুক্ত করার পরিবর্তে, এটি একটি <style>ট্যাগে লিখুন। এর innerHTMLসম্পত্তি সম্পাদনা করা সার্ভারে রাউন্ড ট্রিপ ছাড়াই পৃষ্ঠাটি স্বয়ংক্রিয়ভাবে আপডেট হবে।

<style type="text/css" id="styles">
    p {
        color: #f0f;
    }
</style>

<textarea id="editor"></textarea>
<button id="preview">Preview</button>

জাভাস্ক্রিপ্ট, jQuery ব্যবহার করে:

jQuery(function($) {
    var $ed = $('#editor')
      , $style = $('#styles')
      , $button = $('#preview')
    ;
    $ed.val($style.html());
    $button.click(function() {
        $style.html($ed.val());
        return false;
    });
});

এবং যে এটা করা উচিত!

আপনি যদি সত্যিই অভিনব হতে চান, তবে টেক্সারিয়াতে কীডাউনটির সাথে ফাংশনটি সংযুক্ত করুন, যদিও আপনি কিছু অযাচিত পার্শ্ব প্রতিক্রিয়া পেতে পারেন (পৃষ্ঠাটি টাইপ করার সাথে সাথেই ধারাবাহিকভাবে পরিবর্তন হবে)

সম্পাদনা : পরীক্ষিত এবং কাজ করে (ফায়ারফক্স 3.5 তে, কমপক্ষে, যদিও অন্য ব্রাউজারগুলির সাথে ভাল হওয়া উচিত)। ডেমোটি এখানে দেখুন: http://jsbin.com/owapi


4
উপাদানসমূহ (এবং ) এর innerHTMLজন্য IE বারফ করে । <style><script>
জেপট

4
যদি এটি href'ed হয়?
অ্যালেনহকিম

বিটিডব্লিউ, আপনি টেক্সারিয়াতে কীডাউনটিতে একটি ফাংশন সংযুক্ত করতে পারেন তবে লো-ড্যাশ দিয়ে উদাহরণ দিয়ে এটি থ্রোট্ট করতে পারেন (উদাহরণস্বরূপ)।
ক্যামিলো মার্টিন

109

আপনার অবস্থার জন্য সম্ভবত প্রযোজ্য নয়, তবে বাহ্যিক স্টাইলশিটগুলি পুনরায় লোড করার জন্য আমি এখানে ব্যবহার করেছি jQuery ফাংশন:

/**
 * Forces a reload of all stylesheets by appending a unique query string
 * to each stylesheet URL.
 */
function reloadStylesheets() {
    var queryString = '?reload=' + new Date().getTime();
    $('link[rel="stylesheet"]').each(function () {
        this.href = this.href.replace(/\?.*|$/, queryString);
    });
}


36
এই নন-জিকুরি ও-লাইনারটি ক্রোমে আমার জন্য কাজ করে:var links = document.getElementsByTagName("link"); for (var i = 0; i < links.length;i++) { var link = links[i]; if (link.rel === "stylesheet") {link.href += "?"; }}
ক্লড

আমি নিশ্চিত কিনা তা এর কারণ কারণ আমি কেবল ডিস্ক থেকে ক্রোমে পৃষ্ঠা খুলছি তবে এটি আমার পক্ষে কাজ করছে না।
জোওও কার্লোস

14

এর জন্য jQuery ব্যবহার করার দরকার নেই। নিম্নলিখিত জাভাস্ক্রিপ্ট ফাংশনটি আপনার সমস্ত সিএসএস ফাইল পুনরায় লোড করবে:

function reloadCss()
{
    var links = document.getElementsByTagName("link");
    for (var cl in links)
    {
        var link = links[cl];
        if (link.rel === "stylesheet")
            link.href += "";
    }
}

4
আমি এটি কনসোলে ব্যবহার করছি তাই আমার কোডে আমার আর কিছু যুক্ত করার প্রয়োজন নেই
লোকো.লুপ

@ ব্রাম কোঁকড়া বন্ধনী alচ্ছিক। কোডটি সূক্ষ্মভাবে কাজ করে।
ড্যান ব্রে

4
এটি jQuery এর উপর নির্ভর করে না বলে দুর্দান্ত উত্তর! :)
গুস্তাভো স্ট্রুব

9

অ্যান্ড্রু ডেভির স্নোজি ভোগ প্রকল্পটি দেখুন - http://aboutcode.net/vogue/


এটিই আমি অনুসন্ধান করে যাচ্ছিলাম। স্টাইলশিটটি পরিবর্তন করার সাথে সাথে ম্যানুয়ালি পৃষ্ঠাটি রিফ্রেশ করার প্রয়োজন ছাড়াই এটি সিএসএস পুনরায় লোড করে। ভাগ করে নেওয়ার জন্য একটি টন ধন্যবাদ :)
ডিভনার

ভিগ স্থানীয়ভাবে স্থানীয়ভাবে চালানো যেতে পারে?
খ্রিস্টিলন

আমি ভোগের মতো পুনরায় লোড স্ক্রিপ্ট করার চেষ্টা করেছি। তবে ক্রোমে সমস্যা রয়েছে কারণ অলস স্টাইলশিট ফাইলগুলি ব্রাউজারে এবং কাজ করে। উদাহরণস্বরূপ, একটি উপাদানগুলিতে আমি ব্যাকগ্রাউন্ডটি লাল থেকে সাদাতে পরিবর্তন করেছি এবং আমি শেষ রঙের লালটি অক্ষম করে ফেলেছি।
পিটার

7

ভ্যানিলা জেএস এবং একটি লাইনে একটি সংক্ষিপ্ত সংস্করণ:

for (var link of document.querySelectorAll("link[rel=stylesheet]")) link.href = link.href.replace(/\?.*|$/, "?" + Date.now())

বা প্রসারিত:

for (var link of document.querySelectorAll("link[rel=stylesheet]")) {
  link.href = link.href.replace(/\?.*|$/, "?" + Date.now())
}

6

আরও একটি jQuery সমাধান

"সিএসএস" আইডি সহ একটি একক স্টাইলশিটের জন্য এটি ব্যবহার করে দেখুন:

$('#css').replaceWith('<link id="css" rel="stylesheet" href="css/main.css?t=' + Date.now() + '"></link>');

এটিকে এমন কোনও ফাংশনে আবদ্ধ করুন যাতে বিশ্বব্যাপী স্ক্রোপ থাকে এবং আপনি এটি Chrome এ বিকাশকারী কনসোল বা ফায়ারফক্সের ফায়ারবগ থেকে ব্যবহার করতে পারেন:

var reloadCSS = function() {
  $('#css').replaceWith('<link id="css" rel="stylesheet" href="css/main.css?t=' + Date.now() + '"></link>');
};

4
হাই, আমার এটি রয়েছে, যা কেবলমাত্র এটির জন্য কাজ করে :( এটিকে অনন্য করে তুলতে আমার কাছে সময় যোগ হওয়া সত্ত্বেও (এটি ফায়ারফক্সে রয়েছে): <কোড> ফাংশন অদলবদলের স্টাইলশিট (পত্রক) {বর্ণ শীট = শীট + '? টি =' + তারিখ.নো (); $ ('# পেজ স্টাইল')। প্রতিস্থাপনের সাথে ('<লিঙ্ক আইডি = "সিএসএস" rel = "স্টাইলশিট" href = "' + শীট +" "> </ লিঙ্ক> ');} $ (" " # স্টাইলশীট 1 ") তে ক্লিক করুন (" ক্লিক করুন ", ফাংশন (ইভেন্ট) {অদলবদল (" <সি: url মান = 'সাইট.css' /> ");}); $ (" # স্টাইলশীট 2 ")। (" ক্লিক করুন " ", ফাংশন (ইভেন্ট) {অদলবদল স্টাইলশিট (" <সি: url মান = 'সাইট2.css' /> ");}); </code>
তবি

3

পূর্ববর্তী সমাধানগুলির উপর ভিত্তি করে, আমি জাভাস্ক্রিপ্ট কোড সহ বুকমার্ক তৈরি করেছি:

javascript: { var toAppend = "trvhpqi=" + (new Date()).getTime(); var links = document.getElementsByTagName("link"); for (var i = 0; i < links.length;i++) { var link = links[i]; if (link.rel === "stylesheet") { if (link.href.indexOf("?") === -1) { link.href += "?" + toAppend; } else { if (link.href.indexOf("trvhpqi") === -1) { link.href += "&" + toAppend; } else { link.href = link.href.replace(/trvhpqi=\d{13}/, toAppend)} }; } } }; void(0);

ফায়ারফক্স থেকে চিত্র:

এখানে চিত্র বর্ণনা লিখুন

এটার কাজ কি?

এটি ক্যোরিয় স্ট্রিং প্যারামগুলি (উপরের সমাধান হিসাবে) যুক্ত করে CSS পুনরায় লোড করে:


0

হ্যাঁ, CSS ট্যাগটি পুনরায় লোড করুন। এবং নতুন ইউআরএলটিকে অনন্য করে তুলতে ভুলবেন না (সাধারণত একটি এলোমেলো ক্যোয়ারী প্যারামিটার যুক্ত করে)। আমার এটি করার কোড আছে তবে এখনই আমার সাথে নেই। পরে সম্পাদনা করবে ...

সম্পাদনা: খুব দেরী ... হার্টো এবং নিকফ আমাকে এতে মারধর করেছে ;-)


0

আমার এখন এটি আছে:

    function swapStyleSheet() {
        var old = $('#pagestyle').attr('href');
        var newCss = $('#changeCss').attr('href');
        var sheet = newCss +Math.random(0,10);
        $('#pagestyle').attr('href',sheet);
        $('#profile').attr('href',old);
        }
    $("#changeCss").on("click", function(event) { 
        swapStyleSheet();
    } );

আপনার পৃষ্ঠায় আইডি চেঞ্জকাসের সাথে কোনও নতুন সিএসএস ইউআরএল এর সাথে একটি href বৈশিষ্ট্য সহ কোনও উপাদান তৈরি করুন। এবং প্রারম্ভিক CSS সহ একটি লিঙ্ক উপাদান:

<link id="pagestyle" rel="stylesheet" type="text/css" href="css1.css?t=" />

<img src="click.jpg" id="changeCss" href="css2.css?t=">

0

অন্য উত্তর: রেসিএসএস নামে একটি বুকমার্কলেট রয়েছে । আমি এটি ব্যাপকভাবে ব্যবহার করি নি, তবে কাজ করে বলে মনে হচ্ছে।

আপনার পৃষ্ঠা বারে টেনে আনার জন্য সেই পৃষ্ঠায় একটি বুকমার্কলেট রয়েছে (এটি এখানে একটি বানাতে পারে না)। যদি এটি ভেঙে যায় তবে কোডটি এখানে:

javascript:void(function()%7Bvar%20i,a,s;a=document.getElementsByTagName('link');for(i=0;i%3Ca.length;i++)%7Bs=a[i];if(s.rel.toLowerCase().indexOf('stylesheet')%3E=0&&s.href)%20%7Bvar%20h=s.href.replace(/(&%7C%5C?)forceReload=%5Cd%20/,'');s.href=h%20(h.indexOf('?')%3E=0?'&':'?')%20'forceReload='%20(new%20Date().valueOf())%7D%7D%7D)();

0

আপনি যদি পিএইচপি ব্যবহার করছেন তবে সাধারণ সিএসএসের শেষে বর্তমান সময়টি যুক্ত করুন

<link href="css/name.css?<?php echo 
time(); ?>" rel="stylesheet">

সুতরাং এখন প্রতিবার আপনি যা যা হউক পুনরায় লোড করুন, সময় পরিবর্তন হয় এবং ব্রাউজার তার আলাদা ফাইলটি মনে করে যেহেতু শেষ বিটটি পরিবর্তিত হয় .... আপনি যে কোনও ফাইলের জন্য ব্রাউজারকে সর্বদা রিফ্রেশ করতে বাধ্য করতে পারেন যা আপনি চান স্ক্রিপ্টিং ভাষা ব্যবহার করে রিফ্রেশ করুন


0

সাধারণ পদ্ধতিতে আপনি rel = "স্টাইলশিট" এর পরিবর্তে rel = "প্রিলোড" ব্যবহার করতে পারেন ।

<link rel="preload" href="path/to/mystylesheet.css" as="style" onload="this.rel='stylesheet'">

আপনি ব্যবহার করতে rel="reload"বলেছেন কিন্তু উদাহরণটি বলেছে rel="preload"
হাইকমাম

আমাকে সংশোধন করার জন্য ধন্যবাদ @ হাইকমাম, আমি এটি আপডেট করেছি।
গাগান

0

যেহেতু এই প্রশ্নটি 2019 সালে স্ট্যাকওভারফ্লোতে প্রদর্শিত হয়েছিল, তাই আমি আরও আধুনিক জাভাস্ক্রিপ্ট ব্যবহার করে আমার অবদান যুক্ত করতে চাই।

বিশেষত, সিএসএস স্টাইলশিটের জন্য যা ইনলাইন নয় - যেহেতু এটি ইতিমধ্যে কোনওভাবেই মূল প্রশ্নটি থেকে আচ্ছাদিত।

প্রথমত, লক্ষ্য করুন যে আমাদের কাছে এখনও কনস্ট্রাকটেবল স্টাইলশিট অবজেক্ট নেই। তবে আমরা শীঘ্রই এগুলি অবতরণ করার আশা করি।

ইতিমধ্যে, নিম্নলিখিত এইচটিএমএল সামগ্রী অনুমান করে:

<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="utf-8" />
    <link id="theme" rel="stylesheet" type="text/css" href="./index.css" />
    <script src="./index.js"></script>
  </head>
  <body>
    <p>Hello World</p>
    <button onclick="reload('theme')">Reload</button>
  </body>
</html>

আমাদের থাকতে পারে index.js:

// Utility function to generate a promise that is 
// resolved when the `target` resource is loaded,
// and rejected if it fails to load.
//
const load = target =>
  new Promise((rs, rj) => {
    target.addEventListener("load", rs, { once: true });
    target.addEventListener(
      "error",
      rj.bind(null, `Can't load ${target.href}`),
      { once: true }
    );
  });


// Here the reload function called by the button.
// It takes an `id` of the stylesheet that needs to be reloaded
async function reload(id) {
  const link = document.getElementById(id);

  if (!link || !link.href) {
    throw new Error(`Can't reload '${id}', element or href attribute missing.`);
  }

  // Here the relevant part.
  // We're fetching the stylesheet from the server, specifying `reload`
  // as cache setting, since that is our intention.
  // With `reload`, the browser fetches the resource *without* first looking
  // in the cache, but then will update the cache with the downloaded resource.
  // So any other pages that request the same file and hit the cache first,
  // will use the updated version instead of the old ones.
  let response = await fetch(link.href, { cache: "reload" });

  // Once we fetched the stylesheet and replaced in the cache,
  // We want also to replace it in the document, so we're
  // creating a URL from the response's blob:
  let url = await URL.createObjectURL(await response.blob());

  // Then, we create another `<link>` element to display the updated style,
  // linked to the original one; but only if we didn't create previously:
  let updated = document.querySelector(`[data-link-id=${id}]`);

  if (!updated) {
    updated = document.createElement("link");
    updated.rel = "stylesheet";
    updated.type = "text/css";
    updated.dataset.linkId = id;
    link.parentElement.insertBefore(updated, link);

    // At this point we disable the original stylesheet,
    // so it won't be applied to the document anymore.
    link.disabled = true;
  }

  // We set the new <link> href...
  updated.href = url;

  // ...Waiting that is loaded...
  await load(updated);

  // ...and finally tell to the browser that we don't need
  // the blob's URL anymore, so it can be released.
  URL.revokeObjectURL(url);
}
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.