Botão voltar / próximo do navegador para navegar entre as guias

14

Estou recebendo muitas reclamações dos usuários de que, quando estão usando minhas guias baseadas em jQuery, eles acham irritante que, quando revidam no navegador, não vão para a guia anterior, mas para a página anterior . Eu adicionei os seguintes botões anterior / seguinte, mas não o suficiente. Como reconfigurar meus botões para que os usuários acessem a guia anterior e não a página anterior quando clicam na seta para trás do navegador. Você pode testá-lo aqui .

$('#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
fonte
Adicionar # tab1 e # tab2 atrás do URL quando relevante
Gerard
Olá @Gerard, não seguindo, você pode mostrar um exemplo.
Efe
Você deve estar ciente de que impedir que qualquer navegador navegue para frente ou para trás pode ficar obsoleto no futuro devido ao motivo de que, se houver scripts maliciosos, eles poderão e assumirão o controle do navegador, que é o que grandes desenvolvedores de navegadores estão tentando impedir a todo custo.
BRO_THOM
Dê uma olhada no plug-in jqueryUI Tabs: jqueryui.com/tabs . A documentação também fornece detalhes sobre as navegações do teclado. api.jqueryui.com/tabs . Dar uma olhada.
Prasad Wargad
@Fefe você resolveu?
Aabir Hussain

Respostas:

13

Você pode usar o histórico.

Envie um estado do histórico quando uma nova guia for aberta

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

Referência: https://developer.mozilla.org/en-US/docs/Web/API/History_API

isidat
fonte
Não testei seu código, mas acho que ele navegará corretamente e não será capaz de manter a guia ativa (guia selecionada)?
Aabir Hussain
7

Sem o seu código completo, não posso dar um exemplo personalizado, mas você pode simplesmente adicionar tags âncora a cada guia que contém div.

Isso atualizará o URL sempre que um usuário clicar em um link de guia. Essas alterações de URL serão armazenadas no histórico do navegador e serão recuperadas ao navegar para trá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>

O URL atualizado terá esta aparência sempre que você clicar em uma guia:

https://example.com#Tab1

https://example.com#Tab2

https://example.com#Tab3

https://example.com#Tab4

DreamTeK
fonte
2

por um lado, sua próxima função de guia é escrita em javascript e, por outro lado, o botão voltar no navegador usa o histórico do navegador, portanto isso é irrelevante para suas funções e não pode levá-lo à guia anterior.

Então você tem duas maneiras de fazer isso acontecer:

1º: tente carregar cada etapa em uma página diferente atualizando o navegador, para que a página seja salva no histórico do navegador e, pressionando o botão Voltar, você poderá ver a etapa anterior

Segundo: você deve ter um botão "anterior" para ver a etapa anterior, assim como o botão da próxima etapa

Saeed Jamali
fonte
2
Na verdade, existe uma maneira, e é por isso que a API de histórico nos navegadores permite que os desenvolvedores atualizem o histórico de navegação em seu aplicativo, e geralmente é usado no SPA developer.mozilla.org/en-US/docs/Web/API/History_API
Ma 'moun othman 5/01
2

Eu usei abas bootsrap com a navegação da guia do navegador abaixo, é o exemplo 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];
};

Você pode verificar o exemplo ao vivo do meu código

1> Acesse https://www.notesgen.com (use a área de trabalho)

2> Crie sua conta como aluno

3> Ir para minha conta / meus downloads

4> Clique em Minhas conexões

Aabir Hussain
fonte
1

Alterar o hash é semelhante ao estado de history.pushStateenvio que aciona o popstateevento. Pressionar para frente e para trás no navegador abrirá e empurrará esses estados para que você não precise de nenhum outro manipulador personalizado.

PS: Você pode adicionar estilo css :targetda sua activeclasse. O window.addEventListener('popstate'aqui apenas registra para mostrar o evento, mas o event.statesempre será nulo neste caso.

Execute o snippet de código, tente navegar pelas guias e use os botões voltar e avançar do 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
fonte
0

a primeira coisa que você precisa, impeça o link de enviar o URL no histórico por $ event.preventDefualt () no evento click e personalize o histórico com history.pushState (dados, título, URL) .

Em js, temos um evento que nos ajuda a controlar o evento de retorno e encaminhamento pelo usuário. Este nome do evento é "popstate". você pode usá-lo por window.addEventListener ('popstate', retorno de chamada) . na função de retorno de chamada, você pode ativar e desativar a guia (adicionar e remover classe) e extrair o URL.

Eu mostro isso com um código de exemplo. para fazer e entender melhor, tente em um servidor ou servidor local, porque a mudança de URL aqui é limitada:

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