ब्राउज़र बैक बटन ईवेंट का पता कैसे लगाएं - क्रॉस ब्राउज़र


219

आप निश्चित रूप से कैसे पता लगा सकते हैं कि उपयोगकर्ता ने ब्राउज़र में बैक बटन दबाया है या नहीं?

आप एक #URLसिस्टम का उपयोग करके सिंगल पेज वेब एप्लिकेशन के अंदर इन-पेज बैक बटन के उपयोग को कैसे लागू करते हैं ?

धरती पर ब्राउज़र अपने स्वयं के ईवेंट को वापस क्यों नहीं लाते हैं !?


2
मैं चाहता हूं कि नेविगेशन इवेंट (पिछड़े / आगे) कुछ समय के लिए जुड़ जाएं। अब तक यह कुछ काम कर रहा है developer.mozilla.org/en-US/docs/Web/API/…
lalaaalu

जवाबों:


184

(नोट: शार्की की प्रतिक्रिया के अनुसार, मैंने बैकस्पेस का पता लगाने के लिए कोड शामिल किया है)

इसलिए, मैंने एसओ पर इन सवालों को अक्सर देखा है, और हाल ही में बैक बटन कार्यक्षमता को नियंत्रित करने के मुद्दे पर चला है। अपने आवेदन के लिए सबसे अच्छा समाधान खोजने के कुछ दिनों के बाद (हैश नेविगेशन के साथ सिंगल-पेज), मैं बैक बटन का पता लगाने के लिए एक सरल, क्रॉस-ब्राउज़र, लाइब्रेरी-कम प्रणाली के साथ आया हूं।

ज्यादातर लोग उपयोग करने की सलाह देते हैं:

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

हालांकि, यह फ़ंक्शन तब भी कहा जाएगा जब कोई उपयोगकर्ता इन-पेज तत्व का उपयोग करता है जो स्थान हैश को बदलता है। जब आपका उपयोगकर्ता क्लिक करता है और पृष्ठ पीछे या आगे की ओर जाता है, तो सबसे अच्छा उपयोगकर्ता अनुभव नहीं।

आपको मेरी प्रणाली की एक सामान्य रूपरेखा देने के लिए, मैं पिछले हैश के साथ एक सरणी को भर रहा हूं क्योंकि मेरा उपयोगकर्ता इंटरफ़ेस के माध्यम से चलता है। यह कुछ इस तरह दिखता है:

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

बहुत सीधा। मैं क्रॉस-ब्राउज़र समर्थन सुनिश्चित करने के लिए ऐसा करता हूं, साथ ही पुराने ब्राउज़रों के लिए समर्थन भी करता हूं। बस फ़ंक्शन को नया हैश पास करें, और यह आपके लिए संग्रहीत करेगा और फिर हैश को बदल देगा (जो तब ब्राउज़र के इतिहास में डाल दिया जाता है)।

मैं एक इन-पेज बैक बटन का भी उपयोग करता हूं जो उपयोगकर्ता को lasthashसरणी का उपयोग करके पृष्ठों के बीच ले जाता है । यह इस तरह दिख रहा है:

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

तो यह उपयोगकर्ता को अंतिम हैश में ले जाएगा, और उस अंतिम हैश को सरणी से हटा देगा (मेरे पास अभी कोई बटन नहीं है)।

इसलिए। मैं कैसे पता लगा सकता हूं कि किसी उपयोगकर्ता ने मेरे इन-पेज बैक बटन, या ब्राउज़र बटन का उपयोग किया है या नहीं?

सबसे पहले मैंने देखा 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
    }
}

आखिर तुमने इसे हासिल कर ही लिया है। हैश नेविगेशन के संबंध में इन-पेज तत्वों बनाम बैक बटन के उपयोग का पता लगाने का एक सरल, तीन-भाग तरीका।

संपादित करें:

यह सुनिश्चित करने के लिए कि उपयोगकर्ता बैक इवेंट को ट्रिगर करने के लिए बैकस्पेस का उपयोग नहीं करता है, आप निम्नलिखित को भी शामिल कर सकते हैं ( इस सवाल पर @thetoolman का धन्यवाद ):

$(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 अच्छा विचार है, लेकिन मुझे लगता है कि यदि उपयोगकर्ता "बैक" (फ़ायरफ़ॉक्स पर बैकस्पेस कुंजी) का उपयोग करता है तो यह विफल हो जाएगा, जबकि उसका माउस ब्राउज़र विंडो के अंदर है
Sharky

3
करेंगे - मैं अभी वैसे भी ऑफिस में हूँ :) (EDIT: Done now)
Xarus

