ব্যবহারকারী ব্রাউজারের ইতিহাসে ফিরে যেতে পারেন কিনা তা কীভাবে পরীক্ষা করবেন


151

আমি জাভাস্ক্রিপ্ট ব্যবহার করে ইতিহাস আছে কিনা তা দেখতে চাই, আমি বোঝাতে চাইছি যদি পিছনের বোতামটি ব্রাউজারে পাওয়া যায় কি না।


উত্তর:


119

সংক্ষিপ্ত উত্তর: আপনি পারবেন না।

প্রযুক্তিগতভাবে একটি সঠিক উপায় আছে, যা সম্পত্তিটি পরীক্ষা করবে:

history.previous

তবে এটি কাজ করবে না won't এই সঙ্গে সমস্যা হল অধিকাংশ ব্রাউজার এই একটি নিরাপত্তা লঙ্ঘন বিবেচনা করা হয় এবং সাধারণত ফেরৎ undefined

history.length

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

বিকল্প পাঠ

বেশিরভাগ সময় একটি লিঙ্ক যুক্ত হয় যা কল করে:

history.back();

অথবা

 history.go(-1);

এবং এটি কেবল প্রত্যাশা করা হয়েছে যে আপনি যদি ফিরে যেতে না পারেন তবে লিঙ্কটি ক্লিক করা কিছুই করে না।


এটি ভাল তথ্য, তবে এটি সমস্যার সমাধান করে না। এটি এমন কোনও কোডটি বিশদভাবে বর্ণনা করা উচিত যা কোনও ব্রাউজারে আসলে কাজ করে। সম্ভবত এমন একটি কোড যা প্রথমে আপনি ব্যবহার করছেন ব্রাউজারটি পরীক্ষা করে।
সান্টিয়াগো বেনাডাভিড 21

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

আমি কী বলতে চাই তার অর্থ কী? 'এর সাথে সমস্যাটি হ'ল বেশিরভাগ ব্রাউজারগুলিতে এটি একটি সুরক্ষা লঙ্ঘন হিসাবে বিবেচিত হয়' অন্য থ্রেডের অন্য একজন ব্যবহারকারীও উল্লেখ করেছেন যে ক্লায়েন্টের ব্রাউজারের ইতিহাস পেতে সক্ষম হওয়া সুরক্ষা লঙ্ঘন করছে, তবে ব্যাখ্যা দেয় না কেন যে। সুরক্ষা হুমকি কি কি কেউ উদাহরণ দিতে পারে?
কেভিন চন্দ্র 12

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

84

চেক করার আরও একটি উপায় রয়েছে - রেফারারটি পরীক্ষা করুন। প্রথম পৃষ্ঠায় সাধারণত একটি খালি রেফারার থাকবে ...

if (document.referrer == "") {
    window.close()
} else {
    history.back()
}

2
রেফারার গোপনীয়তার কারণে গোপন করা যেতে পারে।
কর্নেল

11
কোনও লিঙ্কের মাধ্যমে কোনও পৃষ্ঠা লোড করা না হলেও ঠিকানা বারে ইউআরএল প্রবেশ করে বা বুকমার্কটি লোড করা হলে রেফারার সর্বদা খালি থাকে। ব্রাউজার ট্যাব / উইন্ডো এর আগে অন্য পৃষ্ঠাটি লোড করার পরে, এই জাতীয় পৃষ্ঠাগুলির অবশ্যই একটি ইতিহাস থাকতে পারে!
ygoe

1
তবে মাল্টিপেজ ওয়েবসাইট জুড়ে নেভিগেশনের জন্য কার্যকর সমাধান
ড্যান

36
একটি নতুন উইন্ডো জোর করতে লক্ষ্য = "_ ফাঁকা" দিয়ে একটি উইন্ডো খোলা থাকলে কাজ করে না not ব্রাউজারের পিছনে বোতামটি কাজ করবে না, কিন্তু একটি document.referrer থাকবে
Mike_K

