একই url এ একটি নতুন দিয়ে চিত্রটি রিফ্রেশ করুন


333

আমি আমার সাইটে একটি লিঙ্ক অ্যাক্সেস করছি যা প্রত্যেকবার এটি প্রবেশ করার পরে একটি নতুন চিত্র সরবরাহ করবে।

আমি যে সমস্যাটি চালাচ্ছি তা হ'ল আমি যদি ব্যাকগ্রাউন্ডে চিত্রটি লোড করার চেষ্টা করি এবং তারপরে পৃষ্ঠার একটি আপডেট করি তবে চিত্রটি পরিবর্তন হয় না - যদিও পৃষ্ঠাটি পুনরায় লোড করার সময় এটি আপডেট হয়।

var newImage = new Image();
newImage.src = "http://localhost/image.jpg";

function updateImage()
{
if(newImage.complete) {
    document.getElementById("theText").src = newImage.src;
    newImage = new Image();
    number++;
    newImage.src = "http://localhost/image/id/image.jpg?time=" + new Date();
}

    setTimeout(updateImage, 1000);
}

ফায়ারফক্স যেমন দেখেছে শিরোনাম:

HTTP/1.x 200 OK
Cache-Control: no-cache, must-revalidate
Pragma: no-cache
Transfer-Encoding: chunked
Content-Type: image/jpeg
Expires: Fri, 30 Oct 1998 14:19:41 GMT
Server: Microsoft-HTTPAPI/1.0
Date: Thu, 02 Jul 2009 23:06:04 GMT

আমাকে পৃষ্ঠায় কেবল সেই চিত্রটি রিফ্রেশ করতে হবে। কোন ধারনা?


উত্তর:


350

ইউআরএল শেষে একটি ক্যাশেব্রেকার যুক্ত করার চেষ্টা করুন:

newImage.src = "http://localhost/image.jpg?" + new Date().getTime();

আপনি যখন ইমেজটি তৈরি করবেন তখন এটি স্বয়ংক্রিয় টাইমস্ট্যাম্প সংযোজন করবে এবং এটি ব্রাউজারটিকে ক্যাশে থাকা কোনওটিকে পুনরুদ্ধার করার পরিবর্তে চিত্রটির জন্য আবার সন্ধান করবে।


26
এটি খুব ভাল সমাধান নয় কারণ এটি ক্যাশে (স্থানীয় এবং উভয় প্রবাহ উভয়) স্যাম্প করবে। আইয়ার উত্তর এর সাথে মোকাবিলা করার আরও ভাল উপায় আছে।
Tgr

1
এছাড়াও, একই চিত্রটি অন্য জায়গায়, "ক্যাশে ব্রেকার" পরে পুনরায় প্রদর্শন করা, এখনও পুরানো ক্যাশেড সংস্করণ (কমপক্ষে ফায়ারফক্সে) উভয়ই দেখায়? এবং # :(
T4NK3R

3
আপনি এটি দিয়ে আরও কম কোড তৈরি করতে পারেন:'image.jpg?' + (+new Date())
লেভ লুকমস্কি

4
এর Date.now()জন্য রয়েছে
vp_arth

2
কেন নয়Math.random()
গোথাম গোপালকৃষ্ণন

227

এটি কীভাবে করবেন তার উত্তরে আমি অনেক প্রকারভেদ দেখেছি, তাই আমি ভেবেছিলাম যে আমি সেগুলি এখানে সংক্ষিপ্ত করব (প্লাস আমার নিজের আবিষ্কারের একটি চতুর্থ পদ্ধতি যুক্ত করব):


(1) ইউআরএলটিতে একটি অনন্য ক্যাশে-বস্টিং কোয়েরি প্যারামিটার যুক্ত করুন, যেমন:

newImage.src = "image.jpg?t=" + new Date().getTime();

পেশাদাররা: 100% নির্ভরযোগ্য, দ্রুত এবং সহজেই বুঝতে এবং প্রয়োগ করতে সক্ষম।

কনস: বাইপাসগুলি পুরোপুরি ক্যাশে হচ্ছে, অর্থ যখনই চিত্রের দর্শনগুলির মধ্যে পরিবর্তন হয় না তখন অপ্রয়োজনীয় বিলম্ব এবং ব্যান্ডউইথ ব্যবহার হয় । সম্ভবত একই চিত্রটির অনেকগুলি, অনেক কপি সহ ব্রাউজারের ক্যাশে (এবং কোনও মধ্যবর্তী ক্যাশে) পূরণ করবে! এছাড়াও, চিত্রের ইউআরএল সংশোধন করা প্রয়োজন।

কখন ব্যবহার করবেন: যখন চিত্রটি অবিচ্ছিন্নভাবে পরিবর্তিত হয় তখন ব্যবহার করুন যেমন লাইভ ওয়েবক্যাম ফিডের জন্য। আপনি যদি এই পদ্ধতিটি ব্যবহার করেন তবে Cache-control: no-cacheএইচটিটিপি শিরোনামের সাথে চিত্রগুলি নিজেরাই পরিবেশন করতে ভুলবেন না !!! (প্রায়শই এটি .htaccess ফাইল ব্যবহার করে সেট আপ করা যেতে পারে)। অন্যথায় আপনি ক্রমবর্ধমানভাবে চিত্রের পুরানো সংস্করণগুলি দিয়ে ক্যাশে পূরণ করবেন!


(২) URL টিতে ক্যোয়ারী প্যারামিটার যুক্ত করুন যা কেবল তখনই ফাইলটি পরিবর্তিত হয়, যেমন:

echo '<img src="image.jpg?m=' . filemtime('image.jpg') . '">';

