टैब के बीच नेविगेट करने के लिए ब्राउज़र बैक / नेक्स्ट बटन


14

मुझे उपयोगकर्ताओं से बहुत शिकायतें मिल रही हैं कि जब वे मेरे jQuery- आधारित टैब का उपयोग कर रहे हैं, तो उन्हें यह कष्टप्रद लगता है कि जब वे अपने ब्राउज़र पर वापस आते हैं, तो वे पिछले टैब पर नहीं बल्कि पिछले पृष्ठ पर जाते हैं । मैंने निम्नलिखित पिछले / अगले बटन जोड़े लेकिन पर्याप्त नहीं। मैं अपने बटनों को फिर से कॉन्फ़िगर कैसे कर सकता हूं ताकि उपयोगकर्ता पिछले पृष्ठ के बजाय पिछले टैब पर जाएं जब वे ब्राउज़र वापस तीर पर क्लिक करेंगे। आप इसे यहाँ परीक्षण कर सकते हैं

$('#quicktabs-registration_steps').append('<div class="prevnext"><a class="tablink-prev btn" href="#">Prev</a><a class="tablink-next btn btn-lg btn-primary" href="#">Continue</a></div>');
$('.tablink-prev').click(function () {
    var index = $('.quicktabs-tabs li.active').index();
    $('.quicktabs-tabs li').eq(index).removeClass('active');
    if (index == 0) {
        index = 1;
    }
    $('.quicktabs-tabs li').eq(index - 1).addClass('active');
    $('.quicktabs-tabs li').eq(index - 1).find('a').click();
    return false;
});
$('.tablink-next').click(function () {
    var length = $('.quicktabs-tabs').first().children().size();;
    var index = $('.quicktabs-tabs li.active').index();
    $('.quicktabs-tabs li').eq(index).removeClass('active');
    //                if (parseInt(index) == parseInt(length) - 1 ) {
    //                    index = index - 1;
    //                }
    if (parseInt(index) == parseInt(length) - 1) {
        window.location.href = '/home'; //redirect to home
        //index = index - 1;
    }
    $('.quicktabs-tabs li').eq(index + 1).addClass('active');
    $('.quicktabs-tabs li').eq(index + 1).find('a').click();
    return false;
});

प्रासंगिक होने पर URL के पीछे # tab1 और # tab2 जोड़ें
Gerard

हाय @Gard, नहीं निम्नलिखित आप एक उदाहरण दिखा सकते हैं।
एफए

आपको पता होना चाहिए कि भविष्य में किसी भी ब्राउज़र को वापस नेविगेट करने या आगे बढ़ाने से रोकने का कारण यह हो सकता है कि यदि कोई दुर्भावनापूर्ण स्क्रिप्ट हैं, तो वे आपके ब्राउज़र को नियंत्रित कर सकते हैं, जो कि बड़े ब्राउज़र डेवलपर्स को रोकने की कोशिश कर रहे हैं। किसी भी कीमत पर।
BRO_THOM

JQueryUI टैब्स प्लगइन पर एक नज़र डालें: jqueryui.com/tabs । साथ ही उनका प्रलेखन कीबोर्ड नेवीगेशन के बारे में भी विवरण देता है। api.jqueryui.com/tabs । एक नज़र देख लो।
प्रसाद वारगढ़

@ क्या आपने इसे हल किया?
अबीर हुसैन

जवाबों:


13

आप इतिहास का उपयोग कर सकते हैं।

जब एक नया टैब खोला जाता है, तो एक इतिहास स्थिति को पुश करें

history.pushState({page: 1}, "title 1", "?page=1")

संदर्भ: https://developer.mozilla.org/en-US/docs/Web/API/History_API


मैंने आपके कोड का परीक्षण नहीं किया है, लेकिन मुझे लगता है कि यह सही तरीके से नेविगेट करेगा और यह सक्रिय टैब (चयनित टैब) को बनाए रखने में सक्षम नहीं होगा?
अबीर हुसैन

7

आपके पूर्ण कोड के बिना मैं आपको एक उदाहरण नहीं दे सकता, लेकिन आप बस div वाले प्रत्येक टैब में एंकर टैग जोड़ सकते हैं।

उपयोगकर्ता द्वारा टैब लिंक पर क्लिक करने पर यह हर बार URL को अपडेट करेगा। ये URL परिवर्तन ब्राउज़र इतिहास में संग्रहीत किए जाएंगे और पीछे की ओर नेविगेट करते समय याद किए जाएंगे।

<div id="Tab1">
  <h2><a href="#Tab1">Tab 1</a></h2>
  <p>This tab content</p>
</div>

<div id="Tab2">
  <h2><a href="#Tab2">Tab 2</a></h2>
  <p>This tab content</p>
</div>

<div id="Tab3">
  <h2><a href="#Tab3">Tab 3</a></h2>
  <p>This tab content</p>
</div>

<div id="Tab4">
  <h2><a href="#Tab4">Tab 4</a></h2>
  <p>This tab content</p>
</div>

हर बार टैब पर क्लिक करने पर अपडेटेड URL इस तरह दिखाई देगा:

https://example.com#Tab1

https://example.com#Tab2

https://example.com#Tab3

https://example.com#Tab4


2

एक तरफ, आपके अगले टैब फ़ंक्शन को जावास्क्रिप्ट में लिखा गया है, और दूसरी तरफ, ब्राउज़र में बैक बटन ब्राउज़र इतिहास का उपयोग करता है, इसलिए यह आपके कार्यों के लिए अप्रासंगिक है और आपको पिछले टैब पर बिल्कुल भी नहीं मिल सकता है।

तो आपके पास इसे करने के दो तरीके हैं:

पहला: ब्राउज़र को रीफ्रेश करके किसी भिन्न पृष्ठ में प्रत्येक चरण को लोड करने का प्रयास करें, इसलिए पृष्ठ ब्राउज़र इतिहास में सहेजता है और बैक बटन दबाकर आप पिछले चरण को देख सकते हैं

दूसरा: आपके पास अगले चरण बटन की तरह ही पिछले चरण को देखने के लिए "पिछला" बटन होना चाहिए


2
वास्तव में एक तरीका है, और यही कारण है कि ब्राउज़र में इतिहास एपीआई क्यों, यह डेवलपर्स को आपके ऐप में ब्राउज़िंग इतिहास को अपडेट करने की अनुमति देता है, और इसका आमतौर पर SPA डेवलपर
Ma

2

मैंने नीचे ब्राउज़र टैब नेविगेशन के साथ बूटस्ट्रैप टैब का उपयोग किया है, इसका पूरा उदाहरण है

<div class="tabs-Nav border-top-0">
    <ul class="nav" role="tablist">
        <li>
            <a
            id="friends"
            data-pagination-id="friends"
            class="active"
            data-toggle="tab"
            href="#friendsTab"
            role="tab"
            aria-controls="friends"
            aria-selected="true">
                Friends
            </a>
        </li>
        <li>
            <a id="followers" data-pagination-id="followers" class="" data-toggle="tab" href="#followersTab" role="tab" aria-controls="followers" aria-selected="false">
                Followers
            </a>
        </li>
        <li>
            <a id="followings" data-pagination-id="followings" class="" data-toggle="tab" href="#followingTab" role="tab" aria-controls="followings" aria-selected="false">
                Following
            </a>
        </li>
        <li>
            <a id="invites" data-pagination-id="invites" class="" data-toggle="tab" href="#invitesTab" role="tab" aria-controls="invites" aria-selected="false">
                Invites
            </a>
        </li>
    </ul>
</div>


/**
* add // id="friends" data-pagination-id="friends"
* in your html tabs the demo html is also added.
**/
$(document).ready(function () {
    const param = 'tabID';
    $("[data-pagination-id]").click(function () {

        const pageParam = $(this).attr('data-pagination-param') || param;

        //add tabId to the params
        addParam(pageParam, $(this).attr('data-pagination-id'), true);
    });

    const preTab = getParamVal(param);

    if (param) {
        $('[data-pagination-id="'+ preTab +'"]').click();
    }
});


 /**
 * add params to the url if preParams is false then all previous
 * params will be removed.
 **/
