ব্রাউজারের পিছনে বাটন ইভেন্ট কীভাবে সনাক্ত করবেন - ক্রস ব্রাউজার


218

ব্যবহারকারী ব্রাউজারে পিছনের বোতামটি টিপেছে কিনা তা আপনি কীভাবে নিশ্চিতভাবে সনাক্ত করতে পারেন?

কীভাবে আপনি ব্যবহার করে একটি একক পৃষ্ঠার ওয়েব অ্যাপ্লিকেশনটির মধ্যে ইন-পেজ ব্যাক বোতামটি প্রয়োগ করবেন #URLসিস্টেম ?

কেন পৃথিবীতে ব্রাউজারগুলি ব্যাকগুলি তাদের নিজস্ব ইভেন্টগুলিতে আগুন দেয় না !?


2
আমি চাই নেভিগেশন ইভেন্টগুলি (পশ্চাৎ / সামনের) কিছুটা সময় যোগ করা হোক। এখনও অবধি এটি কিছু কাজ করছে ডেভেলপার.মোজিলা.আর.ইন-
ইউএস

উত্তর:


184

(দ্রষ্টব্য: শার্কির প্রতিক্রিয়া অনুসারে, ব্যাকস্পেসগুলি সনাক্ত করার জন্য আমি কোড অন্তর্ভুক্ত করেছি)

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

বেশিরভাগ লোক ব্যবহার করার পরামর্শ দেয়:

window.onhashchange = function() {
 //blah blah blah
}

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

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

function updateHistory(curr) {
    window.location.lasthash.push(window.location.hash);
    window.location.hash = curr;
}

অনেকটাই অকপট. আমি ক্রস-ব্রাউজার সমর্থন, পাশাপাশি পুরানো ব্রাউজারগুলির সমর্থন নিশ্চিত করতে এটি করি। কেবল নতুন হ্যাশটি ফাংশনে সরান, এবং এটি এটি আপনার জন্য সংরক্ষণ করবে এবং তারপরে হ্যাশ পরিবর্তন করবে (যা ব্রাউজারের ইতিহাসে পরে দেওয়া হয়)।

আমি একটি ইন-পেজ ব্যাক বোতামটিও ব্যবহার করি যা ব্যবহারকারীর পৃষ্ঠাগুলির মধ্যে lasthashঅ্যারে ব্যবহার করে moves দেখে মনে হচ্ছে:

function goBack() {
    window.location.hash = window.location.lasthash[window.location.lasthash.length-1];
    //blah blah blah
    window.location.lasthash.pop();
}

সুতরাং এটি ব্যবহারকারীকে শেষ হ্যাশে ফিরে যাবে এবং অ্যারে থেকে শেষ হ্যাশটি সরিয়ে ফেলবে (এখনই আমার কোনও ফরোয়ার্ড বোতাম নেই)।

So. কোনও ব্যবহারকারী আমার ইন-পেজ ব্যাক বাটন বা ব্রাউজার বোতামটি ব্যবহার করেছেন কিনা তা আমি কীভাবে সনাক্ত করব?

প্রথমে তাকালাম window.onbeforeunload , কিন্তু কোনও লাভ হয়নি - এটি কেবল তখনই বলা হয় যখন ব্যবহারকারী পৃষ্ঠাগুলি পরিবর্তন করতে চলেছেন। হ্যাশ নেভিগেশন ব্যবহার করে এটি একটি একক পৃষ্ঠা-অ্যাপ্লিকেশনটিতে ঘটে না।

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

এই যখন আমি এর মধ্যে পার্থক্য তাকান শুরু document, এবং window। আমার চূড়ান্ত সমাধানটি হ'ল পতাকাটি ব্যবহার করে সেট করা document.onmouseoverএবং এটি ব্যবহার করে অক্ষম করা document.onmouseleave

যা ঘটে তা হ'ল যখন ব্যবহারকারীর মাউস নথির ক্ষেত্রের ভিতরে থাকে (পড়ুন: উপস্থাপিত পৃষ্ঠা, তবে ব্রাউজারের ফ্রেম বাদ দিয়ে), আমার বুলিয়ান সেট করা আছে true। মাউস নথির ক্ষেত্রটি ছাড়ার সাথে সাথে বুলেটটি উল্টে যায়false