(এটি পিএইচপি সার্ভার-সাইড কোড, তবে এখানে গুরুত্বপূর্ণ বিষয়টি হ'ল একটি? মি = [ফাইলটি সর্বশেষ সংশোধিত সময়] ক্যোরিস্ট্রিং ফাইলের সাথে সংযুক্ত করা হয়েছে)।

পেশাদাররা: 100% নির্ভরযোগ্য, দ্রুত এবং সহজে বুঝতে এবং বাস্তবায়িত করা সহজ এবং এবং ক্যাশিং সুবিধার পুরোপুরি সংরক্ষণ করে।

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

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


(3) হেডার সঙ্গে আপনার ইমেজ পরিবেশন Cache-control: max-age=0, must-revalidate, এবং একটি অনন্য যোগ মেমক্যাশে যেমন URL এ -busting টুকরা শনাক্তকারী:

newImage.src = "image.jpg#" + new Date().getTime();

এখানে ধারণাটি হ'ল ক্যাশে-নিয়ন্ত্রণ শিরোলেখ ব্রাউজারের ক্যাশে চিত্রগুলি রাখে, তবে তাত্ক্ষণিকভাবে এগুলিকে বাসি চিহ্নিত করে তোলে এবং যাতে প্রতিটি বার ব্রাউজারটি পুনরায় প্রদর্শিত হয় অবশ্যই সার্ভারের সাথে সেগুলি পরিবর্তন হয়েছে কিনা তা পরীক্ষা করতে হবে। এটি ব্রাউজারের নিশ্চিত করে এইচটিটিপি ক্যাশে সর্বদা চিত্রের সর্বশেষ অনুলিপি প্রদান । তবে, ব্রাউজারগুলি প্রায়শই যদি একটি চিত্র থাকে তবে একটি চিত্রের একটি ইন-মেমরি অনুলিপি পুনরায় ব্যবহার করবে এবং সে ক্ষেত্রে তাদের এইচটিটিপি ক্যাশে চেক করবে না। এটি প্রতিরোধ করতে, একটি খণ্ড সনাক্তকারী ব্যবহার করা হয়: ইন-মেমরি চিত্রের srcতুলনাতে খণ্ড সনাক্তকারীকে অন্তর্ভুক্ত করা হয়, তবে এটি HTTP ক্যাশে জিজ্ঞাসাবাদ করার আগে তা ছিনিয়ে নিয়ে যায়। (সুতরাং, উদাহরণস্বরূপ, image.jpg#Aএবংimage.jpg#B উভয়ই image.jpgব্রাউজারের এইচটিটিপি ক্যাশে প্রবেশ থেকে প্রদর্শিত হতে পারে , তবেimage.jpg#Bশেষ প্রদর্শিত হওয়ার পরে কখনই ইন-মেমরি ধরে রাখা চিত্রের ডেটা ব্যবহার করে প্রদর্শিত হবে না image.jpg#A)।

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

কনস: ব্রাউজারগুলির ইউআরএলগুলিতে টুকরা শনাক্তকারীদের সাথে সম্পর্কিত চিত্রগুলির বিষয়ে কিছুটা সন্দেহজনক (বা কমপক্ষে খারাপভাবে নথিভুক্ত) আচরণের উপর নির্ভর করে (তবে আমি এফএফ 27, ক্রোম 33 এবং আই 11 এ সফলভাবে পরীক্ষা করেছি)। প্রতিটি চিত্র দেখার জন্য সার্ভারের কাছে পুনরায় বৈধকরণের অনুরোধটি প্রেরণ করে, যা চিত্রগুলি খুব কমই পরিবর্তিত হয় এবং / অথবা প্রচ্ছন্নতা একটি বড় সমস্যা হয়ে থাকে (যেহেতু ক্যাশেড চিত্রটি এখনও ভাল থাকলেও আপনাকে পুনরায়করণের প্রতিক্রিয়ার জন্য অপেক্ষা করতে হবে) । চিত্রের URL গুলি সংশোধন করা দরকার।

কখন ব্যবহার করবেন: যখন চিত্রগুলি ঘন ঘন পরিবর্তিত হতে পারে বা সার্ভার-সাইড স্ক্রিপ্টের জড়িততা ছাড়াই ক্লায়েন্টের মধ্যবর্তী সময়ে রিফ্রেশ হওয়া দরকার তবে আপনি যেখানে এখনও ক্যাশে সুবিধা চান তা ব্যবহার করুন। উদাহরণস্বরূপ, একটি লাইভ ওয়েবক্যামের ভোটদান যা প্রতি কয়েক মিনিটে অনিয়মিতভাবে একটি চিত্র আপডেট করে। বিকল্পভাবে, (1) বা (2) এর পরিবর্তে ব্যবহার করুন যদি আপনার সার্ভার স্থিতিশীল চিত্রের URLগুলিতে ক্যোরিস্ট্রিংগুলিকে অনুমতি দেয় না।


(4) বলপূর্বক প্রবেশ জাভাস্ক্রিপ্ট ব্যবহার করে একটি নির্দিষ্ট চিত্র, প্রথম লোডিং এটি দ্বারা রিফ্রেশ একটি লুকানো <iframe>এবং তারপর কলিং location.reload(true)আইফ্রেম এর উপর contentWindow

পদক্ষেপগুলি হ'ল:

  • কোনও লুকানো ইফ্রেমে রিফ্রেশ করার জন্য চিত্রটি লোড করুন। এটি কেবল একটি সেটআপ স্টেপ - এটি চাইলে প্রকৃত রিফ্রেশটি অনেক আগেই করা যায়। এই পর্যায়ে ইমেজটি লোড করতে ব্যর্থ হলেও এটি কোনও বিষয় নয়!

  • এটি হয়ে গেলে, আপনার পৃষ্ঠায় (চিত্রসমূহ) বা যে কোনও ডিওএম নোডের (এমনকি জাভাস্ক্রিপ্টের ভেরিয়েবলগুলিতে সজ্জিত অফ-পৃষ্ঠাসমূহ) image চিত্রটির সমস্ত অনুলিপি ফাঁকা রাখুন। এটি প্রয়োজনীয় কারণ ব্রাউজারটি অন্যথায় কোনও বাসি ইন মেমোরি অনুলিপি থেকে চিত্রটি প্রদর্শন করতে পারে (IE11 বিশেষত এটি করে): আপনাকে এইচটিটিপি ক্যাশে রিফ্রেশ করার আগে মেমরির সমস্ত অনুলিপি সাফ হওয়া নিশ্চিত করতে হবে । যদি অন্যান্য জাভাস্ক্রিপ্ট কোড অ্যাসিঙ্ক্রোনীয়ভাবে চলমান থাকে, ততক্ষণে আপনাকে সেই কোডটি রিফ্রেশ হওয়া ইমেজের নতুন কপি তৈরি করা থেকে বিরত রাখতে হবে।

  • কল করুন iframe.contentWindow.location.reload(true)trueবাহিনীর ক্যাশে বাইপাস, সার্ভার থেকে সরাসরি পুনরায় লোড এবং বিদ্যমান ক্যাশে কপি মুছে যাওয়ার।

  • এটি পুনরায় লোডিং শেষ হয়ে গেলে , খালি ছবিগুলি পুনরুদ্ধার করুন। তাদের এখন সার্ভার থেকে নতুন সংস্করণ প্রদর্শন করা উচিত!

একই ডোমেন চিত্রগুলির জন্য, আপনি ইফ্রেমে সরাসরি চিত্রটি লোড করতে পারেন। ক্রস-ডোমেন চিত্রগুলির জন্য, আপনাকে তার পরিবর্তে আপনার ডোমেন থেকে এমন একটি HTML পৃষ্ঠা লোড করতে হবে যাতে ছবিতে কোনও <img>ট্যাগ থাকে, অন্যথায় আপনি কল করার চেষ্টা করার সময় একটি "অ্যাক্সেস অস্বীকৃত" ত্রুটি পাবেনiframe.contentWindow.reload(...)

পেশাদাররা: ঠিক যেমন চিত্রটি পুনরায় লোড করে () ফাংশনটি কাজ করে যা আপনি ইচ্ছা করেন যে ডমটি করতেন! চিত্রগুলিকে সাধারণত ক্যাশে করে মঞ্জুরি দেয় (এমনকি ভবিষ্যতের শেষের তারিখগুলিও যদি আপনি চান তবে এটি ঘন ঘন পুনর্বিবেচনা এড়ানো)। কেবলমাত্র ক্লায়েন্ট-সাইড কোড ব্যবহার না করে বর্তমান পৃষ্ঠায় বা অন্য কোনও পৃষ্ঠায় সেই চিত্রটির URL গুলি পরিবর্তন না করে আপনাকে কোনও নির্দিষ্ট চিত্রকে রিফ্রেশ করার অনুমতি দেয়।

কনস: জাভাস্ক্রিপ্ট উপর নির্ভর করে। প্রতিটি ব্রাউজারে সঠিকভাবে কাজ করার 100% গ্যারান্টিযুক্ত নয় (যদিও এফএফ 27, ক্রোম 33 এবং আই 11 এ আমি এটি সফলভাবে পরীক্ষা করেছি)। অন্যান্য পদ্ধতির তুলনায় খুব জটিল।

কখন ব্যবহার করবেন: যখন আপনার কাছে মূলত স্থিতিশীল চিত্রগুলির একটি সংগ্রহ থাকে যা আপনি ক্যাশে চান, তবে আপনার এখনও মাঝে মধ্যে সেগুলি আপডেট করতে সক্ষম হন এবং আপডেটটি ঘটেছিল তাৎক্ষণিক ভিজ্যুয়াল প্রতিক্রিয়া পান। (বিশেষত যখন পুরো ব্রাউজার পৃষ্ঠাটি সতেজ করা কাজ করবে না, উদাহরণস্বরূপ এজেএক্স-এ নির্মিত কিছু ওয়েব অ্যাপ্লিকেশনগুলিতে)। এবং যখন পদ্ধতিগুলি (1) - (3) ব্যবহারযোগ্য না হয় কারণ (যে কোনও কারণেই) আপনি যে সমস্ত URL টি সম্ভবত আপডেট করতে হবে এমন চিত্রটি প্রদর্শিত করতে পারে না change (নোট করুন যে এই 3 টি পদ্ধতি ব্যবহার করে চিত্রটি রিফ্রেশ হবে, তবে অন্য কোনও পৃষ্ঠা যদি যথাযথ ক্যোরিস্ট্রিং বা খণ্ড সনাক্তকারী ছাড়াই সেই চিত্রটি প্রদর্শন করার চেষ্টা করে তবে পরিবর্তে এটি একটি পুরানো সংস্করণ প্রদর্শন করতে পারে)।

একটি পরী দৃ rob় এবং নমনীয় পদ্ধতিতে এটি বাস্তবায়নের বিবরণ নীচে দেওয়া হল:

ধরে নেওয়া যাক আপনার ওয়েবসাইটটিতে ইউআরএল পাথের ফাঁকা 1x1 পিক্সেল .gif /img/1x1blank.gifরয়েছে এবং এতে নিম্নলিখিত এক-লাইন পিএইচপি স্ক্রিপ্ট রয়েছে (কেবলমাত্র ক্রস-ডোমেন চিত্রগুলিতে জোর করে রিফ্রেশ প্রয়োগের জন্য প্রয়োজনীয় , এবং কোনও সার্ভার-সাইড স্ক্রিপ্টিং ভাষায় আবারও লেখা যেতে পারে) অবশ্যই, ইউআরএল পথে /echoimg.php:

<img src="<?=htmlspecialchars(@$_GET['src'],ENT_COMPAT|ENT_HTML5,'UTF-8')?>">

তারপরে, জাভাস্ক্রিপ্টে আপনি কীভাবে এই সমস্ত কিছু করতে পারেন তার একটি বাস্তব বাস্তবায়ন এখানে। এটি কিছুটা জটিল দেখায়, তবে এখানে অনেকগুলি মন্তব্য রয়েছে এবং গুরুত্বপূর্ণ ফাংশনটি কেবল ফোর্সআইএমগ্রেলোড () - প্রথম দুটি কেবল ফাঁকা এবং আন-ফাঁকা চিত্র, এবং আপনার নিজের HTML এর সাথে দক্ষতার সাথে কাজ করার জন্য ডিজাইন করা উচিত, সুতরাং সেগুলিকে কোড করুন আপনার জন্য সবচেয়ে ভাল কাজ করে; এগুলির মধ্যে বেশিরভাগ জটিলতা আপনার ওয়েবসাইটের জন্য অপ্রয়োজনীয় হতে পারে:

// This function should blank all images that have a matching src, by changing their src property to /img/1x1blank.gif.
// ##### You should code the actual contents of this function according to your page design, and what images there are on them!!! #####
// Optionally it may return an array (or other collection or data structure) of those images affected.
// This can be used by imgReloadRestore() to restore them later, if that's an efficient way of doing it (otherwise, you don't need to return anything).
// NOTE that the src argument here is just passed on from forceImgReload(), and MAY be a relative URI;
// However, be aware that if you're reading the src property of an <img> DOM object, you'll always get back a fully-qualified URI,
// even if the src attribute was a relative one in the original HTML.  So watch out if trying to compare the two!
// NOTE that if your page design makes it more efficient to obtain (say) an image id or list of ids (of identical images) *first*, and only then get the image src,
// you can pass this id or list data to forceImgReload() along with (or instead of) a src argument: just add an extra or replacement parameter for this information to
// this function, to imgReloadRestore(), to forceImgReload(), and to the anonymous function returned by forceImgReload() (and make it overwrite the earlier parameter variable from forceImgReload() if truthy), as appropriate.
function imgReloadBlank(src)
{
  // ##### Everything here is provisional on the way the pages are designed, and what images they contain; what follows is for example purposes only!
  // ##### For really simple pages containing just a single image that's always the one being refreshed, this function could be as simple as just the one line:
  // ##### document.getElementById("myImage").src = "/img/1x1blank.gif";

  var blankList = [],
      fullSrc = /* Fully qualified (absolute) src - i.e. prepend protocol, server/domain, and path if not present in src */,
      imgs, img, i;

  for each (/* window accessible from this one, i.e. this window, and child frames/iframes, the parent window, anything opened via window.open(), and anything recursively reachable from there */)
  {
    // get list of matching images:
    imgs = theWindow.document.body.getElementsByTagName("img");
    for (i = imgs.length; i--;) if ((img = imgs[i]).src===fullSrc)  // could instead use body.querySelectorAll(), to check both tag name and src attribute, which would probably be more efficient, where supported
    {
      img.src = "/img/1x1blank.gif";  // blank them
      blankList.push(img);            // optionally, save list of blanked images to make restoring easy later on
    }
  }

  for each (/* img DOM node held only by javascript, for example in any image-caching script */) if (img.src===fullSrc)
  {
    img.src = "/img/1x1blank.gif";   // do the same as for on-page images!
    blankList.push(img);
  }

  // ##### If necessary, do something here that tells all accessible windows not to create any *new* images with src===fullSrc, until further notice,
  // ##### (or perhaps to create them initially blank instead and add them to blankList).
  // ##### For example, you might have (say) a global object window.top.blankedSrces as a propery of your topmost window, initially set = {}.  Then you could do:
  // #####
  // #####     var bs = window.top.blankedSrces;
  // #####     if (bs.hasOwnProperty(src)) bs[src]++; else bs[src] = 1;
  // #####
  // ##### And before creating a new image using javascript, you'd first ensure that (blankedSrces.hasOwnProperty(src)) was false...
  // ##### Note that incrementing a counter here rather than just setting a flag allows for the possibility that multiple forced-reloads of the same image are underway at once, or are overlapping.

  return blankList;   // optional - only if using blankList for restoring back the blanked images!  This just gets passed in to imgReloadRestore(), it isn't used otherwise.
}




// This function restores all blanked images, that were blanked out by imgReloadBlank(src) for the matching src argument.
// ##### You should code the actual contents of this function according to your page design, and what images there are on them, as well as how/if images are dimensioned, etc!!! #####
function imgReloadRestore(src,blankList,imgDim,loadError);
{
  // ##### Everything here is provisional on the way the pages are designed, and what images they contain; what follows is for example purposes only!
  // ##### For really simple pages containing just a single image that's always the one being refreshed, this function could be as simple as just the one line:
  // ##### document.getElementById("myImage").src = src;

  // ##### if in imgReloadBlank() you did something to tell all accessible windows not to create any *new* images with src===fullSrc until further notice, retract that setting now!
  // ##### For example, if you used the global object window.top.blankedSrces as described there, then you could do:
  // #####
  // #####     var bs = window.top.blankedSrces;
  // #####     if (bs.hasOwnProperty(src)&&--bs[src]) return; else delete bs[src];  // return here means don't restore until ALL forced reloads complete.

  var i, img, width = imgDim&&imgDim[0], height = imgDim&&imgDim[1];
  if (width) width += "px";
  if (height) height += "px";

  if (loadError) {/* If you want, do something about an image that couldn't load, e.g: src = "/img/brokenImg.jpg"; or alert("Couldn't refresh image from server!"); */}

  // If you saved & returned blankList in imgReloadBlank(), you can just use this to restore:

  for (i = blankList.length; i--;)
  {
    (img = blankList[i]).src = src;
    if (width) img.style.width = width;
    if (height) img.style.height = height;
  }
}




// Force an image to be reloaded from the server, bypassing/refreshing the cache.
// due to limitations of the browser API, this actually requires TWO load attempts - an initial load into a hidden iframe, and then a call to iframe.contentWindow.location.reload(true);
// If image is from a different domain (i.e. cross-domain restrictions are in effect, you must set isCrossDomain = true, or the script will crash!
// imgDim is a 2-element array containing the image x and y dimensions, or it may be omitted or null; it can be used to set a new image size at the same time the image is updated, if applicable.
// if "twostage" is true, the first load will occur immediately, and the return value will be a function
// that takes a boolean parameter (true to proceed with the 2nd load (including the blank-and-reload procedure), false to cancel) and an optional updated imgDim.
// This allows you to do the first load early... for example during an upload (to the server) of the image you want to (then) refresh.
function forceImgReload(src, isCrossDomain, imgDim, twostage)
{
  var blankList, step = 0,                                // step: 0 - started initial load, 1 - wait before proceeding (twostage mode only), 2 - started forced reload, 3 - cancelled
      iframe = window.document.createElement("iframe"),   // Hidden iframe, in which to perform the load+reload.
      loadCallback = function(e)                          // Callback function, called after iframe load+reload completes (or fails).
      {                                                   // Will be called TWICE unless twostage-mode process is cancelled. (Once after load, once after reload).
        if (!step)  // initial load just completed.  Note that it doesn't actually matter if this load succeeded or not!
        {
          if (twostage) step = 1;  // wait for twostage-mode proceed or cancel; don't do anything else just yet
          else { step = 2; blankList = imgReloadBlank(src); iframe.contentWindow.location.reload(true); }  // initiate forced-reload
        }
        else if (step===2)   // forced re-load is done
        {
          imgReloadRestore(src,blankList,imgDim,(e||window.event).type==="error");    // last parameter checks whether loadCallback was called from the "load" or the "error" event.
          if (iframe.parentNode) iframe.parentNode.removeChild(iframe);
        }
      }
  iframe.style.display = "none";
  window.parent.document.body.appendChild(iframe);    // NOTE: if this is done AFTER setting src, Firefox MAY fail to fire the load event!
  iframe.addEventListener("load",loadCallback,false);
  iframe.addEventListener("error",loadCallback,false);
  iframe.src = (isCrossDomain ? "/echoimg.php?src="+encodeURIComponent(src) : src);  // If src is cross-domain, script will crash unless we embed the image in a same-domain html page (using server-side script)!!!
  return (twostage
    ? function(proceed,dim)
      {
        if (!twostage) return;
        twostage = false;
        if (proceed)
        {
          imgDim = (dim||imgDim);  // overwrite imgDim passed in to forceImgReload() - just in case you know the correct img dimensions now, but didn't when forceImgReload() was called.
          if (step===1) { step = 2; blankList = imgReloadBlank(src); iframe.contentWindow.location.reload(true); }
        }
        else
        {
          step = 3;
          if (iframe.contentWindow.stop) iframe.contentWindow.stop();
          if (iframe.parentNode) iframe.parentNode.removeChild(iframe);
        }
      }
    : null);
}

তারপরে, আপনার পৃষ্ঠার মতো একই ডোমেনে অবস্থিত কোনও চিত্রকে রিফ্রেশ করার জন্য, আপনি কেবল এটি করতে পারেন:

forceImgReload("myimage.jpg");

অন্য কোথাও থেকে একটি চিত্র রিফ্রেশ করতে (ক্রস-ডোমেন):

forceImgReload("http://someother.server.com/someimage.jpg", true);

আরও উন্নত অ্যাপ্লিকেশনটি হ'ল আপনার সার্ভারে একটি নতুন সংস্করণ আপলোড করার পরে কোনও চিত্র পুনরায় লোড করা, আপলোডের সাথে একসাথে পুনরায় লোড প্রক্রিয়াটির প্রাথমিক পর্যায়ে প্রস্তুতকারীর কাছে দৃশ্যমান পুনরায় লোড বিলম্বকে হ্রাস করতে পারে। আপনি যদি এজেএক্সের মাধ্যমে আপলোডটি করছেন এবং সার্ভারটি খুব সাধারণ জেএসওন অ্যারে [সাফল্য, প্রস্থ, উচ্চতা] ফিরিয়ে দিচ্ছে তবে আপনার কোডটি এর মতো দেখতে কিছুটা লাগবে:

// fileForm is a reference to the form that has a the <input typ="file"> on it, for uploading.
// serverURL is the url at which the uploaded image will be accessible from, once uploaded.
// The response from uploadImageToServer.php is a JSON array [success, width, height]. (A boolean and two ints).
function uploadAndRefreshCache(fileForm, serverURL)
{
  var xhr = new XMLHttpRequest(),
      proceedWithImageRefresh = forceImgReload(serverURL, false, null, true);
  xhr.addEventListener("load", function(){ var arr = JSON.parse(xhr.responseText); if (!(arr&&arr[0])) { proceedWithImageRefresh(false); doSomethingOnUploadFailure(...); } else { proceedWithImageRefresh(true,[arr[1],ar[2]]); doSomethingOnUploadSuccess(...); }});
  xhr.addEventListener("error", function(){ proceedWithImageRefresh(false); doSomethingOnUploadError(...); });
  xhr.addEventListener("abort", function(){ proceedWithImageRefresh(false); doSomethingOnUploadAborted(...); });
  // add additional event listener(s) to track upload progress for graphical progress bar, etc...
  xhr.open("post","uploadImageToServer.php");
  xhr.send(new FormData(fileForm));
}

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


আমি পদ্ধতি 4 এর ধারণাটি পছন্দ করি তবে আপনি কোনও আইফ্রেমে বাহ্যিক সামগ্রী লোড করতে পারবেন না, পারবেন কি? আমি বর্তমানে একক পৃষ্ঠার ওয়েব অ্যাপ্লিকেশনটিতে পদ্ধতি 3 ব্যবহার করছি তবে টেমপ্লেটের এইচটিএমএল পুনরায় লোড হওয়া সত্ত্বেও, নতুন চিত্রটি পেতে আপনাকে পুরো পৃষ্ঠাটি পুনরায় লোড করতে হবে তা আমি পছন্দ করি না।
Emilios1995

এমিলিওস: ... পুরো পৃষ্ঠাটি পুনরায় লোড করা সম্পর্কে আপনার মন্তব্য আমি বুঝতে পারি না। উভয় পদ্ধতি (3) এবং (4) ক্লায়েন্ট-সাইড জাভাস্ক্রিপ্টে প্রয়োগ করা যেতে পারে, আপনি রিফ্রেশ করছেন এমন এক চিত্র ব্যতীত অন্য কোনও কিছু লোড না করে। পদ্ধতির (3) এর অর্থ কেবল জাভাস্ক্রিপ্ট ব্যবহার করে আপনার চিত্রের 'src' বৈশিষ্ট্যটি (উদাহরণস্বরূপ) image.jpg#123থেকে image.jpg#124(বা যাই হোক না কেন, '#' পরিবর্তনের পরে এতক্ষণ) পরিবর্তন করতে হবে। আপনি কী পুনরায় লোড করছেন তা আপনি পরিষ্কার করতে পারেন এবং কেন?
Doin থেকে

@ এমিলিওস: আপনি প্রকৃতপক্ষে একটি আইফ্রেমে বাহ্যিক (ক্রস-ডোমেন) সামগ্রী লোড করতে পারেন ... তবে আপনি contentWindowজাভাস্ক্রিপ্টের মাধ্যমে reload(true)কলটি করার জন্য যে পদ্ধতিটির গুরুত্বপূর্ণ বিষয় তা অ্যাক্সেস করতে পারবেন না ... সুতরাং না, পদ্ধতি (4 ) ক্রস-ডোমেন সামগ্রীর জন্য কাজ করবে না। ভাল বিক্ষোভ; এটি অন্তর্ভুক্ত করার জন্য আমি "কনস" আপডেট করব।
Doin থেকে

@ এমিলিওস: ওফ, না আমি করব না: আমি বুঝতে পেরেছিলাম যে একটি সাধারণ ফিক্স (এখন আমার উত্তরের অন্তর্ভুক্ত) এটি ক্রস-ডোমেন চিত্রগুলির জন্যও কাজ করতে দেয় (আপনি যদি আপনার সার্ভারে একটি সার্ভার-সাইড স্ক্রিপ্ট রাখতে পারেন)।
Doin থেকে

@ সিউডোস্যাভ্যান্ট: দুর্ভাগ্যক্রমে আমি এই মাত্র ১ months মাস পরে লক্ষ্য করছি, তবে আমি আপনাকে জানাতে দুঃখিত, আমার কোডে আপনার সম্পাদনাগুলি খারাপভাবে ভেঙে গেছে। (সত্যি বলতে কি, আমি মনে করি না যে আমার প্রথম দিকে কলব্যাক কোডটি সঠিক ছিল)। আমি এখন বিস্তৃত অংশ এবং অংশটি (4) পুনরায় লিখেছি, ব্যাখ্যা এবং কোড উভয়ই। আপনার আগের কোডটি কখনই চিত্রগুলি ফাঁকা রাখেনি (যাতে এটি বিজোড় উপায়ে ব্যর্থ হতে পারে, বিশেষত আইইতে এবং বিশেষত চিত্রটি একাধিক স্থানে প্রদর্শিত হয়েছিল), তবে আরও খারাপ এটি পুরো পুনরায় লোড শুরু করার সাথে সাথেই iframe মুছে ফেলেছে, যার অর্থ সম্ভবত এটি ছিল শুধু মাঝে মাঝে বা না কিছু কাজ। দুঃখিত!
Doin থেকে

185

এর বিকল্প হিসাবে ...

newImage.src = "http://localhost/image.jpg?" + new Date().getTime();

...এটা মনে হচ্ছে যে...

newImage.src = "http://localhost/image.jpg#" + new Date().getTime();

... আপনি সঠিক Cache-Controlশিরোনাম ফিরিয়ে নিয়েছেন বলে ধরে নিয়ে কোনও প্রবাহের ক্যাশে বাইপাস না করেই ব্রাউজার ক্যাশেটিকে বোকা বানানোর পক্ষে যথেষ্ট । যদিও আপনি ব্যবহার করতে পারেন ...

Cache-Control: no-cache, must-revalidate

... আপনি শিরোনাম If-Modified-Sinceবা If-None-Matchশিরোনামগুলির সুবিধাগুলি হারাচ্ছেন , তাই এরকম কিছু ...

Cache-Control: max-age=0, must-revalidate

... ব্রাউজারটি যদি পুরো চিত্রটি পরিবর্তন না করে তবে পুনরায় ডাউনলোড করা থেকে বিরত রাখা উচিত। IE, ফায়ারফক্স এবং ক্রোমে পরীক্ষিত এবং কাজ করছে। বিরক্তিজনকভাবে এটি সাফারিটিতে ব্যর্থ হয় আপনি যদি না ব্যবহার করেন ...

Cache-Control: no-store

... যদিও এটি এখনও শত শত অভিন্ন চিত্রের সাথে প্রবাহের ক্যাশেগুলি পূরণ করা ভাল be বিশেষত যখন তারা নিজের সার্ভারে চলছে on ;-)