addParam = (pageParam, paramValue, preParams) => {
    //get current url without params
    var mainUrl = window.location.href.split('?')[0];

    //get params without url
    var paramString = location.search.substring(1);

    if (preParams && paramString) { //when params found

        //change param string to json object
        var paramsObj = JSON.parse('{"' + decodeURI(paramString).replace(/"/g, '\\"').replace(/&/g, '","').replace(/=/g, '":"') + '"}');
    } else {
        //when current params are empty then create an empty object.
        var paramsObj = {};
    }

    //only for ads tabs
    if (pageParam) {
        //add tabId to the params
        paramsObj[pageParam] = paramValue;

        //push params without refreshing the page.
        history.pushState(false, false, mainUrl + '?' + $.param(paramsObj).replace(new RegExp('%2B', 'gi'), '+'));
    }
};

 /**
 * Get value of a params from url if not exists then return null
 **/
getParamVal = (pageParam) => {
    const mainUrl = window.location.href.split('?')[0];
    const paramString = location.search.substring(1);
    const paramsObj = JSON.parse('{"' + decodeURI(paramString).replace(/"/g, '\\"').replace(/&/g, '","').replace(/=/g, '":"') + '"}');

    return paramsObj[pageParam];
};

आप मेरे कोड का लाइव वर्किंग उदाहरण देख सकते हैं

1> https://www.notesgen.com पर जाएं (डेस्कटॉप का उपयोग करें)

2> छात्र के रूप में अपना खाता बनाएँ

3> मेरे खाते / मेरे डाउनलोड पर जाएं

4> माय कनेक्शन्स पर क्लिक करें


1

हैश को बदलना राज्य को धक्का देने के समान है history.pushStateजो popstateघटना को ट्रिगर करता है । ब्राउजर पर आगे और पीछे हिट करने से पॉप और इन स्टेट्स को धक्का लगेगा जिससे आपको किसी अन्य कस्टम हैंडलर की आवश्यकता नहीं होगी।

पुनश्च: आप :targetअपनी activeकक्षा से सीएसएस शैली जोड़ सकते हैं । window.addEventListener('popstate'यहाँ सिर्फ लॉग आप घटना को दिखाने के लिए, लेकिन event.stateहमेशा इस मामले में अशक्त हो जाएगा।

रन कोड स्निपेट टैब को नेविगेट करने की कोशिश करें और फिर ब्राउज़र बैक और फॉरवर्ड बटन का उपयोग करें।

<style type="text/css">
    div { display: none }
   :target { display: block }
</style>


  <h2><a href="#Tab1">Tab 1</a> | <a href="#Tab2">Tab 2</a> | <a href="#Tab3">Tab 3</a> | <a href="#Tab4">Tab 4</a></h2>


<div id="Tab1">
  <p>This tab 1 content</p>
</div>

<div id="Tab2">
  <p>This tab 2 content</p>
</div>

<div id="Tab3">
  <p>This tab 3 content</p>
</div>

<div id="Tab4">
  <p>This tab 4 content</p>
</div>

<script>
  (() => {
history.pushState(null, '', '#Tab1');
window.addEventListener('popstate', event => {
 console.log(window.location.hash);
});
})()
</script>


0

पहली चीज़ जो आपको चाहिए, क्लिक इवेंट में url को $ event.preventDefualt () द्वारा इतिहास में सबमिट करने से रोकें और History.pushState (data, title, url) के साथ इतिहास को कस्टमाइज़ करें ।

Js में हमारे पास एक घटना है जो उपयोगकर्ता द्वारा पीछे और आगे की घटना को नियंत्रित करने में हमारी मदद करती है। इस घटना का नाम है "पॉपस्टेट"। आप इसे window.addEventListener ('पॉपस्टेट', कॉलबैक) द्वारा उपयोग कर सकते हैं । कॉलबैक फ़ंक्शन में आप टैब को सक्रिय कर सकते हैं और निष्क्रिय कर सकते हैं (क्लास को हटा सकते हैं) और यूआरएल को निकाल सकते हैं।

मैं इसे एक नमूना कोड के साथ दिखाता हूं। बेहतर तरीके से करने और समझने के लिए, इसे एक सर्वर या स्थानीय सर्वर में आज़माएं क्योंकि यहाँ पर url बदलना सीमित है:

$('nav ul a').on('click', function($e) {
        function appendContent(hash) {
            $('#content').text(`Content of  item ${hash} `);
        }
        $e.preventDefault(); // when click the link stay in page
        let _this = this; // get the link tag
        let hash = _this.hash.replace(/\#/, '');
        
        appendContent(hash);
        $('li').removeAttr('class');
        $('a').removeAttr('class');
        $(`a[href*=${hash}]`).addClass('text-white').addClass('border-0').parent().addClass('bg-primary').addClass('last-style');
     
           history.pushState('', _this.text, hash); // add the link in history
  
        window.addEventListener('popstate', function ($e) {
             let hashAgain = location.hash.replace(/\#/, ''); // you extract the hash
            appendContent(hashAgain); // set the content of the back or forward link
          $('li').removeAttr('class');
        $('a').removeAttr('class');
        $(`a[href*=${hash}]`).addClass('text-white').addClass('border-0').parent().addClass('bg-primary').addClass('last-style'); // update the status of tab 
          
            
        });
    });
ul li {
  display: inline-block;
  margin: 1em; 
}

li a,
.last-style {
  border: 1px solid;
  padding: 0.5em 1em;
}
<!doctype html>
<html lang="en">
	<head>
		<meta charset="utf-8" >
		<meta name="viewport" content="width=device-width, initial-scale=1">
		<title>Learning Java Script In Deep</title>
    <link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/4.4.1/css/bootstrap.min.css">
		<script type="text/javascript" src="js/angular/angular.min.js"></script>
	</head>
	<body>
	
		<header class="text-center text-black-50">
			<h1>Learning JS in Deep</h1>
			<nav id="">
				<ul id="">
					<li><a href="#home" class="home">Home</a></li>
					<li><a href="#item1">Item 1</a></li>
					<li><a href="#item2">Item 2</a></li>
					<li><a href="#item3">Item 3</a></li>
					<li><a href="#item4">Item 4</a></li>
				</ul>
			</nav>
		</header>

        <div class="container m-auto text-center" id="content">
            <p>Load <em class="text-danger">Content</em> in Here</p>
        </div>

        <script
  src="https://code.jquery.com/jquery-3.4.1.js"
  integrity="sha256-WpOohJOqMqqyKL9FccASB9O0KwACQJpFTUBLTYOVvVU="
  crossorigin="anonymous"></script>
    <script src="https://cdnjs.cloudflare.com/ajax/libs/popper.js/1.16.0/umd/popper.min.js"></script>
    <!-- Latest compiled JavaScript -->
<script src="https://maxcdn.bootstrapcdn.com/bootstrap/4.4.1/js/bootstrap.min.js"></script>
        
		
	</body>	
</html>

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