使用直接 URL link 的页面上的目标选项卡会在选项卡单击时中断 URL

Targeting tabs on page with direct URL link breaks URL on tab click

我正在尝试在我的页面中创建一个选项卡式区域。这些选项卡在不离开页面的情况下导航隐藏区域。我还希望能够 link 到页面中的某个区域。它工作正常,除非您单击菜单并显示隐藏区域,它仅使用选项卡扩展名重写 URL,从而破坏 URL 的 link。所以有人试图分享 link 不知道格式..

我正在使用这段代码 https://css-tricks.com/examples/OrganicTabsReplaceState,我认为没有问题。

您可以在此处查看有关我的问题的现场演示:http://bit.ly/1IP1ST4

单击选项卡正在删除: /products/eurorack-modules/waveform-modifiers/reactive-shaper/

并将其替换为 ?tab=mytabname

应该是简单的添加吧。我正在努力弄清楚为什么..?

如果您检查您提供的第一个 link 的来源,您会看到选项卡包含 link,如下所示:

<a href="#featured" class="">Featured</a>

那是页内 link。您应该在页面 links 中使用 #。整个 url 被替换的原因是因为它将 href 解释为一个新的 url 去。 # 查看当前页面。

这个版本的 organictabs.jquery.js 最终得到它的工作似乎是它处理 URL 的方式的问题。也许这会对其他人有所帮助。

// IIFE
(function($) {

    // Define Plugin
$.organicTabs = function(el, options) {

        // JavaScript native version of this
    var base = this;

    // jQuery version of this
    base.$el = $(el);

    // Navigation for current selector passed to plugin
    base.$nav = base.$el.find(".nav");

    // Returns the fragment identifier of the given URL
    function getFragmentIdentifier(url) {
        if(url && url.match && url.match(/#(.*)/)) {
            return RegExp.;
        }
    }

    // Remove the query string from the url
    function noQueryString(url) {
        if(url && url.match && url.match(/^([^\?]*)\??/)) {
            return RegExp.;
        }
    }

    // Runs once when plugin called       
    base.init = function() {

            // Pull in arguments
        base.options = $.extend({},$.organicTabs.defaultOptions, options);

        // Accessible hiding fix (hmmm, re-look at this, screen readers still run JS)
        $(".hide").css({
            "position": "relative",
            "top": 0,
            "left": 0,
            "display": "none"
        }); 

        // When navigation tab is clicked...
        base.$nav.delegate("a", "click", function(e) {

                // no hash links
                e.preventDefault();

            // Figure out current list via CSS class
            var curList = getFragmentIdentifier(base.$el.find("a.current").attr("href")),
            // List moving to
                $newList = $(this),

            // Figure out ID of new list
                listID = getFragmentIdentifier($newList.attr("href")),

            // Set outer wrapper height to (static) height of current inner list
                $allListWrap = base.$el.find(".list-wrap"),
                curListHeight = $allListWrap.height();
                    $allListWrap.height(curListHeight);


            if ((listID != curList) && ( base.$el.find(":animated").length == 0)) {
                // Fade out current list
                base.$el.find("#"+curList).fadeOut(base.options.speed, function() {

                    // Fade in new list on callback
                    base.$el.find("#"+listID).fadeIn(base.options.speed);

                    // Adjust outer wrapper to fit new list snuggly
                    var newHeight = base.$el.find("#"+listID).height();
                    $allListWrap.animate({
                        height: newHeight
                    }, base.options.speed);

                    // Remove highlighting - Add to just-clicked tab
                    base.$el.find(".nav li a").removeClass("current");
                    $newList.addClass("current");

                                            // Change window location to add URL params
                                            if (window.history && history.pushState) {
                                              // NOTE: doesn't take into account existing params
                                                history.replaceState("", "", noQueryString(window.location.href) + "?" + base.options.param + "=" + listID);
                                            }    
                });

            }   

        });

        var queryString = {};
                    window.location.href.replace(
                        new RegExp("([^?=&]+)(=([^&]*))?", "g"),
                        function([=10=], , , ) { queryString[] = ; }
                    );

        if (queryString[base.options.param]) {

            var tab = $("a[href='#" + queryString[base.options.param] + "']");

                        tab
                            .closest(".nav")
                            .find("a")
                            .removeClass("current")
                            .end()
                            .next(".list-wrap")
                            .find("ul")
                            .hide();
                        tab.addClass("current");
                        $("#" + queryString[base.options.param]).show();

                };            

    };
    base.init();
};

    $.organicTabs.defaultOptions = {
        "speed": 300,
        "param": "tab"
    };

$.fn.organicTabs = function(options) {
    return this.each(function() {
        (new $.organicTabs(this, options));
    });
};

})(jQuery);