ফায়ারফক্সের ইতিহাসে ফিরে ভ্রমণের পরে, জাভাস্ক্রিপ্ট চলবে না


84

পূর্ববর্তী পরিদর্শন করা পৃষ্ঠায় পৌঁছানোর জন্য আমি যখন ফায়ারফক্সের পিছনের বোতামটি ব্যবহার করি, তখন সেই পৃষ্ঠায় স্ক্রিপ্টগুলি আর চলবে না

দ্বিতীয়বার পৃষ্ঠাটি দেখার সময় স্ক্রিপ্টগুলি আবার কার্যকর করার জন্য কি কোনও স্থির / কর্মপরিকল্পনা রয়েছে ?

দয়া করে নোট করুন যে আমি Google Chrome এবং ইন্টারনেট এক্সপ্লোরারে একই পৃষ্ঠাগুলি পরীক্ষা করেছি এবং সেগুলি যেমন ইচ্ছা তেমন কাজ করে।


সমস্যাটি পরীক্ষা করতে আমি যে ফাইলগুলি এবং পদক্ষেপগুলি ব্যবহার করেছি তা এখানে:

(0.html এ নেভিগেট করুন, 1.html, পিছনে বোতামটি পেতে ক্লিক করুন)

0.html

<html><body>
<script>
  window.onload = function() { alert('window.onload alert'); };
  alert('inline alert');
</script>
<a href="1.html">Click Me!</a>
</body></html>

1.এইচটিএমএল

<html><body>
<p>Go BACK!</p>
</body></html>

উত্তর:


93

উইন্ডোতে কল করতে একটি খালি ফাংশন সেট করুন unউনলোড:

window.onunload = function(){}; 

যেমন

<html><body>
<script type="text/javascript">
  window.onload = function() { alert('window.onload alert'); };
  window.onunload = function(){};
  alert('inline alert');
</script>
<a href="1.html">Click Me!</a>
</body></html>

সূত্র: http://www.firefoxanswer.com/firefox/672-firefoxanswer.html (সংরক্ষণাগারিত সংস্করণ)


4
আপনাকে ধন্যবাদ, এটি কাজ করে। ডিফল্ট অননলোড হ্যান্ডলার কী করে তার কোনও ইঙ্গিত? (যেমন আমি কি এখানে কোনও ধরণের ডিফল্ট আচরণকে উপেক্ষা করছি?)
পাতোনজা

ঠিক আছে ধন্যবাদ, আমি তদন্ত করব। আপনাকে আবারও ধন্যবাদ, এই সমস্যাটি আমাকে কিছুক্ষণ ধরে
আড়াল করে চলেছে

অন্য ব্রাউজারগুলি না করে ফায়ারফক্সের কেন এটি প্রয়োজন তা কেউ জানেন?
পিম জাগার

7
আপনি কোনও কিছুকেই ওভাররাইড করছেন না, এটি ফায়ারফক্সকে ব্যাক-ফরওয়ার্ড ক্যাশে (বিএফচাচি) পৃষ্ঠাটি ক্যাশে করা থেকে বিরত রাখে। developer.mozilla.org/en/DOM/window.onunload developer.mozilla.org/En/Using_Firefox_1.5_caching
ক্রিস হাশ

4
যদিও এটা করা উচিত bfcache বিরতি দুর্ভাগ্যবশত মনে হয় এটি এখনও পূর্ববর্তী পৃষ্ঠায় স্মরণ - বিশেষভাবে, আইফ্রেম যে URL গুলি লোড হয় আবার লোড করা হয় যখন তুমি ফিরে যান, এবং ফ্রেম স্থাপন করা প্রয়োজন উত্পাদিত সামগ্রী, সেখানে crossbrowser হবে বলে মনে হচ্ছে না করলে নতুনভাবে রিফ্রেশ করার উপায়
NoBugs

76

পূর্ববর্তী পরিদর্শন করা পৃষ্ঠায় পৌঁছানোর জন্য আমি যখন ফায়ারফক্সের পিছনের বোতামটি ব্যবহার করি, তখন সেই পৃষ্ঠায় স্ক্রিপ্টগুলি আর চলবে না।

এটি সঠিক এবং এটি একটি ভাল জিনিস।

