কোনও ব্যবহারকারী পিছনের বোতামটি ব্যবহার করে কোনও পৃষ্ঠায় পৌঁছেছে তা আমি কীভাবে সনাক্ত করব?


90

এই প্রশ্নটি ট্র্যাকের অনুরূপ যখন ব্যবহারকারী ব্রাউজারে ব্যাক বোতামটি হিট করে তবে একই নয় ... আমার একটি সমাধান রয়েছে এবং রেফারেন্স এবং প্রতিক্রিয়ার জন্য এটি এখানে পোস্ট করছি। কারও যদি আরও ভাল বিকল্প থাকে তবে আমি সব কান!

পরিস্থিতিটি হ'ল আমার কাছে একটি "প্লেস এডিট", একটি লা ফ্লিকার সহ একটি পৃষ্ঠা রয়েছে। অর্থাৎ ডিআইভিতে "বর্ণনার যোগ করতে এখানে ক্লিক করুন" রয়েছে, যা ক্লিক করুন যখন সংরক্ষণ এবং বাতিল বোতামগুলির সাহায্যে একটি টেক্সটারিএতে পরিণত হয়। ডাটাবেস আপডেট করার জন্য সার্ভারে ডেটা পোস্ট করে সেভ ক্লিক করা এবং নতুন বর্ণনাকে টেক্সটরিয়ার পরিবর্তে ডিআইভিতে রাখে। পৃষ্ঠাটি রিফ্রেশ করা হলে নতুন বিবরণটি "সম্পাদনা করতে ক্লিক করুন" বিকল্পের সাহায্যে ডাটাবেস থেকে প্রদর্শিত হবে। আজকাল মোটামুটি মানসম্পন্ন ওয়েব 2.0 স্টাফ।

বিষয়টি হ'ল যদি:

  1. পৃষ্ঠাটি বিবরণ ছাড়াই লোড করা হয়
  2. একটি বিবরণ ব্যবহারকারী দ্বারা যুক্ত করা হয়
  3. পৃষ্ঠাটিতে একটি লিঙ্ক ক্লিক করে দূরে নেভিগেট করা হয়
  4. ব্যবহারকারী পিছনে বোতাম ক্লিক করে

তারপরে যা প্রদর্শিত হবে (ব্রাউজারের ক্যাশে থেকে) নতুন বর্ণনামূলকভাবে পরিবর্তনশীল ডিআইভি ছাড়াই পৃষ্ঠার সংস্করণ।

এটি মোটামুটি একটি বড় সমস্যা কারণ ব্যবহারকারীরা ধরে নিয়েছে যে তাদের আপডেটটি হারিয়ে গেছে এবং পরিবর্তনগুলি দেখার জন্য তাদের পৃষ্ঠাটি রিফ্রেশ করার দরকার পড়বে না arily

সুতরাং, প্রশ্নটি হল: আপনি কোনও পৃষ্ঠা লোড হওয়ার পরে সংশোধন করা হিসাবে কীভাবে পতাকাঙ্কিত করতে পারেন এবং তারপরে ব্যবহারকারী কখন "এটিতে ফিরে যায়" এবং সেই পরিস্থিতিতে একটি রিফ্রেশকে বাধ্য করতে পারেন?


আপনার উদ্ধৃত প্রশ্নের তুলনায় এটি কীভাবে আলাদা?
innaM

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

গৃহীত উত্তরটি আপনার আইফ্রেমে ট্রিক বৈশিষ্ট্যযুক্ত।
innaM

উত্তর:


79

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

<form name="ignore_me">
    <input type="hidden" id="page_is_dirty" name="page_is_dirty" value="0" />
</form>

আপনার জাভাস্ক্রিপ্টে আপনার নিম্নলিখিতগুলির প্রয়োজন হবে:

var dirty_bit = document.getElementById('page_is_dirty');
if (dirty_bit.value == '1') window.location.reload();
function mark_page_dirty() {
    dirty_bit.value = '1';
}

