2009-02-20 4 views
47

J'ai essayé de trouver un moyen de remplacer window.location.hash par l'onglet actuellement sélectionné dans Jquery UI Tabs.Modification de location.hash avec les onglets jquery ui

J'ai essayé:

$("#tabs > ul").tabs(); 
$("#tabs > ul").bind("tabsshow", function(event, ui) { 
window.location.hash = ui.tab; 
}) 

Il en résulte la modification du hachage #undefined lorsque l'onglet est modifiée.

J'ai aussi essayé:

$("#tabs > ul").tabs({ 
select: function(event, ui) { 
window.location.hash = ui.tab } 
}); 

Mais cela ne semble pas être déclenchée à tout.

Toute aide serait appréciée. Merci. Editer: Il semble qu'une partie de mon problème initial a quelque chose à voir avec js ailleurs qui interfère avec cela. La réponse acceptée et l'autre réponse suggérée sont légèrement modifiées. Merci a tous.

+0

essayez-vous d'ouvrir un lien dans l'onglet où le lien cliqué de ? –

+0

Non, les liens que j'ouvre font partie de la page courante elle-même, pas d'ajax/etc. – Rob

+0

Ceci est une démo assez impressionnant de cette technique: [http://jqueryfordesigners.com/jquery-tabs/](http://jqueryfordesigners.com/jquery-tabs/) –

Répondre

49

Dans votre gestionnaire d'événements, la fonction ui.tab est un élément d'ancrage. Vous pouvez récupérer sa valeur de hachage comme ceci:

$("#tabs > ul").tabs(); 
$("#tabs > ul").bind("tabsshow", function(event, ui) { 
    window.location.hash = ui.tab.hash; 
}) 

Cela fonctionne pour vous?

+1

Malheureusement non, je reçois beaucoup de ui.tab est des erreurs non définies lors du chargement de la page ou changement d'onglet. – Rob

+0

J'ai essayé avec la démo qui apparaît sur la page de doc et fonctionne bien avec FF 3 et IE 7. Êtes-vous déclencher les événements manuellement? – Serxipc

+1

J'ai essayé comme vous l'avez suggéré avec la page de démonstration et votre solution a fini par fonctionner, merci pour la solution, je vais devoir comprendre ce que mon code empêchait de fonctionner. Merci – Rob

4

Serait-ce ce que vous allez faire?

$("#tabs > ul").tabs({ 
    select: function(event, ui) 
    { 
     window.location = "#" + ui.tab; 
    } 
}); 
+0

J'ai essayé cela sans aucune chance. J'ai même essayé de mettre une alerte avant le paramètre window.location et il n'apparaît pas lors de la modification des onglets. La seule façon de l'activer était de lier tabsshow mais ça finit avec un ui.tab indéfini – Rob

+1

Quand j'ai essayé d'utiliser le code de démonstration, cette solution légèrement modifiée fonctionnait. Le seul changement que je suggérerais est de le faire: window.location.hash = ui.tab.hash; – Rob

+1

Cela a fonctionné comme la meilleure solution pour moi. D'autres suggestions ont entraîné le saut de la page vers l'onglet sélectionné lorsque le hachage de l'emplacement a été mis à jour. Appuyant "window.location.hash = ui.tab.hash;" à la place de ce qui est fourni dans l'exemple, tho. –

3
$('#tabs').tabs({ 
    select: function(event, ui){ 
     window.location = ui.tab.href; 
    } 
}); 
0

Il semble que ui.tab ne renvoie pas de chaîne valide. (Au lieu de cela, il renvoie indéfini, donc vous diriez qu'il ne renvoie rien du tout.)

Essayez de regarder dans la version de développement de ui.jquery.js s'il y a des retours là-bas, peut-être que vous devez appeler un enfant de ui.tab ;-)

+0

@Fabdrol vous avez besoin de ui.tab.index;) –

25
$('#tabs').tabs({ 
    select: function(event, ui) { 
     window.location.hash = ui.tab.hash; 
    } 
}); 
14

Bien que certaines des solutions ci-dessus fonctionnent, ils provoquent la page de sauter autour Dans certains cas, l'API window.location.hash est conçue pour vous amener à une partie spécifique de la page.

Cette solution soignée proposée here, permet de résoudre cette question

$("#tabs").bind("tabsshow", function(event, ui) { 
    history.pushState(null, null, ui.tab.hash); 
    }); 
+0

Cela devrait probablement être marqué comme la bonne réponse. – wblaschko

8

Cela a fonctionné pour moi, jQuery UI 1.10:

$('#elexumaps_events_tabs').tabs({ 
    activate: function(event, ui) { 
     window.location.hash=ui.newPanel.selector; 
    } 
}); 

Voir aussi: http://api.jqueryui.com/tabs/#event-activate

+0

cela fonctionne bien pour moi, cependant, j'utilise ajax pour charger mes onglets, donc le hachage est toujours "ui-tabs-1", "ui-tabs-2", etc ... Cela signifie quand je commander, ajouter ou supprimer des onglets, les marque-pages se brisent. Savez-vous un moyen de le faire où je peux utiliser des noms de hachage personnalisés pour les onglets? – Billkamm

3

Beaucoup des réponses ci-dessus don ne fonctionne pas avec la version actuelle des onglets de l'interface utilisateur jQuery. Voici ce que je suis actuellement en utilisant:

var tabsUi = $('#tabs'); 
tabsUi.tabs(); 

// Add hash to URL when tabs are clicked 
tabsUi.find('> ul a').click(function() { 
    history.pushState(null, null, $(this).attr('href')); 
}); 

// Switch to correct tab when URL changes (back/forward browser buttons) 
$(window).bind('hashchange', function() { 
    if (location.hash !== '') { 
     var tabNum = $('a[href=' + location.hash + ']').parent().index(); 
     tabsUi.tabs('option', 'active', tabNum); 
    } else { 
     tabsUi.tabs('option', 'active', 0); 
    } 
}); 
+0

Solution parfaite, la seule qui a fonctionné pour moi :) –