আপডেট (2014-09-28): আজকাল দেখে মনে হচ্ছে ক্রোমেরও Cache-Control: no-storeপ্রয়োজন হয়।


1
গ্রেট! অনেক সময় আমার ওয়েব চিত্রগুলি লোড করার চেষ্টা করার পরে যা বিলম্বের সাথে লোড হচ্ছিল আমি আপনার সমাধানটি প্রয়োগ করে কেবল এটি সমাধান করেছি ('#' দিয়ে, '?' ব্যবহার করে আমার পক্ষে কাজ করছে না)? অনেক ধন্যবাদ!!!
ব্যবহারকারী 304602

18
এখানে টিডব্লিউও ক্যাশে জড়িত রয়েছে: ব্রাউজারের নিয়মিত এইচটিটিপি ক্যাশে এবং এটি সম্প্রতি প্রদর্শিত ইমেজের একটি ইন-মেমরি ক্যাশে রয়েছে। এই মেমোরি ক্যাশটি সম্পূর্ণ srcঅ্যাট্রিবিউট দ্বারা সূচকযুক্ত , সুতরাং একটি অনন্য খণ্ড শনাক্তকারী যুক্ত করা নিশ্চিত করে যে চিত্রটি কেবল স্মৃতি থেকে টানেনি। কিন্তু খণ্ডের শনাক্তকারীদের HTTP অনুরোধের অংশ হিসাবে প্রেরণ করা হয় না, তাই নিয়মিত এইচটিটিপি ক্যাশে স্বাভাবিক হিসাবে ব্যবহৃত হবে। এ কারণেই এই কৌশলটি কাজ করে।
করুক

