изменение location.hash с помощью вкладок jquery ui - PullRequest
47 голосов
/ 20 февраля 2009

Я пытался найти способ изменить window.location.hash на текущую выбранную вкладку в вкладках пользовательского интерфейса Jquery .

Я пробовал:

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

Это приводит к изменению хеша на #undefined при смене вкладки.

Я тоже пробовал:

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

Но, похоже, это вообще не сработало.

Любая помощь будет оценена. Спасибо.

Редактировать: Похоже, что часть моей первоначальной проблемы была связана с тем, что js где-то еще мешал этому. И принятый ответ, и другой предложенный ответ, слегка измененный, работают. Спасибо всем.

Ответы [ 17 ]

49 голосов
/ 20 февраля 2009

В вашей функции обработчика событий ui.tab является якорным элементом. Вы можете получить его хеш-значение следующим образом:

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

Это работает для вас?

25 голосов
/ 19 октября 2010
$('#tabs').tabs({
    select: function(event, ui) {
        window.location.hash = ui.tab.hash;
    }
});
14 голосов
/ 05 октября 2012

Хотя некоторые из вышеперечисленных решений работают, в некоторых случаях они заставляют страницу перепрыгивать, так как API window.location.hash предназначен для перехода к определенной части страницы.

Это аккуратное решение, предложенное здесь , решает эту проблему

  $("#tabs").bind("tabsshow", function(event, ui) { 
    history.pushState(null, null, ui.tab.hash);
  });
8 голосов
/ 28 февраля 2013

Это сработало для меня, jQuery UI 1.10:

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

Смотри также: http://api.jqueryui.com/tabs/#event-activate

6 голосов
/ 17 февраля 2014

мое простое решение без прыжков:

    $("#tabs").tabs({
        activate: function (event, ui) {
            var scrollPos = $(window).scrollTop();
            window.location.hash = ui.newPanel.selector;
            $(window).scrollTop(scrollPos);
        }
    });
4 голосов
/ 20 февраля 2009

Будет ли это то, что вы собираетесь?

$("#tabs > ul").tabs({ 
   select: function(event, ui) 
   { 
      window.location = "#" + ui.tab;
   }
});
3 голосов
/ 09 мая 2009
$('#tabs').tabs({
    select: function(event, ui){
      window.location = ui.tab.href;
    }
});
3 голосов
/ 19 июня 2013

Многие из приведенных выше ответов не работают с текущей версией вкладок пользовательского интерфейса jQuery. Вот что я сейчас использую:

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);
    }
});
3 голосов
/ 23 сентября 2013

Мой путь для 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 голос
/ 12 января 2015

Просмотрев некоторые другие вопросы и документы по API jQueryUI, я обнаружил, что это сработало для меня.

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