Pulsante Indietro / Avanti del browser per navigare tra le schede


14

Ricevo molte lamentele da parte degli utenti che quando usano le mie schede basate su jQuery, trovano fastidioso che quando tornano sul loro browser, non passano alla scheda precedente ma alla pagina precedente . Ho aggiunto i seguenti pulsanti precedente / successivo ma non abbastanza. Come posso riconfigurare i miei pulsanti in modo che gli utenti vadano alla scheda precedente anziché alla pagina precedente quando fanno clic sulla freccia indietro del browser. Puoi provarlo qui .

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

Aggiungi # tab1 e # tab2 dietro l'URL, se pertinente
Gerard,

Ciao @Gerard, non seguendo puoi mostrare un esempio.
Efe,

Dovresti essere consapevole del fatto che impedire a qualsiasi browser di spostarsi avanti o indietro in futuro potrebbe diventare obsoleto a causa del motivo che se ci sono script dannosi, possono e prenderanno il controllo del tuo browser, che è ciò che i grandi sviluppatori di browser stanno cercando di prevenire a tutti i costi.
BRO_THOM

Dai un'occhiata al plug-in Tab jqueryUI : jqueryui.com/tabs . Inoltre la loro documentazione fornisce dettagli anche sulla navigazione da tastiera. api.jqueryui.com/tabs . Dare un'occhiata.
Prasad Wargad,

@Efe l'hai risolto?
Aabir Hussain,

Risposte:



7

Senza il tuo codice completo non posso darti un esempio su misura ma puoi semplicemente aggiungere tag di ancoraggio a ciascuna scheda contenente div.

Ciò aggiornerà l'URL ogni volta che un utente fa clic su un collegamento a scheda. Queste modifiche all'URL verranno archiviate nella cronologia del browser e verranno richiamate durante la navigazione all'indietro.

<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>

L'URL aggiornato apparirà così ogni volta che fai clic su una scheda:

https://example.com#Tab1

https://example.com#Tab2

https://example.com#Tab3

https://example.com#Tab4


2

da un lato, la tua funzione di scheda successiva è scritta in javascript e dall'altro lato, il pulsante Indietro nel browser utilizza la cronologia del browser, quindi questo è irrilevante per le tue funzioni e non ti porta affatto alla scheda precedente.

Quindi hai due modi per farlo accadere:

1 °: prova a caricare ogni passaggio in una pagina diversa aggiornando il browser, in modo che la pagina salvi nella cronologia del browser e premendo il pulsante Indietro puoi vedere il passaggio precedente

2 °: dovresti avere un pulsante "precedente" per vedere il passaggio precedente proprio come il pulsante del passaggio successivo


2
In realtà c'è un modo, ed è per questo che l'API di cronologia nei browser, consente agli sviluppatori di aggiornare la cronologia di navigazione nella tua app, e di solito viene utilizzata in SPA developer.mozilla.org/en-US/docs/Web/API/History_API
ROOT

2

Ho usato le schede bootsrap con la navigazione delle schede del browser di seguito è l'esempio completo

<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];
};

Puoi controllare l'esempio di lavoro dal vivo del mio codice

1> VAI A https://www.notesgen.com (usa desktop)

2> Crea il tuo account come studente

3> VAI A Il mio account / I miei download

4> Fare clic su I miei collegamenti


1

La modifica dell'hash è simile allo stato push history.pushStateche attiva l' popstateevento. Colpire avanti e indietro sul browser farà apparire e spingere questi stati in modo da non avere bisogno di nessun altro gestore personalizzato.

PS: puoi aggiungere lo stile css alla :targettua activeclasse. Il window.addEventListener('popstate'qui registra solo per mostrarti l'evento ma event.statesarà sempre nullo in questo caso.

Esegui frammento di codice prova a navigare tra le schede, quindi utilizza i pulsanti Indietro e Avanti del browser.

<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

prima cosa che ti serve, impedisci al link di inviare l'URL nella cronologia di $ event.preventDefualt () nell'evento click e personalizza la cronologia con history.pushState (dati, titolo, url) .

In js abbiamo un evento che ci aiuta a controllare l'evento di andata e ritorno dell'utente. Il nome di questo evento è "popstate". puoi usarlo da window.addEventListener ('popstate', callback) . nella funzione di richiamata è possibile attivare e disattivare la scheda (aggiungere e rimuovere la classe) ed estrarre l'URL.

Lo mostro con un codice di esempio. per fare e capire meglio, provalo in un server o in un server locale perché qui dentro la modifica dell'URL è limitata:

$('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>

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.