ইতিহাস.পুষ্পস্টেটের মাধ্যমে কীভাবে ইতিহাসের পরিবর্তনগুলি সম্পর্কে অবহিত করা যায়?


154

তাই এখন যে এইচটিএমএল 5 history.pushStateব্রাউজারগুলির ইতিহাস পরিবর্তন করার জন্য পরিচয় করিয়েছে , ওয়েবসাইটগুলি এটি ইউআরএল এর খণ্ড সনাক্তকারীকে পরিবর্তনের পরিবর্তে এজাক্সের সাথে মিশ্রণে ব্যবহার শুরু করে।

দুঃখের সাথে এর অর্থ এই যে এই কলগুলি আর সনাক্ত করা যায় না onhashchange

আমার প্রশ্নটি: কোনও ওয়েবসাইট কখন ব্যবহার করে তা সনাক্ত করার কোনও নির্ভরযোগ্য উপায় (হ্যাক ?;) রয়েছে history.pushState? উত্থাপিত ইভেন্টগুলি সম্পর্কে স্পেসিফিকেশনটিতে কিছু লেখা নেই (কমপক্ষে আমি কিছুই খুঁজে পাইনি)।
আমি একটি মুখোমুখী তৈরি করার চেষ্টা করেছি এবং window.historyআমার নিজের জাভাস্ক্রিপ্ট অবজেক্টটি প্রতিস্থাপন করেছি, তবে এটির কোনও প্রভাব ছিল না।

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

হালনাগাদ:

এখানে একটি জিসফিল (ফায়ারফক্স 4 বা ক্রোম 8 ব্যবহার করুন) দেখায় যে onpopstateযখন pushStateডাকা হয় তখন ট্রিগার হয় না (বা আমি কিছু ভুল করছি? এটি উন্নত করতে নির্দ্বিধায়!))

আপডেট 2:

আর একটি (পার্শ্ব) সমস্যা হ'ল এটি window.locationব্যবহার করার সময় আপডেট হয় না pushState(তবে আমি ইতিমধ্যে এটি সম্পর্কে এখানে পড়ে আমার মনে হয়)।

উত্তর:


194

5.5.9.1 ইভেন্ট সংজ্ঞা

Popstate ঘটনা নির্দিষ্ট ক্ষেত্রে বহিস্কার করা হয় যখন একটি সেশন জন্য ইতিহাস এন্ট্রি নেভিগেট।

এর মতে, আপনি যখন ব্যবহার করবেন তখন পপস্টেট বরখাস্ত করার কোনও কারণ নেই pushState। তবে একটি ইভেন্ট যেমন pushstateকাজে আসবে। যেহেতু historyএকটি হোস্ট অবজেক্ট, আপনার এটির প্রতি যত্নবান হওয়া উচিত তবে ফায়ারফক্স এই ক্ষেত্রে দুর্দান্ত বলে মনে হচ্ছে। এই কোডটি ঠিক কাজ করে:

(function(history){
    var pushState = history.pushState;
    history.pushState = function(state) {
        if (typeof history.onpushstate == "function") {
            history.onpushstate({state: state});
        }
        // ... whatever else you want to do
        // maybe call onhashchange e.handler
        return pushState.apply(history, arguments);
    };
})(window.history);

আপনার jsfiddle হয়ে যায় :

window.onpopstate = history.onpushstate = function(e) { ... }

আপনি window.history.replaceStateএকইভাবে বানর-প্যাচ করতে পারেন ।

দ্রষ্টব্য: অবশ্যই আপনি onpushstateকেবল বিশ্বব্যাপী অবজেক্টে যুক্ত করতে পারেন এবং আপনি এটির মাধ্যমে আরও ইভেন্টগুলি পরিচালনা করতে পারেনadd/removeListener


আপনি বলেছিলেন আপনি পুরো historyবিষয়টিকে প্রতিস্থাপন করেছেন । এই ক্ষেত্রে অপ্রয়োজনীয় হতে পারে।
gblazex

@ গালাম্বালাজস: হ্যাঁ সম্ভবত হতে পারে (জানেন না) window.historyকেবল পঠনযোগ্য তবে ইতিহাসের সামগ্রীর বৈশিষ্ট্যগুলি নয় ... এই সমাধানের জন্য একটি গুচ্ছ ধন্যবাদ :)
ফেলিক্স ক্লিং