এইচটিএমএল সম্পূর্ণরূপে বিশ্লেষণের পরে যে জেএসটি ফর্মটি স্নিগ্ধ করে তা কার্যকর করতে হয় তবে আপনি যদি ফর্ম এবং জেএস উভয় পৃষ্ঠার শীর্ষে (জেএস সেকেন্ড) উভয়ই রাখতে পারেন যদি ব্যবহারকারীর বিলম্বিতা গুরুতর উদ্বেগ হয়।


4
"ফর্ম ডেটা ব্রাউজারগুলিতে (সাধারণত) সংরক্ষণ করা হয়" - আপনি কি এটিতে প্রসারিত করতে সক্ষম? এটি কিছু ব্রাউজারে সংরক্ষণ করা হয় না? বা কিছু পরিস্থিতিতে?
টম

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

10
কিছু ব্রাউজারে লুকানো ট্যাগগুলি সংরক্ষণ করা হয় না। সুতরাং আপনি লুকানো ইনপুট ট্যাগটি ব্যবহার না করে লুকানো পাঠ্য ট্যাগটি ব্যবহার করতে পারেন। <ইনপুট টাইপ = "পাঠ্য" মান = "0" আইডি = 'txt' নাম = 'txt' শৈলী = "প্রদর্শন: কিছুই নয়" />
সজিথ

4
এটি আমার জন্য কাজ করে মহান। আমি নিশ্চিত যে এটি ভেঙে যাওয়ার সময় এর পরিস্থিতি রয়েছে তবে প্রতিটি সমস্যার জন্য এই সমস্যার সমাধান হবে।
জোড়েন

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

53

এই পুরানো সমস্যার একটি খুব সহজ আধুনিক সমাধান এখানে।

if (window.performance && window.performance.navigation.type === window.performance.navigation.TYPE_BACK_FORWARD) {
    alert('Got here using the browser "Back" or "Forward" button.');
}

উইন্ডো.পারফরম্যান্স বর্তমানে সমস্ত বড় ব্রাউজার দ্বারা সমর্থিত।


আমি এই সম্পর্কে শুনিনি। আমি শুধু এই ডকুমেন্টেশন (পাওয়া developer.mozilla.org/en-US/docs/Web/API/Performance/navigation ) এবং আপনার পরিস্থিতির সম্প্রসারিত শুনতে আগ্রহী হবে (যেমন কেন প্রয়োজনীয়তার window.performance && window.performance.navigation.typeমাত্র পরিবর্তে window.performance.navigation.TYPE_BACK_FORWARD?)।
রায়ান

4
window.performance.navigation.TYPE_BACK_FORWARDএটি একটি ধ্রুবক যা সর্বদা 2 এর সমান হয় তাই এটি কেবল তুলনার জন্য ব্যবহৃত হয় is
বাসেম

পারফরম্যান্স.ন্যাভিগেশন অ্যান্ডোরিড এবং অপেরা মিনি ব্যতীত অন্য সমস্ত ডিভাইসে সমর্থিত তবে কোনও সমস্যা নেই এটি খুব সুন্দর ( বিকাশকারী.মোজিলা.আর.ইন / ইউএস / ডকস / ওয়েবে / এপিআই / পারফরম্যান্স / নেভিগেশন )
এলবাজ

4
দেখে মনে performance.navigationহচ্ছে অবচিত হয়েছে এবং পরিবর্তে এটি বিকাশকারী.মোজিলা.আর.ইন.ইউএস
ডকস

4
ফায়ারফক্স ভি 70 2ব্যাক বোতামের হিটগুলির জন্য পারফরম্যান্স.নভিগেশন = সমর্থন করবে । V70 অবধি, এটি ভুলভাবে ফিরে এসেছে 1
অ্যান্ডি মার্সার

13