7
मोबाइल के बारे में क्या है (उदाहरण के लिए ipad)
basarat

5
मैक में ट्रैकपैड से स्वाइप घटनाओं के बारे में क्या। क्या उस पर भी कब्जा किया जा सकता है?
श्रीगणेश नवनीतकृष्णन 22

6
मैं आगे और पिछड़े बटन को कैसे अलग कर सकता हूं?
Mr_Perfect

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()तरीकों प्रोग्राम के कहा जाता है।

event.stateघटना की संपत्ति है इतिहास स्थिति ऑब्जेक्ट के बराबर है।

JQuery वाक्य रचना के लिए, इसे चारों ओर लपेटें (दस्तावेज़ तैयार होने के बाद भी श्रोता को जोड़ने के लिए):

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

इसे भी देखें: window.onpopstate on page load


एकल-पृष्ठ एप्लिकेशन और HTML5 पुशस्टेट पृष्ठ पर उदाहरण भी देखें :

<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+, IE 10+, सफारी 6+, ओपेरा 11.5+ और इसी तरह के साथ संगत होना चाहिए।


2
Kenorb, आप सही हैं कि पॉपस्टेट परिवर्तन को हथियाने के लिए काम करता है, लेकिन यह प्रोग्राम को कॉल करने वाले प्रोग्राम के बीच अंतर नहीं करता है और जब उपयोगकर्ता ब्राउज़र के बटन पर क्लिक करता है।
Xarus

1
सिंगल-पेज एप्स और एचटीएमएल 5 पुशस्टेट पर शानदार पोस्ट । आधुनिक "एक पृष्ठ लेआउट" या "एकल पृष्ठ ऐप्स" के लिए बिल्कुल सही। लिंक और आपके उत्तर के लिए धन्यवाद!
लोटेकसून

1
e.state हमेशा आधुनिक ब्राउज़रों में अपरिभाषित लगता है
FAjir

मेरा सुझाव है कि आप अपना कोड एक स्निपेट में डालें ताकि आप इसे सीधे यहां चला सकें।
FourCinnamon0

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 होता है (जिसका अर्थ है पुनः लोड)। इसके अलावा यह बैक और फॉरवर्ड बटन के बीच अंतर नहीं करता है, जो बहुत दुर्भाग्यपूर्ण है।
पेपिलोन

"इसके अलावा यह बैक और फॉरवर्ड बटन के बीच का अंतर नहीं करता है, जो बहुत दुर्भाग्यपूर्ण है।" हाँ क्योंकि जब भी डेटा कैश से प्राप्त होता है उस समय प्रदर्शन
हसन बादशाह

यह सभी ब्राउज़रों में काम करने की गारंटी नहीं है! इसलिए आपको कुछ इस तरह लिखना चाहिए: अगर (window.performance) {// आपका प्रदर्शन संबंधित कोड}, तो अधिक पठनीयता के लिए 2 के बजाय TYPE_BACK_FORWARD का उपयोग करना बेहतर होगा।
रिक्त94

7

यह निश्चित रूप से काम करेगा (बैक बटन क्लिक का पता लगाने के लिए)

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

6

यह देखो:

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

यह बढ़िया काम करता है...


Chrome में काम नहीं करता है 78.0.3904.70 (आधिकारिक निर्माण) (64-बिट)
जेफ़ज़

बहादुर v1.3.118 >> क्रोमियम पर काम करने की पुष्टि: 80.0.3987.116 (आधिकारिक बिल्ड) (64-बिट)
शून्य

यदि आप किसी बाहरी साइट से पेज पर आए हैं तो यह काम नहीं करता है।
मिलन व्लाच

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

यह केवल एक समाधान है जो मेरे लिए काम किया (यह एक onepage वेबसाइट नहीं है)। यह क्रोम, फ़ायरफ़ॉक्स और सफारी के साथ काम कर रहा है।


1
window.performance.navigation को हटा दिया गया है। यहाँ docs developer.mozilla.org/en-US/docs/Web/API/Performance/navigation
lalaaalu

इसने मेरे लिए मेरे .cshtml पेज पर काम किया। Chrome और IE पर सफलतापूर्वक काम किया गया। धन्यवाद
Justjyde

5

प्रश्न का उत्तर देने के लिए सही उत्तर पहले से मौजूद है। मैं नए जावास्क्रिप्ट एपीआई परफॉरमेंस न्यूमिशनटिमिंग का उल्लेख करना चाहता हूँ , यह बदली हुई प्रदर्शन की जगह है ।

यदि कोड उपयोगकर्ता बैक या फॉरवर्ड बटन का उपयोग करके आपके पेज पर उतरा तो कंसोल "बैक_ फॉरवर्ड" में लॉग इन होगा। अपनी परियोजना में उपयोग करने से पहले संगतता तालिका पर एक नज़र डालें।

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

यहाँ पर इसे ले रहा हूँ। यह धारणा है कि जब URL बदलता है, लेकिन documentपता चला के भीतर कोई क्लिक नहीं होता है, तो यह एक ब्राउज़र बैक (हाँ, या आगे) है। Ajax के माध्यम से सामग्री लोड करने वाले पृष्ठों पर यह काम करने के लिए 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

मैं इस थ्रेड में कुछ उत्तरों का उपयोग करने में सक्षम था और अन्य इसे IE और क्रोम / एज में काम करने के लिए। IE11 में मेरे लिए history.pushState समर्थित नहीं था।

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();
}

