Botón de navegación hacia atrás / siguiente para navegar entre pestañas

14

Recibo muchas quejas de los usuarios de que cuando usan mis pestañas basadas en jQuery, les resulta molesto que cuando vuelven a presionar en su navegador, no van a la pestaña anterior sino a la página anterior . Agregué los siguientes botones anterior / siguiente pero no lo suficiente. ¿Cómo puedo reconfigurar mis botones para que los usuarios accedan a la pestaña anterior en lugar de a la página anterior cuando hacen clic en la flecha hacia atrás del navegador? Puedes probarlo aquí .

$('#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;
});
Efe
fuente
Agregue # tab1 y # tab2 detrás de la URL cuando sea relevante
Gerard
Hola @Gerard, si no sigues, ¿puedes mostrar un ejemplo?
Efe
Debe tener en cuenta que evitar que un navegador navegue hacia atrás o hacia adelante puede quedar obsoleto en el futuro debido a que si hay scripts maliciosos, pueden y tomarán el control de su navegador, que es lo que los grandes desarrolladores de navegadores están tratando de evitar cueste lo que cueste.
BRO_THOM
Eche un vistazo al complemento jqueryUI Tabs: jqueryui.com/tabs . Además, su documentación también brinda detalles sobre la navegación del teclado. api.jqueryui.com/tabs . Echar un vistazo.
Prasad Wargad
@Efe lo resolviste?
Aabir Hussain

Respuestas:

13

Puedes usar Historia.

Empuje un estado del historial cuando se abre una nueva pestaña

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

Referencia: https://developer.mozilla.org/en-US/docs/Web/API/History_API

isidat
fuente
No he probado su código, pero creo que navegará correctamente y no podrá mantener la pestaña activa (pestaña seleccionada).
Aabir Hussain
7

Sin su código completo, no puedo darle un ejemplo a medida, pero simplemente puede agregar etiquetas de anclaje a cada pestaña que contenga div.

Esto actualizará la URL cada vez que un usuario haga clic en un enlace de pestaña. Estos cambios de URL se almacenarán en el historial del navegador y se recuperarán al navegar hacia atrás.

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

La URL actualizada se verá así cada vez que haga clic en una pestaña:

https://example.com#Tab1

https://example.com#Tab2

https://example.com#Tab3

https://example.com#Tab4

DreamTeK
fuente
2

por un lado, su siguiente función de pestaña está escrita en javascript, y por el otro lado, el botón de retroceso en el navegador usa el historial del navegador, por lo que esto es irrelevante para sus funciones y no podría llevarlo a la pestaña anterior.

Entonces tienes dos formas de hacerlo realidad:

Primero: intente cargar cada paso en una página diferente actualizando el navegador, para que la página se guarde en el historial del navegador y presionando el botón Atrás puede ver el paso anterior

2º: debe tener un botón "anterior" para ver el paso anterior al igual que el botón del siguiente paso

Saeed Jamali
fuente
2
En realidad, hay una manera, y es por eso que el API de historial en los navegadores, permite a los desarrolladores actualizar el historial de navegación en su aplicación, y generalmente se usa en SPA developer.mozilla.org/en-US/docs/Web/API/History_API
ROOT
2

He usado pestañas de arranque con la navegación de pestañas del navegador a continuación es el ejemplo 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];
};

Puede consultar el ejemplo de trabajo en vivo de mi código

1> VAYA A https://www.notesgen.com (use el escritorio)

2> Crea tu cuenta como estudiante

3> IR A Mi cuenta / Mis descargas

4> Haga clic en Mis conexiones

Aabir Hussain
fuente
1

Cambiar el hash es similar a presionar el estado history.pushStateque desencadena el popstateevento. Al presionar hacia atrás y hacia adelante en el navegador, aparecerán y empujarán estos estados para que no necesite ningún otro controlador personalizado.

PD: Puedes agregar estilo CSS a :targettu activeclase. Los window.addEventListener('popstate'registros aquí sólo para mostrar el evento, pero el event.statesiempre será nula en este caso.

Ejecute el fragmento de código, intente navegar por las pestañas y luego use los botones de avance y retroceso del navegador.

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

imu
fuente
0

lo primero que necesita, evite el enlace para enviar la url en el historial por $ event.preventDefualt () en el evento click y personalice el historial con history.pushState (datos, título, url) .

En js tenemos un evento que nos ayuda a controlar el evento de ida y vuelta por usuario. Este nombre de evento es "popstate". puede usarlo mediante window.addEventListener ('popstate', devolución de llamada) . en la función de devolución de llamada, puede activar y desactivar la pestaña (agregar y eliminar clase) y extraer la URL.

Muestro esto con un código de muestra. para hacerlo y comprenderlo mejor, pruébelo en un servidor o servidor local porque allí el cambio de URL en el aquí es limitado:

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

Hassan Asadi
fuente