3
আপনি যদি কোনও সুরক্ষিত (এইচটিটিপিএস) পৃষ্ঠা থেকে কোনও অনিরাপদ পৃষ্ঠায় (এইচটিটিপি) আসছেন তবে এটি কাজ করবে না, কারণ এটি রেফারটিকে ছাপিয়ে যাবে।
কেভিন সীমানা

54

আমার কোডটি ব্রাউজারটিকে একটি পৃষ্ঠায় ফিরে যেতে দেয় এবং যদি এটি ব্যর্থ হয় তবে এটি একটি ফ্যালব্যাক url লোড করে। এটি হ্যাশট্যাগের পরিবর্তনগুলিও সনাক্ত করে।

যখন পিছনের বোতামটি উপলভ্য ছিল না, তখন ফলব্যাক url 500 এমএসের পরে লোড হবে, সুতরাং ব্রাউজারটিতে পূর্ববর্তী পৃষ্ঠাটি লোড করার জন্য পর্যাপ্ত সময় রয়েছে। ঠিক পরে ফ্যালব্যাক ইউআরএল লোড করার window.history.go(-1);ফলে ব্রাউজারটি ফ্যালব্যাক ইউআরএল ব্যবহার করবে, কারণ জেএস স্ক্রিপ্টটি এখনও থামেনি।

function historyBackWFallback(fallbackUrl) {
    fallbackUrl = fallbackUrl || '/';
    var prevPage = window.location.href;

    window.history.go(-1);

    setTimeout(function(){ 
        if (window.location.href == prevPage) {
            window.location.href = fallbackUrl; 
        }
    }, 500);
}

6
আমি মনে করি এটি সত্যিই প্রশ্নের হৃদয়কে নখ করে দেয়, কেন একজন ব্যক্তি কেন যত্ন নেন এবং নির্ভরযোগ্য পদ্ধতিতে এবং ধারাবাহিকভাবে এটি সম্পর্কে আসলে কী করা যায়।
ক্রিস মেরিসিক

