Предотвращение прокрутки при использовании хеша URI для идентификации вкладки - PullRequest
11 голосов
/ 24 декабря 2011

Я использую пользовательский интерфейс JQuery для создания вкладок в своем приложении.Мне нужно, чтобы вкладки были связанными (прямая ссылка, которая открывает страницу и выбирает правильную вкладку).Это делается с помощью хеш-тега / фрагментированного идентификатора .Но у меня есть проблема, когда содержимое над вкладками и внутри вкладок очень длинное.

При нажатии на вкладки страница прокручивается вниз до начала вкладки.Это не то, что я хочу.

Я использую Jquery 1.7.1 и Jquery UI 1.8.16.

Код javascript / Jquery - это стандартные вкладки Jquery UI сдополнение к событию "табсшоу".Это предлагается в Изменение location.hash с помощью вкладок jquery ui (вопрос Stackoverflow) и Вкладки пользовательского интерфейса JQuery: обновление URL с помощью хэша при нажатии на вкладку (блог - технический дневник Робина)

$(document).ready(function() {
    $("#tabs").tabs();

    /**
     * Add hash to URL of the current page
     * 
     * http://chwang.blogspot.com/2010/02/jquery-ui-tabs-updating-url-with-hash.html
     * /481414/izmenenie-location-hash-s-pomoschy-vkladok-jquery-ui
     */
    $("#tabs").bind('tabsshow',function(event, ui) {
        window.location.hash = ui.tab.hash;
    });
});

Следующий HTML-код можно использовать для проверки поведения

<script src="http://ajax.googleapis.com/ajax/libs/jquery/1.7.1/jquery.min.js" type="text/javascript"></script>
<script src="http://ajax.googleapis.com/ajax/libs/jqueryui/1.8.16/jquery-ui.min.js" type="text/javascript"></script>
<div style="height: 400px;">Some other content</div>
<div id="tabs" class="ui-tabs ui-widget ui-widget-content ui-corner-all">
    <ul class="ui-tabs-nav ui-helper-reset ui-helper-clearfix ui-widget-header ui-corner-all">
        <li class="ui-state-default ui-corner-top"><a href="#tab_1"><span>Tab 1</span></a></li>
        <li class="ui-state-default ui-corner-top"><a href="#tab_100"><span>Tab 100</span></a></li>
        <li class="ui-state-default ui-corner-top ui-tabs-selected ui-state-active"><a href="#tab_1000"><span>Tab 1000</span></a></li>
    </ul>

    <div id="tab_1" class="ui-tabs-panel ui-widget-content ui-corner-bottom ui-tabs-hide">
        <table style="height: 1000px"><tr><td>Hello. This is tab 1</td></tr></table>
    </div>


    <div id="tab_100" class="ui-tabs-panel ui-widget-content ui-corner-bottom ui-tabs-hide">
        <table style="height: 1000px"><tr><td>Hello. This is tab 100.</td></tr></table>
    </div>


    <div id="tab_1000" class="ui-tabs-panel ui-widget-content ui-corner-bottom"><h2>Heading</h2>
        <table style="height: 1000px"><tr><td>Hello. This is tab 1000.</td></tr></table>
    </div>
</div>

При открытии страницы со следующим URL-адресом должна быть открыта вкладка 1, а не прокрутка вниз до места, где она находится.начинается.То же самое касается нажатия на одну из вкладок.

file.html#tab_1

Ответы [ 8 ]

5 голосов
/ 24 декабря 2011

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

$("#tabs").tabs({
    create: function(event, ui) {
        // get tab plugin data
        var tabs = $('#tabs').data('tabs'),
            // tabs.anchors contains all of the tab anchors
            links = tabs.anchors;
        // tabs.panels contains each tab
        tabs.panels.each(function(i){
            // just adding a "mod_" prefix to every ID/hash
            this.id = 'mod_' + this.id;
            links[i].hash = '#' + this.id;
        });
    }
});

/**
 * Add hash to URL of the current page
 * 
 * http://chwang.blogspot.com/2010/02/jquery-ui-tabs-updating-url-with-hash.html
 * /481414/izmenenie-location-hash-s-pomoschy-vkladok-jquery-ui
 */
$("#tabs").bind('tabsshow', function(event, ui) {
    // remove the prefix from the ID, so we're showing the original ID in the hash
    window.location.hash = ui.tab.hash.replace('mod_', '');
});
3 голосов
/ 23 января 2015

Я использую jQuery 1.11.1. Это хорошо работает для меня.