আপনি যখন ফায়ারফক্সে (এবং সাফারি এবং অপেরা) কোনও লিঙ্ক আঘাত করেন, পরের পৃষ্ঠায় যাওয়ার জন্য এটি তত্ক্ষণাত আপনার পৃষ্ঠাটি ধ্বংস করে না। এটি পৃষ্ঠাটি অক্ষত রাখে, কেবল এটিকে দৃশ্য থেকে লুকিয়ে রাখে। আপনি যদি পিছনের বোতামটি আঘাত করেন তবে এটি ডকুমেন্টটি আবার লোড না করেই পুরানো পৃষ্ঠাটি আবার দেখাবে; এটি অনেক দ্রুত, ব্যবহারকারীর জন্য মসৃণ পিছনে / ফরোয়ার্ড পৃষ্ঠা রূপান্তরগুলির ফলে।

এই বৈশিষ্ট্যটিকে বিএফচ্যাচ বলা হয় ।

ব্যবহারকারীর পূর্ববর্তী লোড এবং এটির ব্যবহারের সময় আপনি যে পৃষ্ঠাতে পৃষ্ঠায় যুক্ত করেছেন সেগুলি এখনও থাকবে। পৃষ্ঠার উপাদানগুলির সাথে সংযুক্ত কোনও ইভেন্ট হ্যান্ডলারগুলি এখনও সংযুক্ত থাকবে। আপনার নির্ধারিত যেকোন সময়সীমা / বিরতি এখনও সক্রিয় থাকবে। সুতরাং আপনার লুক্কায়িত এবং পুনরায় দেখানো হয়েছে তা আপনার জানা দরকার এমন খুব কমই আছে। onloadআবার কল করা বা স্ক্রিপ্ট কোডটি ইনলাইন করা ভুল হবে , কারণ যে ফাংশনে আপনি যে কোনও বাধ্যবাধকতা এবং বিষয়বস্তু তৈরি করেছেন সম্ভাব্য বিপর্যয়কর ফলাফল সহ একই কন্টেন্টের উপর দ্বিতীয়বার কার্যকর করা হবে। (যেমন। document.writeইনলাইন স্ক্রিপ্ট পৃষ্ঠা পুরোপুরি ধ্বংস করবে))

লেখার window.onunloadপ্রভাব পড়ার কারণটি হ'ল যে ব্রাউজারগুলি bfcache প্রয়োগ করে তা স্থির করে - যে পৃষ্ঠাগুলির সাথে সামঞ্জস্যের জন্য যেগুলি কখন ফেলে দেওয়া হচ্ছে তা জানতে হবে - যে পৃষ্ঠাটি কখন onunloadঘটবে তা জানার আগ্রহ প্রকাশ করে যে বিএফচাকে সৃষ্টি করবে অক্ষম করা আপনি যখন bfcache থেকে আনার পরিবর্তে এটিতে ফিরে যাবেন তখন এই পৃষ্ঠাটি তাজা লোড হবে।

সুতরাং যদি আপনি সেট করেন window.onunload= function() {};, আপনি আসলে যা করছেন তা ইচ্ছাকৃতভাবে বিএফচাকে ভেঙে দিচ্ছে। এর ফলে আপনার পৃষ্ঠাগুলি নেভিগেট করতে ধীর হবে এবং শেষের বিকল্প হিসাবে ব্যবহার করা উচিত নয়।

আপনি যদি জানতে চান যে ব্যবহারকারী কখন বাজেচাই না করে আপনার পৃষ্ঠায় ফিরে যায় বা ফিরে আসে, আপনি পরিবর্তে ঘটনা onpageshowএবং onpagehideইভেন্টগুলিকে ফাঁদে ফেলতে পারেন :

window.onload=window.onpageshow= function() {
    alert('Hello!');
};

4
আমার সমস্যাটি হল যে bfcache সমস্ত পৃষ্ঠা ক্যাশে করে না তাই হারিয়ে যাওয়া সামগ্রী পুনর্নির্মাণের জন্য আমাকে পুনরায় চালাতে হবে। সুতরাং পুরো পৃষ্ঠা ছিটানো ঠিক হতে পারে। যাইহোক, আমি উইন্ডো.অনলোড ইভেন্টটি ব্যবহার করছি না, আমি jQuery ডকুমেন্ট ব্যবহার করছি ready প্রস্তুতি ইভেন্ট। আপনি কী এখনও দস্তাবেজটি ব্যবহার করতে সক্ষম হবেন তা জানেন এবং এই সমস্যাটি এড়াতে পারেন?
পাতোনজা