1
ব্যাক-বোতামটি যেখানে থাকে ইউআরএল না নেওয়া পর্যন্ত এটি কাজ করে এবং ক্রোমের নতুন ট্যাবে এটি আটকে দেয়। ব্যাক-বোতামে ক্লিক করার ফলে খালি ট্যাবে পাঠানো হবে। :(
কার্লিংগেন

2
এটি ক্রোমের ডিফল্ট আচরণ। আপনি পৃষ্ঠাটি "পরিদর্শন" করেছেন chrome://newtabএবং এভাবে আপনি ইতিহাসে ফিরে যেতে পারেন।
পুনর্নির্ধারণ করুন

এটির সাথে যত্নশীল কারণ একটি ধীর নেটওয়ার্ক সংযোগের সাথে আপনি ফ্যালব্যাক ইউআরএলটিকে বেশ নিয়মিত আঘাত করবেন।
21

14

এখানে আমি এটি কীভাবে করেছি।

আমি বুলিয়ান সেট করতে 'পূর্ববর্তী লোড' ইভেন্টটি ব্যবহার করেছি । তারপরে আমি 'পূর্বেই লোড' চালিত হয় কিনা তা দেখার জন্য একটি সময়সীমা স্থির করেছিলাম।

var $window = $(window),
    $trigger = $('.select_your_link'),
    fallback = 'your_fallback_url';
    hasHistory = false;

$window.on('beforeunload', function(){
    hasHistory = true;
});

$trigger.on('click', function(){

    window.history.go(-1);

    setTimeout(function(){
        if (!hasHistory){
            window.location.href = fallback;
        }
    }, 200);

    return false;
});

বড় ব্রাউজারগুলিতে (এ পর্যন্ত পরীক্ষিত এফএফ, ক্রোম, আই 11) কাজ করার জন্য মনে হচ্ছে।


1
এটি এখন পর্যন্ত প্রশ্নের সেরা উত্তর। আপনি সহজেই প্রতিস্থাপন করতে পারেন window.location.href = fallbackসঙ্গে window.close()এবং এটি খুব কাজ করে।
ভিটানি

13

আমার প্রকল্পগুলিতে আমি একটি স্নিপেট ব্যবহার করি:

function back(url) {
    if (history.length > 2) {
        // if history is not empty, go back:
        window.History.back();
    } else if (url) {
        // go to specified fallback url:
        window.History.replaceState(null, null, url);
    } else {
        // go home:
        window.History.replaceState(null, null, '/');
    }
}

এফওয়াইআই: ব্রাউজারের ইতিহাস পরিচালনা করতে আমি ইতিহাস. js ব্যবহার করি ।


ইতিহাস 2 দৈর্ঘ্যের সাথে দৈর্ঘ্যের তুলনা কেন?

কারণ ক্রোমের শুরু পৃষ্ঠাটি ব্রাউজারের ইতিহাসে প্রথম আইটেম হিসাবে গণ্য করা হয়।


history.lengthব্যবহারকারীর আচরণের কয়েকটি সম্ভাবনা রয়েছে :

  • ব্যবহারকারী ব্রাউজারে নতুন খালি ট্যাব খুলবে এবং তারপরে একটি পৃষ্ঠা চালায়। history.length = 2এবং আমরা back()এই ক্ষেত্রে অক্ষম করতে চাই , কারণ ব্যবহারকারী খালি ট্যাবে যাবে।
  • ব্যবহারকারী এর আগে কোথাও একটি লিঙ্কে ক্লিক করে নতুন ট্যাবে পৃষ্ঠাটি খুলবে । history.length = 1এবং আবার আমরা back()পদ্ধতিটি অক্ষম করতে চাই ।
  • এবং পরিশেষে, ব্যবহারকারী কয়েকটি পৃষ্ঠা পুনরায় লোড করার পরে বর্তমান পৃষ্ঠায় অবতরণ করেhistory.length > 2এবং এখন back()সক্ষম করা যেতে পারে।

নোট: যখন ছাড়া বাহ্যিক ওয়েবসাইট থেকে লিঙ্কে ক্লিক করার পরে বর্তমান পৃষ্ঠাটি ব্যবহারকারী জমি আমি যদি বাদ target="_blank"

নোট 2: document.referrer আপনি ওয়েবসাইটটি ঠিকানাটি টাইপ করে ওপেন করার সময় এবং ওয়েবসাইট সাবপেজগুলি লোড করতে এজ্যাক্স ব্যবহার করার সময় খালি থাকে, তাই আমি প্রথম ক্ষেত্রে এই মানটি পরীক্ষা করা বন্ধ করে দিয়েছি।


এই পদ্ধতির আমার জন্য দুর্দান্ত কাজ করেছে। আমি আমার পাতাগুলির জন্য স্থির ফ্যালব্যাক ব্যাক লিঙ্কগুলি সঞ্চয় করি যা আমি ফালব্যাকে ব্যবহার করি।
গ্রেগ ব্লাস

তবে, আপনি যদি ফিরে যান, ইতিহাসের দৈর্ঘ্য পরিবর্তন হবে না .. সুতরাং, এটি সঠিকভাবে কাজ করে না
সিপরিয়ান মোকানু

দুর্ভাগ্যক্রমে আপনারা ঠিক বলেছেন আমি এই স্নিপেটটি কেবল "এক-পদক্ষেপ ব্যাক" কাঠামোর সাথে ব্যবহার করি ...
গ্রেগমেটিস

12

এই কৌশলটি মনে হচ্ছে:

function goBackOrClose() {  

    window.history.back();
    window.close(); 

    //or if you are not interested in closing the window, do something else here
    //e.g. 
    theBrowserCantGoBack();

}

কল করুন ইতিহাস.ব্যাক () এবং তারপরে উইন্ডো.ক্লোজ ()। ব্রাউজারটি যদি ইতিহাসে ফিরে যেতে সক্ষম হয় তবে এটি পরবর্তী বিবৃতিতে যেতে সক্ষম হবে না। যদি এটি পিছনে যেতে সক্ষম না হয় তবে এটি উইন্ডোটি বন্ধ করে দেবে।

তবে দয়া করে মনে রাখবেন যে url টাইপ করে পৃষ্ঠাটি পৌঁছেছে তবে ফায়ারফক্স স্ক্রিপ্টটি উইন্ডোটি বন্ধ করার অনুমতি দেবে না।


3
আমি খুঁজে পেয়েছি যে আমি কয়েকশ মিলি সেকেন্ডের বিলম্বের সাথে একটি সেটটাইমআউট বা পরবর্তী বিবৃতিটি চালানোর চেষ্টা করার আগে ব্যবহার না করে এটি কার্যকর হয় না, অন্যথায় এটি ইতিহাস চালানোর পরে চলবে'll ব্যাক ()
কেন ফেহলিং ২r

আমি ব্যক্তিগতভাবে এটি অভিজ্ঞতা অর্জন করতে পারি নি, এটি কোন ব্রাউজারটি ছিল?
xtrahelp.com

আমি নীচের উত্তরে সেটটাইমআউট ফাংশন দিয়ে দুর্দান্ত কাজ করেছি। উদা: সেটটাইমআউট (ফাংশন () {উইন্ডো.ক্লোজ ()}, 400);
গিলক্রিস

2
window.close()অনেক আধুনিক ব্রাউজার দ্বারা এটি সুরক্ষা ঝুঁকি হিসাবে বিবেচিত। কেউ কেউ আপনাকে এটি করতে দেয় না।
রুডি কারশওয়া

উইন্ডো হিস্টরি.ব্যাক () এর পরে আপনি কিছু করতে পারেন; window.close ();
হরিসজ্জামান ২

10

সাবধানতা অবলম্বন করুন window.history.lengthকারণ এটিতে এন্ট্রিও অন্তর্ভুক্ত রয়েছেwindow.history.forward()

সুতরাং আপনার window.history.length1 টিরও বেশি এন্ট্রি থাকতে পারে তবে ইতিহাসের পিছনে কোনও এন্ট্রি নেই। এর অর্থ এই যে আপনি গুলি চালালে কিছুই হয় নাwindow.history.back()


9

পিছনের বোতামটি ব্যবহারযোগ্য কিনা তা আপনি সরাসরি পরীক্ষা করতে পারবেন না। আপনি তাকান করতে পারেন history.length>0, কিন্তু যদি সেখানে পৃষ্ঠাগুলি আছে যে সত্য রাখা হবে এগিয়ে বর্তমান পৃষ্ঠার হিসাবে ভাল। আপনি কেবল তখনই নিশ্চিত হতে পারেন যে পিছনের বোতামটি কখন ব্যবহারযোগ্য history.length===0

যদি এটি পর্যাপ্ত পরিমাণে না হয় তবে আপনি যা করতে পারেন তার সব থেকে কল is history.back()এবং যদি আপনার পৃষ্ঠাটি পরেও লোড হয় তবে পিছনের বোতামটি উপলভ্য নয়! অবশ্যই তার মানে যদি ব্যাক বোতাম হয় উপলব্ধ করুন, আপনার শুধু দূরে পাতা থেকে নেভিগেট গেছেন। আপনাকে নেভিগেশনটি বাতিল করতে দেওয়া হচ্ছে না onunload, সুতরাং পিছনে পিছনে থামার জন্য onbeforeunloadযা কিছু করা যায় তা হ'ল কিছু থেকে ফিরে আসা , যার ফলে একটি বড় বিরক্তিকর প্রম্পট উপস্থিত হবে। এটা মূল্য নয়।

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


2
দৈর্ঘ্য সম্পর্কিত - এমনকি সমস্ত ব্রাউজারে না। কিছু ব্রাউজার বর্তমান পৃষ্ঠাটিকে ইতিহাসের আইটেম হিসাবে গণনা করে এবং শুরু হয় 1. আপনার ব্রাউজার সনাক্তকরণ অন্তর্ভুক্ত করতে হবে।
ম্যাকএডেন

আসলে আমি ভেবেছি সবসময় 1! 0একটি brainfart ছিল, আমি ভেবেছিলাম ব্রাউজার সবসময় নেবে 1বা তার বেশি। অপেরা এবং আইই শুরু করে অন্যথায় — ভাল ক্যাচ।
বোবিনস

1
"ইতিহাসের নেভিগেশন ব্রাউজার ক্রোমের জন্য, ওয়েব পৃষ্ঠাগুলির জন্য নয়" - স্বীকৃত
ব্রায়ান

5

history.lengthএটি ব্যবহারহীন যেহেতু এটি ব্যবহারকারী ইতিহাসে ফিরে যেতে পারে কিনা তা দেখায় না। এছাড়াও বিভিন্ন ব্রাউজার প্রাথমিক মান 0 বা 1 ব্যবহার করে - এটি ব্রাউজারের উপর নির্ভর করে।

কার্যক্ষম সমাধানটি $(window).on('beforeunload'ইভেন্টটি ব্যবহার করা , তবে আমি নিশ্চিত নই যে পৃষ্ঠাটি এজ্যাক্সের মাধ্যমে লোড করা হয় এবং উইন্ডোটির ইতিহাস পরিবর্তন করতে পুসস্টেট ব্যবহার করা হলে এটি কাজ করবে।

সুতরাং আমি পরবর্তী সমাধান ব্যবহার করেছি:

var currentUrl = window.location.href;
window.history.back();
setTimeout(function(){
    // if location was not changed in 100 ms, then there is no history back
    if(currentUrl === window.location.href){
        // redirect to site root
        window.location.href = '/';
    }
}, 100);

আমার জন্য এইভাবে কাজ করে: ফাংশন goBackOrTo (টার্গেটআরল) {কারেন্টুআরএল = উইন্ডো.লোকেশন.ইরেফ; window.history.go (-1); সেটটাইমআউট (ফাংশন () {// যদি 800 এমএসে অবস্থান পরিবর্তন না করা হয়, তবে কোনও ইতিহাস ফিরে আসবে না যদি (বর্তমান ইউআরএল === উইন্ডো.লোকেশন.href) {// সাইট রুট উইন্ডোতে পুনর্নির্দেশ করুন.লোকেশন.href = টার্গেটআরল; }}, 800); }
alfonx

2

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

var goBack = function goBack(fallback){
    var useFallback = true;

    window.addEventListener("beforeunload", function(){
      useFallback = false;
    });

    window.history.back();

    setTimeout(function(){
        if (useFallback){ window.location.href = fallback; }
    }, 100); 
}

আপনি এই ফাংশনটি কল করে কল করতে পারেন goBack("fallback.example.org")


1
আমি এটি সর্বাধিক পছন্দ করি, আমি কেবল windows.onbeforeunloadইভেন্ট শ্রোত্রে পরিবর্তিত হয়েছি window.addEventListener("beforeunload", function (event) { useFallback = false; });যাতে এটি উইন্ডোটি ওভাররাইট না করে।
MiChAeLoKGB 14

2

উত্তর এখানে এবং এখানে বিল্ডিং । আমি মনে করি, আরও চূড়ান্ত উত্তরটি হ'ল এটি কোনও নতুন ট্যাবে কোনও নতুন পৃষ্ঠা কিনা তা যাচাই করা।

পৃষ্ঠার ইতিহাস যদি একের বেশি হয় তবে আমরা বর্তমান পৃষ্ঠার আগের পৃষ্ঠায় ফিরে যেতে পারি। যদি তা না হয় তবে ট্যাবটি একটি নতুন খোলা ট্যাব এবং আমাদের একটি নতুন ট্যাব তৈরি করতে হবে।

পৃথকভাবে, যুক্ত উত্তরগুলির সাথে, আমরা referrerএকটি নতুন ট্যাবে এখনও একটি রেফারার হিসাবে পরীক্ষা করব না ।

if(1 < history.length) {
    history.back();
}
else {
    window.close();
}

1
ধন্যবাদ. আপনি আমার দিন সংরক্ষণ করেছেন :)।
বিজয় যাদব

1

আরও একটি নিখুঁত সমাধান রয়েছে যা অন্য এসও উত্তর থেকে নেওয়া :

if( (1 < history.length) && document.referrer ) {
    history.back();
}
else {
    // If you can't go back in history, you could perhaps close the window ?
    window.close();
}

কেউ রিপোর্ট করেছেন যে এটি ব্যবহার করার সময় এটি কাজ করে না target="_blank"তবে মনে হয় এটি Chrome এ আমার জন্য কাজ করে।


0

ব্রাউজারের পিছনে এবং ফরোয়ার্ড বোতাম রয়েছে। আমি এই প্রশ্নের একটি সমাধান হাজির। তবে এটি ব্রাউজারের ফরোয়ার্ড ক্রিয়াকে প্রভাবিত করবে এবং কিছু ব্রাউজারের সাথে বাগ তৈরি করবে।

এটি এর মতোই কাজ করে: ব্রাউজার যদি কোনও নতুন ইউআরএল খোলায়, যা কখনই খোলেনি, ইতিহাসের দৈর্ঘ্য বৃদ্ধি পাবে।

যাতে আপনি হ্যাশ মত পরিবর্তন করতে পারেন

  location.href = '#__transfer__' + new Date().getTime() 

কখনও না দেখানো ইউআরএল পাওয়ার জন্য ইতিহাসের দৈর্ঘ্যটি আসল দৈর্ঘ্য পাবে।

  var realHistoryLength = history.length - 1

তবে, এটি সর্বদা ভাল কাজ করে না এবং কেন জানি না, বিশেষত যখন ইউআরএল অটো দ্রুত লাফায়।


0

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

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

সমাধানটি ছিল, অ্যাপ্লিকেশনটি লোড হওয়ার সাথে সাথে আমি কেবল ইতিহাসের স্থিতিতে একটি প্রতিস্থাপন করেছি:

history.replaceState( {root: true}, '', window.location.pathname + window.location.hash)

এইভাবে, history.state.rootফিরে যাবার আগে আমাকে কেবল চেক করা দরকার । যদি সত্য হয়, আমি পরিবর্তে একটি ইতিহাস তৈরি করব:

if(history.state && history.state.root)
    history.replaceState( {root: true}, '', '/')
else
    history.back() 

আমি মনে করি না যে আরও ভাল ব্যবহারের ক্ষেত্রে আছে। আপনি যদি আপনার অ্যাপের বাইরের ইতিহাসটি পরীক্ষা করতে চান তবে এটি কোনও ভাল ধারণা নয়।
ম্যাক্সওয়েল এসসি

-1
var fallbackUrl = "home.php";
if(history.back() === undefined)
    window.location.href = fallbackUrl;

এটা দুর্দান্ত দেখায় ?! এটি বিভিন্ন ব্রাউজারে পরীক্ষা করা হয়?
বেনজকিজি

Chrome এ history.back()হল undefinedশুধুমাত্র ফাঁকা ট্যাব পৃষ্ঠায়
gregmatys

-2

সমাধান

'use strict';
function previousPage() {
  if (window.location.pathname.split('/').filter(({ length }) => length > 0).length > 0) {
    window.history.back();
  }
}

Explaination

window.location.pathnameআপনাকে বর্তমান ইউআরআই দেবে। উদাহরণস্বরূপ https://domain/question/1234/i-have-a-problemদিতে হবে /question/1234/i-have-a-problem। আরও তথ্যের জন্য উইন্ডো.লোকশন সম্পর্কে ডকুমেন্টেশন দেখুন ।

এরপরে, কলটি split()আমাদের সেই ইউআরআইয়ের সমস্ত টুকরো দেবে। সুতরাং আমরা যদি আমাদের আগের ইউআরআই নিই তবে আমাদের মতো কিছু হবে ["", "question", "1234", "i-have-a-problem"]। আরও তথ্যের জন্য স্ট্রিং.প্রোটোটাইপ.স্প্লিট () সম্পর্কে ডকুমেন্টেশন দেখুন ।

filter()পিছনে স্ল্যাশ দ্বারা উত্পন্ন খালি স্ট্রিংটি ফিল্টার করার জন্য কলটি এখানে is এটি মূলত কেবলমাত্র টুকরোটি ইউআরআইকে ফিরিয়ে দেবে যার দৈর্ঘ্য 1 এর চেয়ে বেশি (অ-খালি স্ট্রিং) থাকবে। সুতরাং আমরা কিছু আছে["question", "1234", "i-have-a-question"] । এটি এভাবে লিখতে পারত:

'use strict';
window.location.pathname.split('/').filter(function(fragment) {
  return fragment.length > 0;
});

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

এখন, যদি ব্যবহারকারী চালু থাকা অবস্থায় ফিরে যাওয়ার চেষ্টা করে https://domain/, আমরা যদি ইফ-বিবৃতিটি ট্রিগার করব না, এবং window.history.back()পদ্ধতিটি ট্রিগার করব না যাতে ব্যবহারকারী আমাদের ওয়েবসাইটে থাকবে। এই URL টির সমান হবে []যার দৈর্ঘ্য রয়েছে 0এবং 0 > 0এটি মিথ্যা। অতএব, নিঃশব্দে ব্যর্থ। অবশ্যই, আপনি কিছু লগ করতে পারেন বা আপনি চাইলে অন্য ক্রিয়া করতে পারেন।

'use strict';
function previousPage() {
  if (window.location.pathname.split('/').filter(({ length }) => length > 0).length > 0) {
    window.history.back();
  } else {
    alert('You cannot go back any further...');
  }
}

সীমাবদ্ধতা

অবশ্যই, ব্রাউজারটি হিস্ট্রি এপিআই সমর্থন না করলে এই সমাধান কাজ করবে না । এই সমাধানটি ব্যবহার করার আগে ডকুমেন্টেশন সম্পর্কে আরও জানার জন্য এটি পরীক্ষা করুন।


-5

আমি নিশ্চিত না যে এটি কাজ করে এবং এটি সম্পূর্ণরূপে অনির্ধারিত হয়েছে তবে এটি চেষ্টা করুন:

<script type="text/javascript">

    function goBack() {
        history.back();
    }

    if (history.length > 0) { //if there is a history...
        document.getElementsByTagName('button')[].onclick="goBack()"; //assign function "goBack()" to all buttons onClick
    } else {
        die();
    }
</script>

এবং কোথাও এইচটিএমএল:

<button value="Button1"> //These buttons have no action
<button value="Button2">

সম্পাদনা করুন:

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


2
history.backএকটি ফাংশন। যদি চেক করতে চান history.length > 0যদি এটা দিয়ে ফিরে যান তাহলেhistory.back()
pixl সংকেতপদ্ধতিরচয়িতা

3
এছাড়াও []একটি NodeList কোন জ্ঞান করে তোলে, এবং আপনি একটি ইভেন্ট হ্যান্ডলার করার জন্য একটি স্ট্রিং ধার্য করতে পারবেন না।
বোবিনস

-8

window.history.length0 এর সমান কিনা তা পরীক্ষা করে দেখুন ।


6
কোনও ভাল উপায় নয়, যেহেতু ইতিহাস. দৈর্ঘ্য আপনি ইতিহাসে কোথায় আছেন তা আপনাকে জানায় না ...
রন রিটার

@ রন রিটার: হ্যাঁ, আমি মনে করি এই প্রশ্নের শীর্ষস্থানীয় উত্তর এবং অন্যান্য মন্তব্যগুলি ইতিমধ্যে এটি এক বছরেরও বেশি আগে প্রতিষ্ঠিত করেছিল ...
ক্রিশ্চিয়ান সানচেজ
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.