বেশ কয়েকটি শিরোনাম ক্যাশে রয়েছে। আসলে আমি ইংরেজি খুব ভাল জানি না, আপনি কি দয়া করে আমাকে বলতে পারেন কোনটি ব্যবহার করা উচিত ?! আমি এমন কিছু চাই যা কেবল পরিবর্তিত ফটো (যেমন ক্যাপচার মতো) ক্যাশে না করে এবং অন্যান্য জিনিস ক্যাশে করে না। তাহলে Cache-Control: max-age=0, must-revalidateকি আমার পক্ষে ভাল?
শাফিজাদেহ

এটি আমার পক্ষে কাজ করে না। আমার ক্ষেত্রে কেবল ভিন্ন জিনিসটি হ'ল আমার কাছে একটি কন্ট্রোলার অ্যাকশনের url রয়েছে যা ডিবি থেকে img পুনরুদ্ধার করে। কন্ট্রোলার অ্যাকশনের জন্য আমার অন্যান্য যুক্তি ছিল তাই আমি এটিকে "...... & রূপান্তরিত করে = সত্য & t =" + নতুন তারিখ ()। GetTime (); এবং "...... & রূপান্তর = সত্য #" + নতুন তারিখ ()। গেটটাইম ();। আমি কি ভুল করছি কিছু আছে?
শেফুও