bfcache সাধারণত পুরো পৃষ্ঠাটি যেমনটি ছিল ততক্ষণে ফিরে আসা উচিত। আগের পৃষ্ঠা থেকে ফিরে আসার পরে যে সামগ্রীটি অনুপস্থিত তা কী? (পরীক্ষার কেস?) document.readyমূলত একইভাবে কাজ করবে window.onload(কিছু ব্রাউজারের জন্য, তারা যেভাবেই হোক একই ইভেন্ট)।
ববিনস

14
এটি কোনও ভাল জিনিস নয় কারণ এটি ক্যাশেড বিবেচনা করে আবার জাভাস্ক্রিপ্ট চালায় না ... তবে জাভাস্ক্রিপ্টের পূর্বে করা পরিবর্তনগুলি ক্যাশে করবে না। পৃষ্ঠাটিতে লোডের কোনও উপাদানটিতে জাভাস্ক্রিপ্ট ম্লান হয়ে গেলে, ইতিহাসে দেখার সময় এটি আবার ফিকে হয়ে যায় না ... তবে জাভাস্ক্রিপ্টটি যা করেছে তা পূর্বাবস্থায় আবার 0 টি অস্বচ্ছতার সাথে শুরু করে! এটি সমস্ত বা কিছুই হতে হবে। জাভাস্ক্রিপ্ট চলার পরে আপনাকে অবশ্যই পৃষ্ঠার সম্পূর্ণ স্থিতি ক্যাশে করতে হবে যদি আপনি আবার জাভাস্ক্রিপ্ট না চালিয়ে ক্যাশে উপস্থাপন করতে চান!
জিম্বো জনি

4
@ জিম্বো: টেস্ট কেস দয়া করে বিএফচ্যাচের উদ্দেশ্য হ'ল (এবং প্রতিটি ক্ষেত্রে আমি এর আগেও দেখেছি, আছে) লুকোচুরি / শোয়ের উপরে ডিওএমের সঠিক অবস্থানটি সংরক্ষণ করে। পৃষ্ঠাটিতে ফিরে আসার পরে যে উপাদানটি ম্লান হয়ে গিয়েছিল তা অস্বচ্ছ থাকবে, যদি না অন্য কোনও লিপি আবার এটি আড়াল করার জন্য চালায়।
বোবিন্স

4
@ ববিন্স - একটি সিএসএস ফাইলের সাথে একটি উপাদান তৈরি করুন যাতে অস্বচ্ছতাটি শূন্যে সেট হয়ে যায় এবং তারপরে নথিতে প্রস্তুত হয়ে যাওয়ার জন্য কিছু jQuery ব্যবহার করুন। ইতিহাসে ফিরে আসার পরে এটি অপরিচ্ছন্নতা না রেখে স্টাইলশিট সিএসএস (শূন্য) টি পুনরায় প্রয়োগ করবে: জেএস এটি ফেইড করার সময় শৈলীর বৈশিষ্ট্যে যুক্ত করেছিল First অন্য পৃষ্ঠায় যান এবং পিছনে আঘাত করুন এবং এটি কেবল সেখানে সম্পূর্ণ স্বচ্ছ হয়ে বসবে।
জিম্বো জনি 19

24

আপনি ইভেন্টের persistedসম্পত্তিটি পরীক্ষা করতে পারেন pageshow। এটি প্রাথমিক পৃষ্ঠা লোডে মিথ্যাতে সেট করা হয়েছে। পৃষ্ঠাটি যখন ক্যাশে থেকে লোড করা হয় এটি সত্যতে সেট করা থাকে।

window.onpageshow = function(event) {
    if (event.persisted) {
        alert("From bfcache");
    }
};

কিছু কারণে jQuery ইভেন্টে এই সম্পত্তি নেই। আপনি যদিও এটি আসল ইভেন্ট থেকে খুঁজে পেতে পারেন।

$(window).bind("pageshow", function(event) {
    if (event.originalEvent.persisted) {
        alert("From bfcache");
    }
});

উভয় জাভাস্ক্রিপ্ট এবং jquery সংস্করণ সরবরাহ করার জন্য ধন্যবাদ! আপনি সেখানে শেষে একটি বন্ধনী মিস করেছেন (এটি হাহাকার নয়!)। আমি অন্যদের পক্ষেও নোট করব, আইই ও ক্রোম রিপোর্ট .ব্যবসায়ী সর্বদা মিথ্যা, নির্বিশেষে।
ম্যাগনাস স্মিথ