এই নিবন্ধটি এটি ব্যাখ্যা করে। নীচের কোডটি দেখুন: http://www.webkit.org/blog/516/webkit-page-cache-ii-the-unload-event/

<html>
    <head>
        <script>

            function pageShown(evt){
                if (evt.persisted) {
                    alert("pageshow event handler called.  The page was just restored from the Page Cache (eg. From the Back button.");
                } else {
                    alert("pageshow event handler called for the initial load.  This is the same as the load event.");
                }
            }

            function pageHidden(evt){
                if (evt.persisted) {
                    alert("pagehide event handler called.  The page was suspended and placed into the Page Cache.");
                } else {
                    alert("pagehide event handler called for page destruction.  This is the same as the unload event.");
                }
            }

            window.addEventListener("pageshow", pageShown, false);
            window.addEventListener("pagehide", pageHidden, false);

        </script>
    </head>
    <body>
        <a href="http://www.webkit.org/">Click for WebKit</a>
    </body>
</html>

4
এটি একটি উত্তরের উত্তর, সর্বশেষতম ক্রোম 40 / ফায়ারফক্স 35 এ কাজ করে IE তবে আইই 11 এই ইভেন্টগুলিকে সমর্থন করে না।
স্লাভা আবাকুমভ

ক্যানিউজ.com/#feat= page-transition-events অনুসারে পৃষ্ঠা রূপান্তর ঘটনাগুলি আসলে IE11 + তে সমর্থিত + যেমন আমরা কথা বলি বৈশিষ্ট্যের 88% বিশ্বব্যাপী প্রচার রয়েছে
ক্রিশ্চিয়ান

এফওয়াইআই, ক্রোম ফিরে আসে event.persisted= false, এমনকি পিছনের বোতাম থেকে আঘাত করার সময়ও। আপনাকে অবশ্যই window.performance.navigationক্রোমের জন্য পারফরম্যান্স নেভিগেশন সময় ব্যবহার করতে হবে ।
অ্যান্ডি মার্সার

4

আধুনিক ব্রাউজারগুলির জন্য, এটি এখন সঠিক উপায় বলে মনে হচ্ছে:

const perfEntries = performance.getEntriesByType('navigation');
if (perfEntries.length && perfEntries[0].type === 'back_forward') {
  console.log('User got here from Back or Forward button.');
}

এটি 2020 সালের জানুয়ারির মতো এখনও "পরীক্ষামূলক", তবে মনে হয় এটি বেশ সমর্থনযোগ্য।

https://developer.mozilla.org/en-US/docs/Web/API/ পারফরম্যানেশন নেভিগেশন সময় নির্ধারণ


4
== এর পরিবর্তে === ব্যবহার করা আরও ভাল
আবুজার রাজাবি

2

উপরে উল্লিখিত হিসাবে, আমি একটি সমাধান খুঁজে পেয়েছি এবং এটি এখানে রেফারেন্স এবং প্রতিক্রিয়ার জন্য পোস্ট করছি।

সমাধানের প্রথম পর্যায়ে হ'ল পৃষ্ঠাটিতে নিম্নলিখিতগুলি যুক্ত করা:

<!-- at the top of the content page -->
<IFRAME id="page_is_fresh" src="fresh.html" style="display:none;"></IFRAME>
<SCRIPT style="text/javascript">
  function reload_stale_page() { location.reload(); }
</SCRIPT>

সামগ্রীর বিষয়বস্তুগুলি fresh.htmlগুরুত্বপূর্ণ নয়, সুতরাং নিম্নলিখিতগুলির যথেষ্ট হওয়া উচিত:

<!-- fresh.html -->
<HTML><BODY></BODY></HTML>

যখন ক্লায়েন্টের সাইড কোডটি পৃষ্ঠাটি আপডেট করে, তখন এটি নীচে পরিবর্তিতভাবে পতাকাঙ্কিত করতে হবে:

function trigger_reload_if_user_clicks_back_button()
{
  // "dis-arm" the reload stale page function so it doesn't fire  
  // until the page is reloaded from the browser's cache
  window.reload_stale_page = function(){};

  // change the IFRAME to point to a page that will reload the 
  // page when it loads
  document.getElementById("page_is_fresh").src = "stale.html";
}

stale.htmlসমস্ত কাজ করে: এটি লোড হওয়ার পরে এটি reload_stale_pageফাংশনটি কল করবে যা প্রয়োজনীয় হলে পৃষ্ঠাটি রিফ্রেশ করবে। এটি প্রথমবার লোড হওয়ার পরে (অর্থাত্ সংশোধন করার পরে, reload_stale_pageফাংশনটি কিছুই করবে না))

<!-- stale.html -->
<HTML><BODY>
<SCRIPT type="text/javascript">window.parent.reload_stale_page();</SCRIPT>
</BODY></HTML>

এই পর্যায়ে আমার (সর্বনিম্ন) পরীক্ষা করা থেকে, এটি পছন্দসই হিসাবে কাজ করে বলে মনে হচ্ছে। আমি কি কিছু উপেক্ষা করেছি?


আমি জানি না, তবে আমি এটি পুরোপুরি পরীক্ষা করে দেখিনি। getElementById কিছু পুরানো ব্রাউজারগুলিতে সমর্থিত নয়, তবে প্রয়োজনে জিকিউরি বা কোনও কিছুর জন্য সোয়াপ আউট করা সহজ।
টম

2

আপনি onfeforeunload ইভেন্টটি ব্যবহার করে এটি সমাধান করতে পারেন :

window.onbeforeunload = function () { }

একটি হচ্ছে onbeforeunload খালি ইভেন্ট ম্যানেজার ফাংশন মানে পৃষ্ঠা হবে প্রতি একক সময় এটা অ্যাক্সেস করা হয় পুনরায় নির্মাণ করা। জাভাস্ক্রিপ্টগুলি আবার চালানো হবে, সার্ভার-সাইড স্ক্রিপ্টগুলি আবার চালানো হবে, পৃষ্ঠাটি এমনভাবে তৈরি করা হবে যেন ব্যবহারকারী প্রথমবারের মতো এটি আঘাত করছে, এমনকি যদি ব্যবহারকারী কেবল পেছনে বা ফরোয়ার্ড বোতামটি আঘাত করে পৃষ্ঠাটিতে পৌঁছেছে if ।

এখানে একটি উদাহরণ পূর্ণ কোড:

<html>
<head>
<title>onbeforeunload.html</title>
<script>
window.onbeforeunload = function () { }

function myfun()
{
   alert("The page has been refreshed.");
}
</script>

<body onload="myfun()">

Hello World!<br>

</body>
</html>

এটি ব্যবহার করে দেখুন, এই পৃষ্ঠাটি নেভিগেট করুন এবং তারপরে আপনার ব্রাউজারে "পিছনে" বা "ফরোয়ার্ড" বোতাম ব্যবহার করে ফিরে আসুন।

এটি আইই, এফএফ এবং ক্রোমে দুর্দান্ত কাজ করে।

অবশ্যই আপনি মাইফুন ফাংশনের ভিতরে যা খুশি করতে পারেন ।

আরও তথ্য: http://www.hunlock.com/blogs/ মাস্টারিং_এই_ব্যাক_বটন_ওয়াত_ জাভাস্ক্রিপ্ট


আমার জন্য সাফারিতে কাজ করে
জাকব

2

