আমি একটি পূর্বরূপ ফাংশন সহ একটি ইন-পেজ সিএসএস সম্পাদক করার চেষ্টা করছি যা স্টাইলশিটটি পুনরায় লোড করবে এবং পৃষ্ঠাটি পুনরায় লোড করার প্রয়োজন ছাড়াই এটি প্রয়োগ করবে। এটি সম্পর্কে সবচেয়ে ভাল উপায় কি হবে?
আমি একটি পূর্বরূপ ফাংশন সহ একটি ইন-পেজ সিএসএস সম্পাদক করার চেষ্টা করছি যা স্টাইলশিটটি পুনরায় লোড করবে এবং পৃষ্ঠাটি পুনরায় লোড করার প্রয়োজন ছাড়াই এটি প্রয়োগ করবে। এটি সম্পর্কে সবচেয়ে ভাল উপায় কি হবে?
উত্তর:
"সম্পাদনা" পৃষ্ঠায়, আপনার সিএসএসকে স্বাভাবিক উপায়ে ( <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
innerHTML
জন্য IE বারফ করে । <style>
<script>
আপনার অবস্থার জন্য সম্ভবত প্রযোজ্য নয়, তবে বাহ্যিক স্টাইলশিটগুলি পুনরায় লোড করার জন্য আমি এখানে ব্যবহার করেছি 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);
});
}
var links = document.getElementsByTagName("link"); for (var i = 0; i < links.length;i++) { var link = links[i]; if (link.rel === "stylesheet") {link.href += "?"; }}
এর জন্য jQuery ব্যবহার করার দরকার নেই। নিম্নলিখিত জাভাস্ক্রিপ্ট ফাংশনটি আপনার সমস্ত সিএসএস ফাইল পুনরায় লোড করবে:
function reloadCss()
{
var links = document.getElementsByTagName("link");
for (var cl in links)
{
var link = links[cl];
if (link.rel === "stylesheet")
link.href += "";
}
}
অ্যান্ড্রু ডেভির স্নোজি ভোগ প্রকল্পটি দেখুন - http://aboutcode.net/vogue/
ভ্যানিলা জেএস এবং একটি লাইনে একটি সংক্ষিপ্ত সংস্করণ:
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())
}
আরও একটি 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>');
};
পূর্ববর্তী সমাধানগুলির উপর ভিত্তি করে, আমি জাভাস্ক্রিপ্ট কোড সহ বুকমার্ক তৈরি করেছি:
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 পুনরায় লোড করে:
আমার এখন এটি আছে:
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=">
অন্য উত্তর: রেসিএসএস নামে একটি বুকমার্কলেট রয়েছে । আমি এটি ব্যাপকভাবে ব্যবহার করি নি, তবে কাজ করে বলে মনে হচ্ছে।
আপনার পৃষ্ঠা বারে টেনে আনার জন্য সেই পৃষ্ঠায় একটি বুকমার্কলেট রয়েছে (এটি এখানে একটি বানাতে পারে না)। যদি এটি ভেঙে যায় তবে কোডটি এখানে:
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)();
আপনি যদি পিএইচপি ব্যবহার করছেন তবে সাধারণ সিএসএসের শেষে বর্তমান সময়টি যুক্ত করুন
<link href="css/name.css?<?php echo
time(); ?>" rel="stylesheet">
সুতরাং এখন প্রতিবার আপনি যা যা হউক পুনরায় লোড করুন, সময় পরিবর্তন হয় এবং ব্রাউজার তার আলাদা ফাইলটি মনে করে যেহেতু শেষ বিটটি পরিবর্তিত হয় .... আপনি যে কোনও ফাইলের জন্য ব্রাউজারকে সর্বদা রিফ্রেশ করতে বাধ্য করতে পারেন যা আপনি চান স্ক্রিপ্টিং ভাষা ব্যবহার করে রিফ্রেশ করুন
সাধারণ পদ্ধতিতে আপনি rel = "স্টাইলশিট" এর পরিবর্তে rel = "প্রিলোড" ব্যবহার করতে পারেন ।
<link rel="preload" href="path/to/mystylesheet.css" as="style" onload="this.rel='stylesheet'">
rel="reload"
বলেছেন কিন্তু উদাহরণটি বলেছে rel="preload"
।
যেহেতু এই প্রশ্নটি 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);
}