ম্যাগনাস দ্বারা উল্লিখিত হিসাবে, আমি যদি বিবৃতিটি অপসারণ না করে এটি ক্রোমে আমার পক্ষে কাজ করে না।
জাস্টিন

এটি ক্রোম 58.0.3029.110 (64-বিট) এবং এফএফ 53.0.2 (64-বিট) এ কোনও পরিবর্তন ছাড়াই আমার পক্ষে কাজ করেছে for
কিলোমোজার

1

"অননলোড" ইভেন্টে ওয়্যার যা কিছু করে না:

<html><body>
<script type="text/javascript">
  window.onload = function() { alert('window.onload alert'); };
  window.onunload = function(){}; 
  alert('inline alert');
</script>
<a href="1.html">Click Me!</a>
</body></html>

নিশ্চিত নয়, আমি একটি ভোট দিয়েছি, দেখে মনে হচ্ছে কেউ এই প্রশ্নের প্রতিটি উত্তরকে
হ্রাস করেছে

আপনার উত্তরে আপনার যুক্ত হওয়া উচিত যে আপনার পৃষ্ঠায় অননলোড ইভেন্ট যুক্ত করা পৃষ্ঠাটিকে সম্পূর্ণরূপে ক্যাশে করা অক্ষম করবে। এটি কেবল জেএসকে আবার চালাতে পারে না, এটি সার্ভার লোডকে একটি খাঁজ পর্যন্ত বাড়িয়ে তুলবে। এটি সত্যিই হালকাভাবে নেওয়ার পরামর্শ নয়, এটি সাবধানে বিবেচনা করা উচিত।
dreagan

@dreagan, এটি bfcache অক্ষম করে তবে এইচটিটিপি ক্যাশে অগত্যা নয়। এইচটিটিপি ক্যাশে একটি সম্পূর্ণ অন্যান্য নিয়ম আছে। আপনি যদি সেখানে কোনও সার্ভার-সাইড স্লিপ ফেলে দেন তবে আপনার ফিরে ক্লিক করার সময় এটি লক্ষ্য করা উচিত। মোজিলা বিএফসিচির জন্য এফএকিউ- এ তাদের তৃতীয় প্রশ্নে এ সম্পর্কে কথা বলে
ক্রিস হাশ

আমি বিএফকাচে সম্পর্কে বলছিলাম, এটি নির্দিষ্ট করা উচিত ছিল। এর অর্থ এই নয় যে আপনার পরিণতিটির ওপিকে অবহিত না করে আপনার মতো পরামর্শ দেওয়া উচিত। বিকল্পটি হ'ল অনপপস্টেট ইভেন্টটি জাভাস্ক্রিপ্টটি আবার চেষ্টা ও ফায়ার করার জন্য ব্যবহার করা।
dreagan

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

1

আমি যতদূর জানি ফায়ারফক্স onLoadপিছনে ইভেন্ট চালায় না ।

এটি এখানে এই লিঙ্কটি থেকে পরিবর্তে ফোকাস ট্রিগার করা উচিত ।


এটি এবং উইন্ডোজ.অনফোকাস পরীক্ষা করে নিল এমনকি খালি উইন্ডো.নুনলোড হ্যান্ডলারটি সেট না করেই কল হয়ে যায়। অননলোড সেট করা কিছুটা ভাল কাজ যেমন হয় তবে .ফনফোকাসও ঠিকঠাক হওয়া উচিত। ধন্যবাদ :)
পাতোনজা

1

ব্রাউজারের ইতিহাস ব্যবহার করে যখন ব্যবহারকারী এটিতে আবার নেভিগেট করে তখন কোনও পৃষ্ঠা জাভাস্ক্রিপ্ট কার্যকর করতে একটি সহজ উপায় হ'ল অনপপস্টেট ইভেন্ট। আমরা আমাদের হোম পেজে ভিডিওটি বিরতি দিতে এবং পুনরায় খেলতে এটি ব্যবহার করি ( https://fynydd.com )।

window.onpopstate = function() {

    // Do stuff here...
};

0

এজ্যাক্স অপারেশনগুলির মতো কিছু ক্ষেত্রে url পরিবর্তন শ্রোতার ব্যবহার করা যেতে পারে

$(window).on('hashchange', function() {
        ....
});
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.