1
অবজেক্ট তৈরি এবং / অথবা পদ্ধতি কলের ওভারহেড এড়াতে, আপনি ক্যাশে-বাস্টার হিসাবে একটি ইনক্রিমেন্টিং পূর্ণসংখ্যার ব্যবহার করতে পারেন:newImage.src = "http://localhost/image.jpg#" + i++;
লিন্ডির

7

নতুন চিত্রটি তৈরি করার পরে, আপনি কি ডিওএম থেকে পুরানো চিত্রটি সরিয়ে নতুন চিত্রের সাথে প্রতিস্থাপন করছেন?

আপনি প্রতিটি আপডেট ইমেজ কলটিতে নতুন চিত্র দখল করতে পারেন তবে সেগুলি পৃষ্ঠাতে যুক্ত করছেন না।

এটি করার বিভিন্ন উপায় রয়েছে। এরকম কিছু কাজ করবে।

function updateImage()
{
    var image = document.getElementById("theText");
    if(image.complete) {
        var new_image = new Image();
        //set up the new image
        new_image.id = "theText";
        new_image.src = image.src;           
        // insert new image and remove old
        image.parentNode.insertBefore(new_image,image);
        image.parentNode.removeChild(image);
    }

    setTimeout(updateImage, 1000);
}

সেই কাজটি করার পরে, যদি এখনও সমস্যা থাকে তবে এটি সম্ভবত অন্যান্য উত্তরগুলির মতো কথা বলার মতো একটি ক্যাচিং সমস্যা।


