2009-02-20 2 views
47

Я пытался найти способ изменить window.location.hash на текущую выбранную вкладку в Jquery UI Tabs.change location.hash с вкладками jquery ui

Я пробовал:

$("#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 где-то еще, мешая этому. Как принятый ответ, так и другой предложенный ответ слегка изменены, работают. Спасибо всем.

+0

вы пытаетесь открыть ссылку на вкладке, где ссылка щелкнул из ? –

+0

Нет, ссылки, которые я открываю, являются частью самой текущей страницы, нет ajax/etc. – Rob

+0

Это довольно удивительная демонстрация этой техники: [http://jqueryfordesigners.com/jquery-tabs/](http://jqueryfordesigners.com/jquery-tabs/) – 2010-07-22 18:32:03

ответ

49

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

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

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

+1

К сожалению нет, я получаю много ui.tab - это неопределенные ошибки при загрузке страницы или изменении вкладок. – Rob

+0

Я пытался с демонстрацией, которая появляется на странице документа и отлично работает с FF 3 и IE 7. Вы запускаете события вручную? – Serxipc

+1

Я пробовал, как вы предлагали на демо-странице, и ваше решение закончилось работой, спасибо за решение, мне нужно выяснить, что еще в моем коде не остановило его работу. Спасибо – Rob

4

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

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

Я пробовал это без везения. Я даже попытался поставить предупреждение перед установкой window.location, и он не появляется при изменении вкладок. Единственный способ, которым я мог его активировать, - это привязать tabsshow, но это заканчивается неопределенным ui.tab – Rob

+1

Когда я попытался использовать демо-код, это решение слегка изменило работу. Единственное изменение, которое я бы предложил, это сделать: window.location.hash = ui.tab.hash; – Rob

+1

Это работало как лучшее решение для меня. Другие предложения привели к тому, что страница переместилась на вкладку, выбранную при обновлении хеша местоположения. Seconding "window.location.hash = ui.tab.hash;" вместо того, что представлено в примере, –

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

Похоже, что ui.tab сам не возвращает допустимую строку. (вместо этого он возвращает undefined, поэтому вы бы сказали, что он ничего не возвращает.)

Попробуйте оглянуться в dev-версии ui.jquery.js, есть ли там какие-либо возвращения, возможно, вам нужно позвонить ребенок ui.tab ;-)

+0

@Fabdrol вам нужно ui.tab.index;) –

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

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

Это изящное решение предлагаемого here, решает эту проблему

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

Это должно быть отмечено как правильный ответ. – wblaschko

8

Это работает для меня, 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

+0

это хорошо работает для меня, однако я использую ajax для загрузки моих вкладок, поэтому хэш всегда «ui-tabs-1», «ui-tabs-2» и т. Д. Это означает, упорядочивать, добавлять или удалять вкладки, которые блокируют закладки. Вы знаете способ сделать это, когда я могу использовать пользовательские хэш-имена для вкладок? – Billkamm

3

Многие из приведенных выше ответов донских Не работайте с текущей версией вкладок пользовательского интерфейса 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); 
    } 
}); 
+0

Идеальное решение, единственное, что сработало для меня :) –

+0

Отличное решение для меня – jason

3

Мой путь для 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

Это работал для меня с помощью Jquery 1.8

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

Этот код работает нормально для меня:

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

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

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

Этот фрагмент кода работает для меня:

window.location.hash=""; 
1

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

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

Этот код работает для меня:

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

Следующий код работает для меня ..

$("#tabs").tabs({ 
    activate : function(event, ui) { 
    window.location.hash = ui.newPanel[0].id; 
    } 
}); 
Смежные вопросы