बस कोशिश की है कि क्रोम पर 78.0.3904.70 (आधिकारिक निर्माण) (64-बिट) और यह काम नहीं किया।
जेफज़

2

एक पूर्ण घटक को केवल तभी लागू किया जा सकता है जब आप एपीआई को फिर से परिभाषित करते हैं (ऑब्जेक्ट 'इतिहास के तरीकों को बदल दें) मैं सिर्फ लिखा हुआ वर्ग साझा करूंगा। Chrome और Mozilla समर्थन पर परीक्षण केवल 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();

    ```

अच्छा तरीका! इसे जोड़ने के लिए धन्यवाद (मुझे अभी भी यह आश्चर्यजनक लगता है कि इतने सालों बाद इस थ्रेड पर बातचीत हुई है)
Xarus

यह एक चतुर इतिहास ट्रैकिंग तंत्र प्रतीत होता है। हालाँकि, कोड अनियोजित है, इसलिए इसका पालन करना बहुत मुश्किल है। यदि कोई वर्तमान पृष्ठ से दूर जाता है, तो कोड उस बटन प्रेस का पता नहीं लगाएगा, जो मूल प्रश्न का उत्तर नहीं देता है कि "आप कैसे निश्चित रूप से पता लगा सकते हैं कि उपयोगकर्ता ने ब्राउज़र में बैक बटन दबाया है या नहीं?" बटन प्रेस और इतिहास ट्रैकिंग दो अलग-अलग चीजें हैं भले ही एक दूसरे को ट्रिगर कर सकती है। तथ्य यह है कि अभी भी बातचीत वेब ब्राउज़र डिजाइन में एक प्रमुख दोष है।
क्यूबिकलसॉफ्ट

1

Document.mouseover IE और FireFox के लिए काम नहीं करता है। हालाँकि मैंने यह कोशिश की है:

$(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
  }
};

यह क्रोम और IE और फ़ायर्फ़ॉक्स के लिए काम करता है। अभी भी फायरफॉक्स को सही करने के लिए काम कर रहा है। ब्राउज़र बैक / फॉरवर्ड बटन क्लिक का पता लगाने का कोई भी आसान तरीका स्वागत योग्य है, विशेष रूप से JQuery में नहीं बल्कि AngularJS या सादा जावास्क्रिप्ट।


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-Click-Event-Handli अधिक जानकारी के लिए


8
@MunamYousuf यह स्पष्ट है कि कोड का यह टुकड़ा वास्तव में काम क्यों नहीं करता है। यह ब्राउजर के बैक बटन को ट्रैक करता है लेकिन बटन व्यूपोर्ट के बाहर है, इसलिए क्लाइंटएक्स और क्लाइंटवाई को कोआर्डिनेट नहीं किया जाना चाहिए। यह मानते हुए कि यह कैसे काम करता है, आईओएस के बारे में कैसे? बैक बटन सबसे नीचे है ... साथ ही जिस तरह से लिखा गया है वह सुपर अक्षम है, यह ट्रिगर की गई हर एक घटना के लिए एक सशर्त है ... भगवान यह इतना बुरा है कि इसे एक डाउन वोट देने जा रहा है।
जेम्स वोंग - मोनिका

यह भयावह है! आप ऐसा क्यों करेंगे? : / और यह भी जेम्स के रूप में काम नहीं करेगा।
msqar
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.