3

একটি উত্তর হ্যাশিশালিভাবে কিছু কোয়েরি প্যারামিটার যুক্ত করার পরামর্শ দেওয়া হয়েছে।

আরও ভাল উত্তর হ'ল আপনার এইচটিটিপি শিরোনামে বেশ কয়েকটি অতিরিক্ত বিকল্প নির্গত।

Pragma: no-cache
Expires: Fri, 30 Oct 1998 14:19:41 GMT
Cache-Control: no-cache, must-revalidate

অতীতে একটি তারিখ সরবরাহ করে, এটি ব্রাউজার দ্বারা ক্যাশে করা হবে না। Cache-Controlএইচটিটিপি / ১.১ এ যুক্ত করা হয়েছিল এবং অবশ্যই পুনর্নির্মাণের ট্যাগটি ইঙ্গিত দেয় যে প্রক্সিগুলি কখনও মাতালীন পরিস্থিতিতে এমনকি কোনও পুরানো চিত্র উপস্থাপন করা উচিত নয় এবং Pragma: no-cacheবর্তমান আধুনিক ব্রাউজারগুলি / ক্যাশেগুলির জন্য এটি সত্যই প্রয়োজনীয় নয় তবে কিছু ক্রুটি ভাঙা পুরানো বাস্তবায়নে সহায়তা করতে পারে।


3
এটি শোনাচ্ছে যেমন এটি কাজ করে তবে এটি হ্যাক্স সহ এখনও একই চিত্র দেখায়। আমি প্রশ্নের সাথে শিরোনামের তথ্য যুক্ত করব।
কুইহ্যামহামার

আমি কেবল লক্ষ্য করেছি যে আপনি একই ইমজি ট্যাগটি বার বার সতেজ করছেন। ব্রাউজার সম্ভবত সনাক্ত করবে যখন আপনি এসআরসি সেট করতে যান যে এসসিআর পরিবর্তন হয়নি এবং তাই তা রিফ্রেশ করা বিরক্তিকর নয়। (যেহেতু এই চেকটি ডোম স্তরে ঘটছে এবং লক্ষ্যটির সাথে কিছুই করার নেই)। "যুক্ত" করলে কি হয়? + সংখ্যা - চিত্রটি ইউআরএল থেকে পুনরুদ্ধার করা হচ্ছে?
এডওয়ার্ড কেএমইটিটি

3

আমার একটি আবশ্যকতা ছিল: 1) ?var=xxচিত্রটিতে কোনও যোগ করতে পারে না 2) এটি ক্রস-ডোমেনের কাজ করা উচিত

আমি এই উত্তরটির সাথে # 4 বিকল্পটি সত্যিই পছন্দ করি তবে:

  • এটি নির্ভরযোগ্যভাবে ক্রসডোমেনের সাথে কাজ করতে সমস্যা (এবং এটির জন্য সার্ভার কোডটি স্পর্শ করা দরকার)।

আমার দ্রুত এবং নোংরা উপায় হ'ল:

  1. লুকানো iframe তৈরি করুন
  2. বর্তমান পৃষ্ঠাটি এতে লোড করুন (পুরো পৃষ্ঠা হ্যাঁ)
  3. iframe.contentWindow.location.reload(true);
  4. চিত্র উত্সটি নিজের কাছে পুনরায় সেট করুন

এটা এখানে

function RefreshCachedImage() {
    if (window.self !== window.top) return; //prevent recursion
    var $img = $("#MYIMAGE");
    var src = $img.attr("src");
    var iframe = document.createElement("iframe");
    iframe.style.display = "none";
    window.parent.document.body.appendChild(iframe);
    iframe.src = window.location.href;
    setTimeout(function () {
        iframe.contentWindow.location.reload(true);
        setTimeout(function () {
            $img.removeAttr("src").attr("src", src);
        }, 2000);
    }, 2000);
}