$("#tabs").tabs(); //initialize tabs
$(function() {
    $("#tabs").tabs({
        activate: function(event, ui) {
            var scrollTop = $(window).scrollTop(); // save current scroll position
            window.location.hash = ui.newPanel.attr('id'); // add hash to url
            $(window).scrollTop(scrollTop); // keep scroll at current position
        }
    });
});

Вкладки jQuery UI, обновление URL при нажатии на другую вкладку

Спасибо Джеффу Б за указание на меня здесь http://jsfiddle.net/jtbowden/ZsUBz/44/

3 голосов
/ 30 августа 2014

Как уже упоминали другие, код @Mottie, возможно, когда-то работал на старых версиях jQuery UI, но это определенно перестало работать.API-интерфейс вкладок jQuery UI довольно сильно изменился с тех пор, как он был написан, поэтому вот обновленная версия, которая работает как минимум с jQuery 1.10.2

Демо здесь: http://jsfiddle.net/xsx5u5g2/

var $tabs = $("#tabs");
$tabs.tabs({
  create: function(event, ui) {
    // Adjust hashes to not affect URL when clicked.
    var widget = $tabs.data("uiTabs");
    widget.panels.each(function(i){
      this.id = "uiTab_" + this.id; // Prepend a custom string to tab id.
      widget.anchors[i].hash = "#" + this.id;
      $(widget.tabs[i]).attr("aria-controls", this.id);
    });
  },
  activate: function(event, ui) {
    // Add the original "clean" tab id to the URL hash.
    window.location.hash = ui.newPanel.attr("id").replace("uiTab_", "");
  },
});
1 голос
/ 16 января 2013

Вы должны изменить хеш окна без прокрутки страницы.Вот уже вопрос о SO - Изменение document.location.hash без прокрутки страницы .

Необходимые изменения:

$("#tabs").bind('tabsshow',function(event, ui) {
    setHashWithoutScroll(ui.tab.hash);
});

Функция setHashWithoutScrollпо вышеуказанной ссылке.

function setHashWithoutScroll(hash) {
    hash = hash.replace( /^#/, '' );
    var fx, node = $( '#' + hash );
    if ( node.length ) {
      node.attr( 'id', '' );
      fx = $( '<div></div>' )
              .css({
                  position:'absolute',
                  visibility:'hidden',
                  top: $(document).scrollTop() + 'px'
              })
              .attr( 'id', hash )
              .appendTo( document.body );
    }
    document.location.hash = hash;
    if ( node.length ) {
      fx.remove();
      node.attr( 'id', hash );
    }
}

Принятый ответ выдает ошибку - jQuery UI Tabs: Mismatching fragment identifier.Так что мне пришлось использовать это.

0 голосов
/ 15 ноября 2015

На этой странице много ответов, и, на мой взгляд, большинство из них слишком усложняют простую проблему.

По сути, решение от Дэвид-Томаса является самым простым и наиболее эффективным.По сути, все, что вы хотите сделать, это предотвратить поведение ссылки по умолчанию для ссылки на вкладке (тег <a>).

Тот же ответ применяется к вкладкам начальной загрузки, где необходимо указать обработчик щелчка

   $('.nav-tabs a').click(function(e){
        e.preventDefault();
        $(this).tab('show');
    });
0 голосов
/ 09 февраля 2015

Этот простой метод работал для меня:

/* Prevent scroll to tab on click */
$(document).ready(function(){
  $("a.ui-tabs-anchor").click(function(e){
      e.preventDefault();
      return false;
  });
});
0 голосов
/ 22 ноября 2013

Я пробовал решение @mottie, но сейчас не работает (через 2 года).
Вызывает ошибку: TypeError: tabs is undefined.

Следующее является приемлемым решением для меня:

// preventing scroll
// $("#tabs li a[href^='#tab']").bind('click',function(e){ // less general but better
$("#tabs li a").bind('click',function(e){
    $("html, body").animate({ scrollTop: 0 });
});
0 голосов
/ 03 мая 2013

Я только что добавил следующее в свой javascript:

    $('#tabs').tabs();
    // Direct links to the tabs, e.g. /my-page#tab-id can cause browsers
    // to scroll down to half-way down the page, which is ugly. We override that here.
    // (This can cause a brief FOUC effect where the page first displays then scrolls up)
    window.scrollTop = '0';
    window.scrollTo(0,0);

В MSIE я получаю краткий FOUC эффект, когда страница загружается прокручивается частично вниз, затем щелкает наthe top.

В Firefox это прекрасно работает без видимого FOUC.

В Chrome это не работает вообще - см. scrollTop не работает ни в Chrome, нисделать предлагаемые обходные пути

...