অনুমান অনুসারে একটি "পেজট্রান্সশন" ইভেন্ট রয়েছে, এটি এখনও কার্যকর হয় নি বলে মনে হয়।
মোহাম্মদ মনসুর

2
@ ব্যবহারকারী280109 - আমি জানতাম যদি আমি জানতাম would :) আমি মনে করি অপেরা এটিমে এটি করার কোনও উপায় নেই।
gblazex

1
@cprcrack এটি বিশ্বব্যাপী সুযোগ পরিষ্কার রাখার জন্য। pushStateপরে ব্যবহারের জন্য আপনাকে নেটিভ পদ্ধতিটি সংরক্ষণ করতে হবে। : তাই একটি বিশ্বব্যাপী পরিবর্তনশীল পরিবর্তে আমি একজন IIFE মধ্যে পুরো কোড encapsulate করতে বেছে নেওয়া হয়েছে en.wikipedia.org/wiki/Immediately-invoked_function_expression
gblazex

4

আমি এটি ব্যবহার করতাম:

var _wr = function(type) {
    var orig = history[type];
    return function() {
        var rv = orig.apply(this, arguments);
        var e = new Event(type);
        e.arguments = arguments;
        window.dispatchEvent(e);
        return rv;
    };
};
history.pushState = _wr('pushState'), history.replaceState = _wr('replaceState');

window.addEventListener('replaceState', function(e) {
    console.warn('THEY DID IT AGAIN!');
});

এটি প্রায় গ্যালামবালাজের মতোই।

যদিও এটি সাধারণত ওভারকিল হয়। এবং এটি সমস্ত ব্রাউজারে কাজ নাও করতে পারে। (আমি কেবল আমার ব্রাউজারের সংস্করণ সম্পর্কে যত্নশীল))

(এবং এটি একটি ভার ছেড়ে যায় _wr, তাই আপনি এটি বা অন্য কোনও জিনিস মুছতে চাইতে পারেন I আমি সে সম্পর্কে চিন্তা করি নি))


4

অবশেষে এটি করার জন্য "সঠিক" উপায়টি পেয়ে গেল! এটির জন্য আপনার এক্সটেনশনে একটি বিশেষাধিকার যুক্ত করা এবং পটভূমি পৃষ্ঠা (কেবল একটি সামগ্রী স্ক্রিপ্ট নয়) ব্যবহার করা দরকার, তবে এটি কার্যকর হয়।

আপনি যে ইভেন্টটি চান তা হ'ল browser.webNavigation.onHistoryStateUpdated, যখন কোনও পৃষ্ঠা historyইউআরএল পরিবর্তন করতে API ব্যবহার করে fired এটি কেবলমাত্র সেই সাইটের জন্যই আগুন দেয় যা আপনার অ্যাক্সেস করার অনুমতি পেয়েছে এবং আপনার যদি প্রয়োজন হয় তবে আপনি স্প্যামে আরও কাটাতে একটি URL ফিল্টারও ব্যবহার করতে পারেন। এটির জন্য webNavigationঅনুমতি (এবং অবশ্যই প্রাসঙ্গিক ডোমেন (গুলি) এর জন্য হোস্টের অনুমতি প্রয়োজন)।

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


2

আপনি window.onpopstateইভেন্ট বাঁধতে পারে ?

https://developer.mozilla.org/en/DOM%3awindow.onpopstate

ডক্স থেকে:

উইন্ডোতে পপস্টেট ইভেন্টের জন্য একটি ইভেন্ট হ্যান্ডলার।

সক্রিয় ইতিহাসের এন্ট্রি পরিবর্তন হওয়ার সাথে সাথে একটি পপস্টেট ইভেন্ট উইন্ডোতে প্রেরণ করা হয়। সক্রিয় হওয়া ইতিহাসের এন্ট্রি যদি ইতিহাস.pushState () এর কল দ্বারা তৈরি করা হয়েছিল বা ইতিহাস.রেপসস্টেট () -এর কল দ্বারা প্রভাবিত হয়েছিল, তবে পপস্টেট ইভেন্টের রাষ্ট্রীয় সম্পত্তিতে ইতিহাসের প্রবেশের রাজ্য অবজেক্টের একটি অনুলিপি থাকে।