হ্যাঁ, আমি জানি, সেটটাইমআউট ... আপনাকে এটি যথাযথ অনলোড-ইভেন্টে বদলাতে হবে।


3
<img src='someurl.com/someimage.ext' onload='imageRefresh(this, 1000);'>

তারপরে কিছু জাভাস্ক্রিপ্টে নীচে

<script language='javascript'>
 function imageRefresh(img, timeout) {
    setTimeout(function() {
     var d = new Date;
     var http = img.src;
     if (http.indexOf("&d=") != -1) { http = http.split("&d=")[0]; } 

     img.src = http + '&d=' + d.getTime();
    }, timeout);
  }
</script>

এবং তাই এটি কী করে, যখন চিত্রটি লোড হয়, এটি 1 সেকেন্ডে পুনরায় লোড করার শিডিয়ুল করে। আমি এটিকে বিভিন্ন ধরণের হোম সিকিউরিটি ক্যামেরা সহ একটি পৃষ্ঠায় ব্যবহার করছি।


2

আমি যেটা শেষ করেছিলাম তা হ'ল সার্ভারটি সেই ডিরেক্টরিতে থাকা কোনও চিত্রের জন্য কোনও অনুরোধ উত্সটিতে আপডেট করার চেষ্টা করছে having আমি তখন আমার টাইমারটির নামের শেষে একটি নম্বর সংযোজন করেছি যাতে DOM এটি একটি নতুন চিত্র হিসাবে দেখবে এবং এটি লোড করবে।

যেমন

http://localhost/image.jpg
//and
http://localhost/image01.jpg

একই চিত্র প্রজন্মের কোডটির জন্য অনুরোধ করবে তবে এটি ব্রাউজারে বিভিন্ন চিত্রের মতো দেখাবে।

var newImage = new Image();
newImage.src = "http://localhost/image.jpg";
var count = 0;
function updateImage()
{
    if(newImage.complete) {
        document.getElementById("theText").src = newImage.src;
        newImage = new Image();
        newImage.src = "http://localhost/image/id/image" + count++ + ".jpg";
    }
    setTimeout(updateImage, 1000);
}

8
এটিতে ক্যোরিস্ট্রিং সমাধান (পাওলো এবং আরও কিছু) হিসাবে চিত্রটির একাধিক অনুলিপি ক্যাশে করার একই সমস্যা হবে এবং এতে সার্ভার পরিবর্তন দরকার।
টমজি

2

function reloadImage(imageId)
{
   path = '../showImage.php?cache='; //for example
   imageObject = document.getElementById(imageId);
   imageObject.src = path + (new Date()).getTime();
}
<img src='../showImage.php' id='myimage' />

<br/>

<input type='button' onclick="reloadImage('myimage')" />


3
দয়া করে ওপিকে ব্যাখ্যা করুন কীভাবে এবং কেন এটি কেবল কোড পেস্ট করার পরিবর্তে
15-15-

আমি মনে করি না যে ../showImage.phpFri May 01 2015 17:34:18 GMT+0200 (Mitteleuropäische Sommerzeit)এটি একটি বৈধ ফাইলের নাম ... কমপক্ষে এটিই এটি লোড করার চেষ্টা করে ...
বাইটহ্যামস্টার

পরিবর্তন path='../showImage.php';করুনpath='../showImage.php?';
বুমিক

2
document.getElementById("img-id").src = document.getElementById("img-id").src

এটির নিজস্ব এসসিআরকে তার এসসিআর হিসাবে সেট করুন।


1

একটি অনর্থক ইউআরএল তৈরি করার জন্য অদম্য ক্যোরিস্ট্রিং ব্যবহার করার চেষ্টা করুন:

function updateImage()
{
    if(newImage.complete) {
        document.getElementById("theText").src = newImage.src;
        newImage = new Image();
        number++;
        newImage.src = "http://localhost/image.jpg?" + new Date();
    }

    setTimeout(updateImage, 1000);
}

কোডটিতে ডাব্লিউকিউএস যুক্ত করা হয়েছে এবং যাচাই করা হয়েছে যে অনুরোধটি স্বীকৃত হচ্ছে এবং ব্রাউজারটি ইমেজ রিফ্রেশ করার সাথে ঠিকানা + ডাব্লুকিউএস থেকে আসা প্রতিক্রিয়াটি দেখে sees
কুইহ্যামহামার

1

প্রচন্ডভাবে Doin থেকে এর # 4 কোডের উপর ভিত্তি করে, উদাহরণস্বরূপ নিচের সরলীকৃত কোড একটি দুর্দান্ত বিট ব্যবহার করে document.writeপরিবর্তে src মধ্যে iframeCORS সমর্থন। এছাড়াও কেবল পৃষ্ঠায় প্রতিটি চিত্র পুনরায় লোড না করে ব্রাউজার ক্যাশে বুস্ট করার উপর দৃষ্টি নিবদ্ধ করে।

নীচে লিখিত typescriptএবং just angular q প্রতিশ্রুতি গ্রন্থাগারটি ব্যবহার করা হয়েছে, শুধু fyi, তবে ভ্যানিলা জাভাস্ক্রিপ্টে পোর্ট করার পক্ষে যথেষ্ট সহজ হওয়া উচিত। পদ্ধতিটি টাইপস্ক্রিপ্ট শ্রেণীর ভিতরে থাকতে বোঝায়।

যদি প্রতিশ্রুতি ফেরত দেয় যা সমাধান করা হবে যখন আইফ্রেমে পুনরায় লোডিং সম্পন্ন হবে। ভারী পরীক্ষিত নয়, তবে আমাদের পক্ষে ভাল কাজ করে।

    mmForceImgReload(src: string): ng.IPromise<void> {
        var deferred = $q.defer<void>();
        var iframe = window.document.createElement("iframe");

        var firstLoad = true;
        var loadCallback = (e) => {
            if (firstLoad) {
                firstLoad = false;
                iframe.contentWindow.location.reload(true);
            } else {
                if (iframe.parentNode) iframe.parentNode.removeChild(iframe);
                deferred.resolve();
            }
        }
        iframe.style.display = "none";
        window.parent.document.body.appendChild(iframe);
        iframe.addEventListener("load", loadCallback, false);
        iframe.addEventListener("error", loadCallback, false);
        var doc = iframe.contentWindow.document;
        doc.open();
        doc.write('<html><head><title></title></head><body><img src="' + src + '"></body></html>');
        doc.close();
        return deferred.promise;
    }

পদ্ধতি এটা XSS ত্রুটিগুলি আপনি ব্যবহার করা উচিত রক্ষা করার জন্য + encodeURI(src) +সঠিকভাবে অব্যাহতি srcমধ্যে iframe
টিনো

1

নীচের কোডটি যখন একটি বোতাম ক্লিক করা হয় তখন রিফ্রেশ করার জন্য দরকারী to

function reloadImage(imageId) {
   imgName = 'vishnu.jpg'; //for example
   imageObject = document.getElementById(imageId);
   imageObject.src = imgName;
}

<img src='vishnu.jpg' id='myimage' />

<input type='button' onclick="reloadImage('myimage')" />

Downvoted। যেহেতু এটি @ মাহমুদের কোডের সামান্য পরিবর্তিত অনুলিপি, তবে বিপরীতে এটি চিত্রটি সতেজ করছে না
টিনো