এইভাবে, আমি এতে আমার পরিবর্তন করতে পারি window.onhashchange:

window.onhashchange = function() {
    if (window.innerDocClick) {
        window.innerDocClick = false;
    } else {
        if (window.location.hash != '#undefined') {
            goBack();
        } else {
            history.pushState("", document.title, window.location.pathname);
            location.reload();
        }
    }
}

আপনি চেক নোট করবেন #undefined। এটি কারণ যদি আমার অ্যারেতে কোনও ইতিহাস উপলব্ধ না হয় তবে তা ফিরে আসে undefined। ব্যবহারকারীরা কোনও window.onbeforeunloadইভেন্ট ব্যবহার করে ছেড়ে যেতে চান কিনা তা জিজ্ঞাসা করার জন্য আমি এটি ব্যবহার করি ।

সুতরাং, সংক্ষেপে, এবং সেই সমস্ত লোকদের জন্য যারা ইতিহাস সংরক্ষণ করার জন্য কোনও ইন-পেজ ব্যাক বাটন বা অ্যারে ব্যবহার করেন না:

document.onmouseover = function() {
    //User's mouse is inside the page.
    window.innerDocClick = true;
}

document.onmouseleave = function() {
    //User's mouse has left the page.
    window.innerDocClick = false;
}

window.onhashchange = function() {
    if (window.innerDocClick) {
        //Your own in-page mechanism triggered the hash change
    } else {
        //Browser back button was clicked
    }
}

এবং সেখানে আপনি এটা আছে। হ্যাশ নেভিগেশনের সাথে সম্পর্কিত পৃষ্ঠার উপাদানগুলিতে ইন-পৃষ্ঠ উপাদানগুলির ব্যাক ব্যাক ব্যবহার সনাক্ত করার একটি সহজ, তিন অংশের উপায়।

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

ব্যবহারকারী পিছনের ইভেন্টটি ট্রিগার করতে ব্যাকস্পেস ব্যবহার না করে তা নিশ্চিত করতে আপনি নিম্নলিখিতগুলিও অন্তর্ভুক্ত করতে পারেন ( এই প্রশ্নে @ থিয়েলম্যানকে ধন্যবাদ ):

$(function(){
    /*
     * this swallows backspace keys on any non-input element.
     * stops backspace -> back
     */
    var rx = /INPUT|SELECT|TEXTAREA/i;

    $(document).bind("keydown keypress", function(e){
        if( e.which == 8 ){ // 8 == backspace
            if(!rx.test(e.target.tagName) || e.target.disabled || e.target.readOnly ){
                e.preventDefault();
            }
        }
    });
});

5
+1 দুর্দান্ত ধারণা, তবে আমি মনে করি এটির ব্যর্থতা যদি ব্যবহারকারী তার পিছনে ব্রাউজার উইন্ডোতে থাকা অবস্থায় "পিছনে" (ফায়ারফক্সের ব্যাকস্পেস কী) জন্য যা কিছু কীবোর্ড শর্টকাট ব্যবহার করে
শার্কি

3
করবে - আমি এখনই অফিসে আছি যাইহোক :) (সম্পাদনা: এখনই সম্পন্ন)
জারাস

7
মোবাইল সম্পর্কে (যেমন আইপ্যাড)
বাসারাত

5
ম্যাকের ট্র্যাকপ্যাড থেকে সোয়াইপ ইভেন্টগুলি সম্পর্কে কী। তাও কি ধরা পড়তে পারে?
শ্রীগনেশ নবনীঠাকৃষ্ণন

6
আমি কীভাবে সামনের ও পিছনের বোতামগুলির পার্থক্য করতে পারি?
মিঃ_পরিফেক্ট

79

আপনি popstateইভেন্ট হ্যান্ডলার চেষ্টা করতে পারেন , যেমন:

window.addEventListener('popstate', function(event) {
    // The popstate event is fired each time when the current history entry changes.

    var r = confirm("You pressed a Back button! Are you sure?!");

    if (r == true) {
        // Call Back button programmatically as per user confirmation.
        history.back();
        // Uncomment below line to redirect to the previous page instead.
        // window.location = document.referrer // Note: IE11 is not supporting this.
    } else {
        // Stay on the current page.
        history.pushState(null, null, window.location.pathname);
    }

    history.pushState(null, null, window.location.pathname);

}, false);

দ্রষ্টব্য: সর্বোত্তম ফলাফলের জন্য, আপনাকে কেবলমাত্র নির্দিষ্ট পৃষ্ঠাগুলিতে এই কোডটি লোড করা উচিত যেখানে অন্য কোনও অপ্রত্যাশিত সমস্যা এড়াতে আপনি যুক্তি প্রয়োগ করতে চান।

বর্তমান ইতিহাসের এন্ট্রি পরিবর্তিত হলে (ব্যবহারকারী একটি নতুন রাজ্যে নেভিগেট করে) পপস্টেট ইভেন্টটি প্রতিবারই বহিস্কার হয়। যে ব্রাউজারের ফিরে যান / ফরোয়ার্ড বোতাম বা যখন উপর যখন ব্যবহারকারী ক্লিক ঘটবে history.back(), history.forward(),history.go() পদ্ধতি programatically বলা হয়।

event.stateঘটনা সম্পত্তি ইতিহাস রাষ্ট্র বস্তুর সমান।

JQuery সিনট্যাক্সের জন্য, এটি চারপাশে মোড়ানো (দস্তাবেজ প্রস্তুত হওয়ার পরে এমনকি শ্রোতাদের যোগ করতে):

(function($) {
  // Above code here.
})(jQuery);

আরও দেখুন: পৃষ্ঠা লোডে উইন্ডো.অনপপস্টেট


আরও দেখুন উপর উদাহরণ সিঙ্গল-পৃষ্ঠা অ্যাপ্লিকেশান এবং HTML5 এর pushState পৃষ্ঠা:

<script>
// jQuery
$(window).on('popstate', function (e) {
    var state = e.originalEvent.state;
    if (state !== null) {
        //load content with ajax
    }
});

// Vanilla javascript
window.addEventListener('popstate', function (e) {
    var state = e.state;
    if (state !== null) {
        //load content with ajax
    }
});
</script>

এটি ক্রোম 5+, ফায়ারফক্স 4+, আইই 10+, সাফারি 6+, অপেরা 11.5+ এবং অনুরূপের সাথে সামঞ্জস্যপূর্ণ হওয়া উচিত।


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

1
একক পৃষ্ঠা অ্যাপ্লিকেশন এবং এইচটিএমএল 5 পুস্টস্টেটে দুর্দান্ত পোস্ট । আধুনিক "এক পৃষ্ঠার বিন্যাস" বা "একক পৃষ্ঠা অ্যাপ্লিকেশন" এর জন্য উপযুক্ত। লিঙ্কটি এবং আপনার উত্তরের জন্য আপনাকে ধন্যবাদ!
lowtechsun

1
ইস্টেট সর্বদা আধুনিক ব্রাউজারগুলিতে অপরিজ্ঞাত বলে মনে হয়
এফএজির

আমি আপনাকে পরামর্শ দিচ্ছি যে আপনি আপনার কোডটি একটি স্নিপেটে রেখেছেন যাতে আপনি এটি সরাসরি এখানে চালাতে পারেন।
ফোরচিনামন0

16

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

পৃষ্ঠা লোডে:

window.history.pushState({page: 1}, "", "");

window.onpopstate = function(event) {

  // "event" object seems to contain value only when the back button is clicked
  // and if the pop state event fires due to clicks on a button
  // or a link it comes up as "undefined" 

  if(event){
    // Code to handle back button or prevent from navigation
  }
  else{
    // Continue user action through link or button
  }
}

আমাকে জানতে দা্ও এটা সাহয্য করে কি - না। যদি কিছু মিস করছি তবে আমি বুঝতে পেরে খুশি হব।