আপনি একটি পতাকা নির্ধারণ করতে (কোনও লুকানো ফর্ম ব্যবহার না করে) স্থানীয় স্টোরেজ বা সেশনসটরেজ ( http://www.w3schools.com/html/html5_webstorage.asp ) ব্যবহার করতে পারেন ।


এটি দুর্দান্ত কাজ তবে আপনি কীভাবে তা করতে পারেন যদি তিনি প্রতিবার এটি সনাক্ত করতে চান, যখন আমি সাইটটি খুলি এবং এটি বন্ধ করে দিয়েছিলাম, ঠিক তখনই আমি সনাক্ত করতে হবে যখন আমি খুললাম এবং বন্ধ করার আগে ফিরে যাব
এলবাজ

1

এই পৃষ্ঠাটি ব্যবহার করে, বিশেষত @ নিক হোয়াইট এবং এই পৃষ্ঠাটির উত্তর সম্পর্কে @ সজিথের মন্তব্যটি সংযুক্ত করে: http://www.mrc-productivity.com/techblog/?p=1235

<form name="ignore_me" style="display:none">
    <input type="text" id="reloadValue" name="reloadValue" value="" />
</form>

$(function ()
{
    var date = new Date();
    var time = date.getTime();

    if ($("#reloadValue").val().length === 0)
    {
        $("#reloadValue").val(time);
    }
    else
    {
        $("#reloadValue").val("");
        window.location.reload();
    }
});

1

এখানে একটি jQuery সংস্করণ। যখন কোনও সাফারি ডেস্কটপ / মোবাইল ক্যাশে হ্যান্ডেল করে যখন কোনও ব্যবহারকারী পিছনের বোতামটি চাপায় তখন আমি এটি কয়েকবার ব্যবহার করার প্রয়োজনে পড়েছি।

$(window).bind("pageshow", function(event) {
    if (event.originalEvent.persisted) {
        // Loading from cache
    }
});

4
আমি যতদূর বলতে পারি ক্রোমে কাজ করতে দেখা যাচ্ছে না। আমি পৃষ্ঠাটিতে কীভাবে অ্যাক্সেস করি তা বিবেচনা না করেই একটি কনসোল.লগ কেবল অন্য বিবৃতিতে (পরীক্ষার জন্য যুক্ত) কেবল ট্রিগার হয়ে যায়।
লুক

0

আমি আজ একই ধরণের সমস্যায় পড়েছি এবং আমি এটি স্থানীয় স্টোরেজ দিয়ে সমাধান করেছি (এখানে কিছুটা jQuery দিয়ে):

$(function() {

    if ($('#page1').length) {
        // this code must only run on page 1

        var checkSteps = function () {
            if (localStorage.getItem('steps') == 'step2') {
                // if we are here, we know that:
                // 1. the user is on page 1
                // 2. he has been on page 2
                // 3. this function is running, which means the user has submitted the form
                // 4. but steps == step2, which is impossible if the user has *just* submitted the form
                // therefore we know that he has come back, probably using the back button of his browser
                alert('oh hey, welcome back!');
            } else {
                setTimeout(checkSteps, 100);
            }
        };

        $('#form').on('submit', function (e) {
            e.preventDefault();
            localStorage.setItem('steps', 'step1'); // if "step1", then we know the user has submitted the form
            checkOrderSteps();
            // ... then do what you need to submit the form and load page 2
        });
    }

    if ($('#page2').length) {
        // this code must only run on page 2
        localStorage.setItem('steps', 'step2');
    }

});

মূলত সি:

পৃষ্ঠা 1 এ, যখন ব্যবহারকারী ফর্মটি জমা দেয়, ব্যবহারকারী কী পদক্ষেপ নিয়েছে তা নির্দেশ করার জন্য আমরা লোকালস্টোরারে একটি মান "পদক্ষেপ" সেট করি। একই সময়ে, আমরা সময়সীমা সহ একটি ফাংশন চালু করি যা পরীক্ষা করে দেখবে যে এই মানটি পরিবর্তন হয়েছে (উদাহরণস্বরূপ 10 বার / সেকেন্ড)।

পৃষ্ঠায় 2, আমরা অবিলম্বে মান মান পরিবর্তন।

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

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