0

আমি একটি সার্লেটের মাধ্যমে ডেটা ফেরত পাঠিয়ে এই সমস্যার সমাধান করেছি।

response.setContentType("image/png");
response.setHeader("Pragma", "no-cache");
response.setHeader("Cache-Control", "no-cache, must-revalidate");
response.setDateHeader("Expires", 0);

BufferedImage img = ImageIO.read(new File(imageFileName));

ImageIO.write(img, "png", response.getOutputStream());

তারপরে পৃষ্ঠা থেকে আপনি কেবল সঠিক চিত্রের ফাইলটি ধরতে কিছু প্যারাম দিয়ে সার্লেটটি দিন।

<img src="YourServlet?imageFileName=imageNum1">

0

এখানে আমার সমাধান। এটা খুবই সাধারণ. ফ্রেমের সময়সূচী আরও ভাল হতে পারে।

<!doctype html>
<html>
    <head>
        <meta charset="utf-8">      
        <title>Image Refresh</title>
    </head>

    <body>

    <!-- Get the initial image. -->
    <img id="frame" src="frame.jpg">

    <script>        
        // Use an off-screen image to load the next frame.
        var img = new Image();

        // When it is loaded...
        img.addEventListener("load", function() {

            // Set the on-screen image to the same source. This should be instant because
            // it is already loaded.
            document.getElementById("frame").src = img.src;

            // Schedule loading the next frame.
            setTimeout(function() {
                img.src = "frame.jpg?" + (new Date).getTime();
            }, 1000/15); // 15 FPS (more or less)
        })

        // Start the loading process.
        img.src = "frame.jpg?" + (new Date).getTime();
    </script>
    </body>
</html>

0

new Date().getTime()শেনানিগানের দরকার নেই । আপনি অদৃশ্য ছদ্মবেশী ছদ্মবেশী ছবি এবং jQuery। লোড () ব্যবহার করে ব্রাউজারটিকে চালিত করতে পারেন, তারপরে প্রতিবার একটি নতুন চিত্র তৈরি করুন:

<img src="" id="dummy", style="display:none;" />  <!-- dummy img -->
<div id="pic"></div>

<script type="text/javascript">
  var url = whatever;
  // You can repeat the following as often as you like with the same url
  $("#dummy").load(url);
  var image = new Image();
  image.src = url;
  $("#pic").html("").append(image);
</script>

0

সহজ সমাধান: প্রতিক্রিয়াতে এই শিরোনাম যুক্ত করুন:

Cache-control: no-store

কেন এই কাজগুলি এই অনুমোদিত পৃষ্ঠায় স্পষ্টভাবে ব্যাখ্যা করা হয়েছে: https://developer.mozilla.org/en-US/docs/Web/HTTP/Heeda/Cache-Control

এটি কেন no-cacheকাজ করে না তাও ব্যাখ্যা করে।

অন্যান্য উত্তরগুলি কাজ করে না কারণ:

Caching.deleteএকটি নতুন ক্যাশে সম্পর্কে যা আপনি অফ-লাইন কাজের জন্য তৈরি করতে পারেন, দেখুন: https://web.dev/cache-api-quick-guide/

ইউআরএলে একটি # ব্যবহার করে টুকরোগুলি কাজ করে না কারণ # ব্রাউজারটিকে সার্ভারে একটি অনুরোধ না প্রেরণ করতে বলে।

একটি এলোমেলো অংশযুক্ত একটি ক্যাশে-বাস্টার ইউআরএল-এ কাজ করে তবে এটি ব্রাউজারের ক্যাশেও পূরণ করবে। আমার অ্যাপ্লিকেশনটিতে, আমি ওয়েব ক্যাম থেকে কয়েক সেকেন্ডের মধ্যে একটি 5 এমবি ছবি ডাউনলোড করতে চেয়েছিলাম। আপনার পিসি পুরোপুরি হিম করতে কেবল এক ঘন্টা বা তারও কম সময় লাগবে। আমি এখনও জানি না কেন ব্রাউজার ক্যাশে যুক্তিসঙ্গত সর্বাধিক সীমাবদ্ধ নয়, তবে এটি অবশ্যই একটি অসুবিধা।


0

ওয়েব পৃষ্ঠায় আমার ওয়েবক্যাম দেখানোর জন্য আমি আলেকজএমএ থেকে স্ক্রিপ্টটি উন্নত করেছি যা সময়ে সময়ে একই নামের সাথে একটি নতুন চিত্র আপলোড করে। আমার এমন সমস্যা ছিল যে কখনও কখনও ভাঙা ইমেজ বা সম্পূর্ণ (আপ) লোড হওয়া চিত্রের কারণে চিত্রটি ঝিমঝিম করে। ঝাঁকুনি প্রতিরোধে আমি চিত্রটির প্রাকৃতিক উচ্চতা যাচাই করি কারণ আমার ওয়েবক্যাম চিত্রের আকার পরিবর্তন হয়নি। লোড হওয়া চিত্রের উচ্চতাটি মূল চিত্রের উচ্চতার সাথে ফিট করে তবেই পুরো চিত্রটি পৃষ্ঠায় প্রদর্শিত হবে।

  <h3>Webcam</h3>
  <p align="center">
    <img id="webcam" title="Webcam" onload="updateImage();" src="https://www.your-domain.com/webcam/current.jpg" alt="webcam image" width="900" border="0" />

    <script type="text/javascript" language="JavaScript">

    // off-screen image to preload next image
    var newImage = new Image();
    newImage.src = "https://www.your-domain.com/webcam/current.jpg";

    // remember the image height to prevent showing broken images
    var height = newImage.naturalHeight;

    function updateImage()
    {
        // for sure if the first image was a broken image
        if(newImage.naturalHeight > height)
        {
          height = newImage.naturalHeight;
        }

        // off-screen image loaded and the image was not broken
        if(newImage.complete && newImage.naturalHeight == height) 
        {
          // show the preloaded image on page
          document.getElementById("webcam").src = newImage.src;
        }

        // preload next image with cachebreaker
        newImage.src = "https://www.your-domain.com/webcam/current.jpg?time=" + new Date().getTime();

        // refresh image (set the refresh interval to half of webcam refresh, 
        // in my case the webcam refreshes every 5 seconds)
        setTimeout(updateImage, 2500);
    }

    </script>
</p>

-3

আমি প্রথমে একটি ভুয়া (বাফার) ইউআরএল দিয়ে চিত্রটি আবদ্ধ করার নীচের ধারণাটি ব্যবহার করেছি এবং এর পরে বৈধ ইউআরএল-এর সাথে বাঁধাই করেছি।

imgcover.ImageUrl = ConfigurationManager.AppSettings["profileLargeImgPath"] + "Myapp_CoverPic_" + userid + "Buffer.jpg";

imgcover.ImageUrl = ConfigurationManager.AppSettings["profileLargeImgPath"] + "Myapp_CoverPic_" + userid + ".jpg";

এইভাবে, আমি ব্রাউজারকে বৈধ url দিয়ে রিফ্রেশ করতে বাধ্য করছি।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.