1
সত্য না. eventএমনকি ফরওয়ার্ড বোতামটির জন্য মান রয়েছে
ড্যানিয়েল বিরোস্কি পোপেস্কি

14

জাভাস্ক্রিপ্টে, নেভিগেশন টাইপ 2মানে ব্রাউজারের পিছনের বা ফরোয়ার্ড বোতামটি ক্লিক করা হয় এবং ব্রাউজারটি আসলে ক্যাশে থেকে সামগ্রী নিচ্ছে।

if(performance.navigation.type == 2)
{
    //Do your code here
}

1
এটি কোনও একক পৃষ্ঠার অ্যাপ্লিকেশনটিতে কাজ করে না, ফলাফল সর্বদা 1 (যার মানে পুনরায় লোড)। তবু এটি পিছনে এবং ফরোয়ার্ড বোতামের মধ্যে পার্থক্য তৈরি করে না, যা অত্যন্ত দুর্ভাগ্যজনক।
প্যাপিলন

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

এটি সমস্ত ব্রাউজারে কাজ করার গ্যারান্টিযুক্ত নয়! সুতরাং আপনার এইরকম কিছু লিখতে হবে: যদি (উইন্ডো. পারফরম্যান্স) {// আপনার পারফরম্যান্স সম্পর্কিত কোড} এছাড়াও আরও পঠনযোগ্যতার জন্য 2 এর পরিবর্তে TYPE_BACK_FORWARD ব্যবহার করা ভাল।
ফাঁকা 9

7

এটি অবশ্যই কাজ করবে (ব্যাক বোতাম ক্লিক সনাক্তকরণের জন্য)

$(window).on('popstate', function(event) {
 alert("pop");
});

6

এটা দেখ:

history.pushState(null, null, location.href);
    window.onpopstate = function () {
        history.go(1);
    };

এটা ঠিক কাজ করে ...


ক্রোমে 78.0.3904.70 (অফিসিয়াল বিল্ড) (
-৪

সাহসী v1.3.118 এ কাজ করা হয়েছে তা নিশ্চিত করেছেন >> ক্রোমিয়াম: 80.0.3987.116 (অফিসিয়াল বিল্ড) (
-৪

আপনি যদি কোনও বাহ্যিক সাইট থেকে পৃষ্ঠাতে এসে থাকেন তবে কাজ করে না।
মিলান ভ্ল্যাচ

5
if (window.performance && window.performance.navigation.type == window.performance.navigation.TYPE_BACK_FORWARD) {
  alert('hello world');
}

এটি আমার জন্য কাজ করা একমাত্র সমাধান (এটি কোনও অন্যাপেজ ওয়েবসাইট নয়)। এটি ক্রোম, ফায়ারফক্স এবং সাফারি নিয়ে কাজ করছে।


1
উইন্ডো.পারফরম্যান্স.ন্যাভিগেশন হ্রাস করা হয়েছে। এখানে ডক্স বিকাশকারী রয়েছে
মোজিলা.অর্গ

এটি আমার .cshtml পৃষ্ঠায় আমার জন্য কাজ করেছে। Chrome এবং IE এ সফলভাবে কাজ করেছেন। ধন্যবাদ
Justjyde

5

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

যদি ব্যবহারকারী পিছনে বা ফরোয়ার্ড বোতাম ব্যবহার করে আপনার পৃষ্ঠায় অবতরণ করে তবে নিম্নলিখিত কোডটি কনসোলে "back_forward" লগ ইন করবে। আপনার প্রকল্পে এটি ব্যবহার করার আগে সামঞ্জস্যতা টেবিলটি একবার দেখুন।

var perfEntries = performance.getEntriesByType("navigation");
for (var i = 0; i < perfEntries.length; i++) {
    console.log(perfEntries[i].type);
}

এই পৃষ্ঠায় কোনও পিছনের বোতামটি ক্লিক করা আছে কিনা তা বলার উপায় নয় । এটি জানায় যে এটি শেষ পৃষ্ঠায় ক্লিক করা হয়েছিল কিনা ।
সেফ রিড

তবে এটি যে আসল উত্তরটি আমি সন্ধান করছিলাম সেহেতু আমি যে বিষয়টি পেয়েছি তা হ'ল আমি পিছনের বোতামটি আঘাত করার পরে এবং তার অর্থের আগে নয় যে আমি এমন কোনও প্রতিক্রিয়া কোড তৈরি করতে পারি যা আমার সদৃশ অনুরোধের সমস্যাগুলি থামিয়ে দেয়। ধন্যবাদ।
অ্যান্ড্রু

1
এটি প্রশ্নের উত্তর নাও দিতে পারে তবে আমার ঠিক কী দরকার ছিল! খুব ভাল - আমি এটি সম্পর্কে জানতাম না ...
হোগস্মিল

4

ব্রাউজার: https://jsfiddle.net/Limitlessisa/axt1Lqoz/

মোবাইল নিয়ন্ত্রণের জন্য: https://jsfiddle.net/Limitlessisa/axt1Lqoz/show/

$(document).ready(function() {
  $('body').on('click touch', '#share', function(e) {
    $('.share').fadeIn();
  });
});

// geri butonunu yakalama
window.onhashchange = function(e) {
  var oldURL = e.oldURL.split('#')[1];
  var newURL = e.newURL.split('#')[1];

  if (oldURL == 'share') {
    $('.share').fadeOut();
    e.preventDefault();
    return false;
  }
  //console.log('old:'+oldURL+' new:'+newURL);
}
.share{position:fixed; display:none; top:0; left:0; width:100%; height:100%; background:rgba(0,0,0,.8); color:white; padding:20px;
<!DOCTYPE html>
<html>

<head>
    <title>Back Button Example</title>
    <script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>

</head>

<body style="text-align:center; padding:0;">
    <a href="#share" id="share">Share</a>
    <div class="share" style="">
        <h1>Test Page</h1>
        <p> Back button press please for control.</p>
    </div>
</body>

</html>


এটি জিজ্ঞাসিত প্রশ্নের উত্তর দেয় না। ব্রাউজারের নেটিভ ব্যাক বাটন বনাম ইন-পেজ ব্যাক বোতামের ব্যবহার সনাক্তকরণ সম্পর্কে প্রশ্ন।
Xarus

2
প্রশ্নটি জাভাস্ক্রিপ্ট ট্যাগ, জ্যাকারি নয়।
skwny

3

এটি আমার গ্রহণ এখানে। অনুমানটি হ'ল, যখন ইউআরএল পরিবর্তন হয় তবে documentসনাক্তকরণের মধ্যে কোনও ক্লিক থাকে না , এটি ব্রাউজার ফিরে (হ্যাঁ, বা এগিয়ে)। অ্যাজাক্সের মাধ্যমে সামগ্রী লোড করা পৃষ্ঠাগুলিতে এই কাজটি করতে ব্যবহারকারীদের ক্লিক করা 2 সেকেন্ড পরে পুনরায় সেট করা হয়:

(function(window, $) {
  var anyClick, consoleLog, debug, delay;
  delay = function(sec, func) {
    return setTimeout(func, sec * 1000);
  };
  debug = true;
  anyClick = false;
  consoleLog = function(type, message) {
    if (debug) {
      return console[type](message);
    }
  };
  $(window.document).click(function() {
    anyClick = true;
    consoleLog("info", "clicked");
    return delay(2, function() {
      consoleLog("info", "reset click state");
      return anyClick = false;
    });
  });
  return window.addEventListener("popstate", function(e) {
    if (anyClick !== true) {
      consoleLog("info", "Back clicked");
      return window.dataLayer.push({
        event: 'analyticsEvent',
        eventCategory: 'test',
        eventAction: 'test'
      });
    }
  });
})(window, jQuery);

2

আমি এই থ্রেডের উত্তরগুলির মধ্যে কয়েকটি এবং আইই এবং ক্রোম / এজ এ এটির কাজ করতে সক্ষম হয়েছি। ইতিহাস.পুষ্প স্টেটটি আইই ১১ এ সমর্থিত ছিল না।

if (history.pushState) {
    //Chrome and modern browsers
    history.pushState(null, document.title, location.href);
    window.addEventListener('popstate', function (event) {
        history.pushState(null, document.title, location.href);
    });
}
else {
    //IE
    history.forward();
}

সবেমাত্র Chrome 78.0.3904.70 (অফিসিয়াল বিল্ড) (-৪-বিট) এ চেষ্টা করেছেন এবং এটি কার্যকর হয়নি।
জেফজ

2

আপনি যদি এপিআইকে নতুনভাবে সংজ্ঞা দেন (অবজেক্টের 'ইতিহাসের পদ্ধতিগুলি পরিবর্তন করেন)' তবে সম্পূর্ণ লিখিত উপাদানটি কার্যকর করা যেতে পারে তবে আমি কেবল লিখিত ক্লাসটি ভাগ করব will Chrome এবং মোজিলা সমর্থন কেবল HTML5 এবং ECMAScript5-6 এ পরীক্ষিত

class HistoryNavigation {
    static init()
    {
        if(HistoryNavigation.is_init===true){
            return;
        }
        HistoryNavigation.is_init=true;

        let history_stack=[];
        let n=0;
        let  current_state={timestamp:Date.now()+n};
        n++;
        let init_HNState;
        if(history.state!==null){
            current_state=history.state.HNState;
            history_stack=history.state.HNState.history_stack;
            init_HNState=history.state.HNState;
        } else {
            init_HNState={timestamp:current_state.timestamp,history_stack};
        }
        let listenerPushState=function(params){
            params=Object.assign({state:null},params);
            params.state=params.state!==null?Object.assign({},params.state):{};
            let h_state={ timestamp:Date.now()+n};
            n++;
            let key = history_stack.indexOf(current_state.timestamp);
            key=key+1;
            history_stack.splice(key);
            history_stack.push(h_state.timestamp);
            h_state.history_stack=history_stack;
            params.state.HNState=h_state;
            current_state=h_state;
            return params;
        };
        let listenerReplaceState=function(params){
            params=Object.assign({state:null},params);
            params.state=params.state!==null?Object.assign({},params.state):null;
            let h_state=Object.assign({},current_state);
            h_state.history_stack=history_stack;
            params.state.HNState=h_state;
            return params;
        };
        let desc=Object.getOwnPropertyDescriptors(History.prototype);
        delete desc.constructor;
        Object.defineProperties(History.prototype,{

            replaceState:Object.assign({},desc.replaceState,{
                value:function(state,title,url){
                    let params={state,title,url};
                    HistoryNavigation.dispatchEvent('history.state.replace',params);
                    params=Object.assign({state,title,url},params);
                    params=listenerReplaceState(params);
                    desc.replaceState.value.call(this,params.state,params.title,params.url);
                }
            }),
            pushState:Object.assign({},desc.pushState,{
                value:function(state,title,url){
                    let params={state,title,url};
                    HistoryNavigation.dispatchEvent('history.state.push',params);
                    params=Object.assign({state,title,url},params);
                    params=listenerPushState(params);
                    return desc.pushState.value.call(this, params.state, params.title, params.url);
                }
            })
        });
        HistoryNavigation.addEventListener('popstate',function(event){
            let HNState;
            if(event.state==null){
                HNState=init_HNState;
            } else {
                HNState=event.state.HNState;
            }
            let key_prev=history_stack.indexOf(current_state.timestamp);
            let key_state=history_stack.indexOf(HNState.timestamp);
            let delta=key_state-key_prev;
            let params={delta,event,state:Object.assign({},event.state)};
            delete params.state.HNState;
            HNState.history_stack=history_stack;
            if(event.state!==null){
                event.state.HNState=HNState;
            }
            current_state=HNState;
            HistoryNavigation.dispatchEvent('history.go',params);
        });

    }
    static addEventListener(...arg)
    {
        window.addEventListener(...arg);
    }
    static removeEventListener(...arg)
    {
        window.removeEventListener(...arg);
    }
    static dispatchEvent(event,params)
    {
        if(!(event instanceof Event)){
            event=new Event(event,{cancelable:true});
        }
        event.params=params;
        window.dispatchEvent(event);
    };
}
HistoryNavigation.init();

// exemple

HistoryNavigation.addEventListener('popstate',function(event){
    console.log('Will not start because they blocked the work');
});
HistoryNavigation.addEventListener('history.go',function(event){
    event.params.event.stopImmediatePropagation();// blocked popstate listeners
    console.log(event.params);
    // back or forward - see event.params.delta

});
HistoryNavigation.addEventListener('history.state.push',function(event){
    console.log(event);
});
HistoryNavigation.addEventListener('history.state.replace',function(event){
    console.log(event);
});
history.pushState({h:'hello'},'','');
history.pushState({h:'hello2'},'','');
history.pushState({h:'hello3'},'','');
history.back();

    ```

চমৎকার পন্থা! এটি যুক্ত করার জন্য ধন্যবাদ (এত বছর পরেও এই থ্রেডে কথোপকথন হয়েছে বলে আমি এখনও আশ্চর্য
হয়েছি

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

1

ডকুমেন্ট.মাউসওভার আইই এবং ফায়ারফক্সের জন্য কাজ করে না। তবে আমি এটি চেষ্টা করেছি:

$(document).ready(function () {
  setInterval(function () {
    var $sample = $("body");
    if ($sample.is(":hover")) {
      window.innerDocClick = true;
    } else {
      window.innerDocClick = false;
    }
  });

});

window.onhashchange = function () {
  if (window.innerDocClick) {
    //Your own in-page mechanism triggered the hash change
  } else {
    //Browser back or forward button was pressed
  }
};

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


1
 <input style="display:none" id="__pageLoaded" value=""/>


 $(document).ready(function () {
        if ($("#__pageLoaded").val() != 1) {

            $("#__pageLoaded").val(1);


        } else {
            shared.isBackLoad = true;
            $("#__pageLoaded").val(1);  

            // Call any function that handles your back event

        }
    });

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


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

0

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

var evt = null,
canGoBackToThePast = true;

$('#next-slide').on('click touch', function(e) {
    evt = e;
    canGobackToThePast = false;
    // your logic (remember to set the 'canGoBackToThePast' flag back to 'true' at the end of it)
}

-21

আমি উপরের বিকল্পগুলি চেষ্টা করেছিলাম কিন্তু সেগুলির মধ্যে কেউই আমার পক্ষে কাজ করছে না। সমাধান এখানে

if(window.event)
   {
        if(window.event.clientX < 40 && window.event.clientY < 0)
        {
            alert("Browser back button is clicked...");
        }
        else
        {
            alert("Browser refresh button is clicked...");
        }
    }

আরও তথ্যের জন্য এই লিঙ্কটি http://www.codeproject.com/Articles/696526/Solution-to-Browser-Back-Button-Clic-Event-Handli দেখুন


8
@ মুনাময়িউসুফ এটি স্পষ্টভাবে স্পষ্ট যে এই কোডের টুকরাটি সত্যই কাজ করে না। এটি ব্রাউজারের পিছনের বোতামটি সন্ধান করে তবে বোতামটি ভিউপোর্টের বাইরে রয়েছে, সুতরাং স্থানাঙ্ক ক্লায়েন্টএক্স এবং ক্লায়েন্টওয়াইটি গ্রহণযোগ্য হবে না। ধরে নিচ্ছি এটি কাজ করে, আইওএস সম্পর্কে কীভাবে? পিছনের বোতামটি নীচে রয়েছে ... এছাড়াও এটি যেভাবে লেখা হয়েছে তা অত্যন্ত অকার্যকর, এটি প্রতিটি ইভেন্টে চালিত হওয়া শর্তসাপেক্ষ ... Godশ্বর এটি এত খারাপ যে এটিকে একটি নিচে ভোট দিতে চলেছে।
জেমস ওয়াং - মনিকা

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