+0

grande solution a travaillé pour moi – jason

3

Mon chemin pour jQuery UI 1.10.3

$("#tabs").tabs({ 
    beforeActivate: function(event, ui) { 
     var hash = ui.newTab.children("li a").attr("href"); 
     window.location.hash = hash; 
    } 
}); 
1

Cela a fonctionné pour moi en utilisant Jquery 1.8

$('#tabs').tabs({ 
    activate: function(event, ui) { 
     window.location.hash = ui.newPanel.attr('id'); 
    } 
}); 
0

Ce code fonctionne bien pour moi:

$('#tabs').tabs({ 
    select: function(event, ui) { 
     window.location = $(ui.tab).attr('href'); 
    } 
}); 
6

ma solution simple sans sauter:

$("#tabs").tabs({ 
     activate: function (event, ui) { 
      var scrollPos = $(window).scrollTop(); 
      window.location.hash = ui.newPanel.selector; 
      $(window).scrollTop(scrollPos); 
     } 
    }); 
-1

Ce morceau de code a fonctionné pour moi:

window.location.hash=""; 
1

Après avoir regardé d'autres questions et les documents de l'API jQueryUI, j'ai trouvé que cela a fini par fonctionner pour moi.

$(document).ready(function() { 
    $("#tabs").tabs({ 
     activate: function(event, ui) { 
      location.hash = ui.newTab.children(".ui-tabs-anchor").attr("href").substr(1); 
     } 
    }); 
}); 
0

Ce code fonctionne pour moi:

$("#tabs").tabs({ 
    activate: function(event, ui) { 
     window.location.hash=ui.newPanel.selector; 
    } 
}); 
0

Le code suivant a fonctionné pour moi ..

$("#tabs").tabs({ 
    activate : function(event, ui) { 
    window.location.hash = ui.newPanel[0].id; 
    } 
}); 
Questions connexes