6
আমি এটি ইতিমধ্যে চেষ্টা করেছি এবং যখন ব্যবহারকারীরা ইতিহাসে (বা কোনও history.go, .back) ফাংশনগুলি ডাকা হয় তখনই ইভেন্টটি ট্রিগার হয়। তবে না pushState। এখানে এটি পরীক্ষা করার জন্য আমার চেষ্টা করা হয়েছে, সম্ভবত আমি কিছু ভুল করেছি: jsfiddle.net/fkling/vV9vd এটি কেবলমাত্র সেভাবেই সম্পর্কিত বলে মনে হয় যে ইতিহাসটি যদি পরিবর্তিত হয় pushState, তবে অন্যান্য পদ্ধতিগুলির সাথে সম্পর্কিত রাষ্ট্রের অবজেক্ট ইভেন্ট হ্যান্ডলারের কাছে প্রেরণ করা হয় ডাকল.
ফেলিক্স ক্লিং

1
আহ। সেক্ষেত্রে কেবলমাত্র আমি ভাবতে পারি ইতিহাসের স্ট্যাকের দৈর্ঘ্যটি দেখার জন্য একটি সময়সীমা নিবন্ধন করা এবং যদি স্ট্যাকের আকারটি পরিবর্তিত হয় তবে কোনও ইভেন্ট চালানো event
স্টেফ

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

প্রতিটি ক্লিকে ইতিহাসের স্টিকের দৈর্ঘ্য পরীক্ষা করা এমনকি যথেষ্ট হতে পারে।
ফেলিক্স ক্লিং 9

1
হ্যাঁ - যে কাজ করবে। আমি এটির সাথে একটি নাটক করছি - একটি সমস্যা হ'ল প্রতিস্থাপন কল যা কোনও ইভেন্ট নিক্ষেপ করবে না কারণ স্ট্যাকের আকার পরিবর্তন হত না।
স্টেফ

1

যেহেতু আপনি কোনও ফায়ারফক্স অ্যাডোন সম্পর্কে জিজ্ঞাসা করছেন, তাই কোডটি এখানে কাজ করতে পেল। ব্যবহার unsafeWindowহয় আর সুপারিশ বেরিয়ে যখন pushState পরিবর্তিত হওয়ার পর একটি ক্লায়েন্ট স্ক্রিপ্ট থেকে বলা হয় ত্রুটি:

সম্পত্তি ইতিহাসের ইতিহাস অ্যাক্সেসের অনুমতি অস্বীকার করা হয়েছে .পুষস্টেট

পরিবর্তে, এক্সপোর্টফানশন নামে একটি এপিআই রয়েছে যা ফাংশনটিকে এভাবে ইনজেকশনের অনুমতি দেয় window.history:

var pushState = history.pushState;

function pushStateHack (state) {
    if (typeof history.onpushstate == "function") {
        history.onpushstate({state: state});
    }

    return pushState.apply(history, arguments);
}

history.onpushstate = function(state) {
    // callback here
}

exportFunction(pushStateHack, unsafeWindow.history, {defineAs: 'pushState', allowCallbacks: true});

শেষ লাইনে আপনার পরিবর্তন unsafeWindow.history,করা উচিত window.history। এটি আমার পক্ষে অনিরাপদ উইন্ডো নিয়ে কাজ করছে না।
লিন্ডসে-নিডস-ঘুম

0

galambalazs এর উত্তর বানরের প্যাচগুলি window.history.pushStateএবং window.history.replaceStateতবে কোনও কারণে এটি আমার পক্ষে কাজ বন্ধ করে দিয়েছে। এখানে এমন বিকল্প রয়েছে যা ততটা সুন্দর নয় কারণ এটি পোলিং ব্যবহার করে:

(function() {
    var previousState = window.history.state;
    setInterval(function() {
        if (previousState !== window.history.state) {
            previousState = window.history.state;
            myCallback();
        }
    }, 100);
})();

ভোটদানের বিকল্প আছে কি?
সুপারউবারডুপার

@ সুপারউবারডুপার: অন্যান্য উত্তরগুলি দেখুন।
Flimm

@ ফ্লিম পোলিং ভাল নয়, তবে কুৎসিত। তবে ভাল, আপনি বলেছিলেন পছন্দ ছিল না।
ইয়ারোপ্রো

এটি বানরের প্যাচিংয়ের চেয়ে অনেক ভাল, বানরের প্যাচিংটি অন্য স্ক্রিপ্টের মাধ্যমে পূর্বাবস্থায় ফেলা যায় এবং আপনি এটি সম্পর্কে কোনও বিজ্ঞপ্তি পান।
ইভান ক্যাসেলেলানোস

0

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

আমি নিশ্চিত nsIWebProgressListenerফিরে এসেছিলাম তখন আমি আশ্চর্য হয়েছি কেউই এর উল্লেখ করেনি।

একটি ফ্রেমস্ক্রিপ্ট থেকে (e10s এর সামঞ্জস্যের জন্য):

let webProgress = docShell.QueryInterface(Ci.nsIInterfaceRequestor).getInterface(Ci.nsIWebProgress);
webProgress.addProgressListener(this, Ci.nsIWebProgress.NOTIFY_STATE_WINDOW | Ci.nsIWebProgress.NOTIFY_LOCATION);

তারপরে শুনছি onLoacationChange

onLocationChange: function onLocationChange(webProgress, request, locationURI, flags) {
       if (flags & Ci.nsIWebProgressListener.LOCATION_CHANGE_SAME_DOCUMENT

এটি স্পষ্টতই সমস্ত পুশস্টেটকে ধরবে। তবে একটি মন্তব্যে সতর্কতা রয়েছে যে এটি "পুসস্টেটের জন্য ALSO ট্রিগার করে"। সুতরাং এটি কেবল পুস্টস্টেট স্টাফ নিশ্চিত করার জন্য আমাদের আরও কিছু ফিল্টারিং করতে হবে।

ভিত্তিক: https://github.com/jgraham/gecko/blob/55d8d9aa7311386ee2dabfccb481684c8920a527/toolkit/modules/addons/WebNavication.jsm#L18

এবং: সংস্থান: //gre/modules/WebNavicationContent.js


আমি ভুল না হলে মন্তব্যটির সাথে এই উত্তরটির কোনও যোগসূত্র নেই। ওয়েবপ্রোগ্রেসলিস্টেনারগুলি এফএফ এক্সটেনশনের জন্য? এই প্রশ্নটি এইচটিএমএল 5 ইতিহাস সম্পর্কে
ক্লোর

@ ক্লোয়ার দয়া করে এই মন্তব্যগুলি মুছে ফেলতে দিন
নোটিডার্ট ২

0

ভাল, আমি এর pushStateসম্পত্তি প্রতিস্থাপনের অনেক উদাহরণ দেখতে পাচ্ছি historyতবে আমি নিশ্চিত নই যে এটি একটি ভাল ধারণা, আমি ইতিহাসের অনুরূপ এপিআইয়ের ভিত্তিতে একটি পরিষেবা ইভেন্ট তৈরি করতে পছন্দ করব যেভাবে আপনি কেবল রাষ্ট্রকে ঠেলাঠেলি করতে পারবেন না তবে রাষ্ট্রকে প্রতিস্থাপন করতে পারবেন পাশাপাশি এবং এটি বৈশ্বিক ইতিহাস এপিআই-তে নির্ভর করে না এমন আরও অনেকগুলি বাস্তবায়নের জন্য দরজা উন্মুক্ত করে। নিম্নলিখিত উদাহরণ পরীক্ষা করুন:

function HistoryAPI(history) {
    EventEmitter.call(this);
    this.history = history;
}

HistoryAPI.prototype = utils.inherits(EventEmitter.prototype);

const prototype = {
    pushState: function(state, title, pathname){
        this.emit('pushstate', state, title, pathname);
        this.history.pushState(state, title, pathname);
    },

    replaceState: function(state, title, pathname){
        this.emit('replacestate', state, title, pathname);
        this.history.replaceState(state, title, pathname);
    }
};

Object.keys(prototype).forEach(key => {
    HistoryAPI.prototype = prototype[key];
});

আপনার যদি EventEmitterসংজ্ঞাটির প্রয়োজন হয় তবে উপরের কোডটি নোডজেএস ইভেন্ট ইমিটারের উপর ভিত্তি করে: https://github.com/nodejs/node/blob/36732084db9d0ff59b6ce31e839450cd91a156be/lib/events.jsutils.inheritsবাস্তবায়ন এখানে পাওয়া যাবে: https://github.com/nodejs/node/blob/36732084db9d0ff59b6ce31e839450cd91a156be/lib/util.js#L970


আমি অনুরোধ করা তথ্য দিয়ে আমার উত্তরটি সম্পাদনা করেছি, দয়া করে চেক করুন!
ভিক্টর কুইরোজ

@ ভিক্টর কিউইরোজ এটি ফাংশনগুলি সজ্জিত করার জন্য একটি দুর্দান্ত এবং পরিষ্কার ধারণা। তবে যদি কোনও তৃতীয় অংশের লাইব্রেরি পুশস্টেটের জন্য কল করে তবে আপনার হিস্টোরিপিটি অবহিত হবে না।
ইয়ারোপ্রো

0

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

function eventedPushState(state, title, url) {
    var pushChangeEvent = new CustomEvent("onpushstate", {
        detail: {
            state,
            title,
            url
        }
    });
    document.dispatchEvent(pushChangeEvent);
    return history.pushState(state, title, url);
}

document.addEventListener(
    "onpushstate",
    function(event) {
        console.log(event.detail);
    },
    false
);

eventedPushState({}, "", "new-slug"); 

0

@Bblazex প্রদত্ত সমাধানের ভিত্তিতে , আপনি যদি একই পদ্ধতি অনুসরণ করতে চান তবে তীর ফাংশন ব্যবহার করে আপনার জাভাস্ক্রিপ্ট যুক্তিতে নীচের উদাহরণটি অনুসরণ করুন:

private _currentPath:string;    
((history) => {
          //tracks "forward" navigation event
          var pushState = history.pushState;
          history.pushState =(state, key, path) => {
              this._notifyNewUrl(path);
              return pushState.apply(history,[state,key,path]); 
          };
        })(window.history);

//tracks "back" navigation event
window.addEventListener('popstate', (e)=> {
  this._onUrlChange();
});

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

  private _notifyNewUrl (key:string = window.location.pathname): void {
    this._path=key;
    // trigger whatever you need to do on url changes
    console.debug(`current query: ${this._path}`);
  }

0

যেহেতু আমি সবেমাত্র নতুন ইউআরএল চেয়েছিলাম, আমি এটি পেতে @gblazex এবং @ অ্যালবার্টো এস এর কোডগুলি রূপান্তর করেছি:

(function(history){

  var pushState = history.pushState;
    history.pushState = function(state, key, path) {
    if (typeof history.onpushstate == "function") {
      history.onpushstate({state: state, path: path})
    }
    pushState.apply(history, arguments)
  }
  
  window.onpopstate = history.onpushstate = function(e) {
    console.log(e.path)
  }

})(window.history);

0

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

function historyEventHandler(state){ 
    // your stuff here
} 

window.onpopstate = history.onpushstate = historyEventHandler

function pushHistory(...args){
    history.pushState(...args)
    historyEventHandler(...args)
}
<button onclick="pushHistory(...)">Go to happy place</button>

লক্ষ্য করুন যে অন্য কোনও কোড যদি দেশীয় পুশস্টেট ফাংশন ব্যবহার করে তবে আপনি কোনও ইভেন্ট ট্রিগার পাবেন না (তবে যদি এটি হয় তবে আপনার কোডটি পরীক্ষা করা উচিত)


-5

মান হিসাবে বলা হয়েছে:

মনে রাখবেন যে কেবল ইতিহাস.পুশস্টেট () বা ইতিহাস.রেপসস্টেট () কল করা কোনও পপস্টেট ইভেন্টকে ট্রিগার করবে না। পপস্টেট ইভেন্টটি কেবল ব্রাউজারের ক্রিয়া যেমন ট্রিভার করা হয় যেমন জাভাস্ক্রিপ্টে পিছনে বোতামে ক্লিক করা (বা ইতিহাস কল।) ()

আমাদের উইন্ডোএভেন্টহ্যান্ডার্স.অনপপস্টেটকে ট্রিজার করতে ইতিহাস.ব্যাক () কল করতে হবে

তাই insted:

history.pushState(...)

একটি করুন:

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