切换标签时保留URL变量

时间:2012-09-30 06:33:59

标签: jquery url parameters tabs

我正在使用jquery ui标签在http://www.code7dev4.co.uk/data

页面上的标签之间切换

相关的jquery代码是:

jQuery(document).ready(function ($) {
    function activateTab($tab) {
        var $activeTab = $tab.closest('dl').find('a.active'),
            contentLocation = $tab.attr("href") + 'Tab';

        // Strip off the current url that IE adds
        contentLocation = contentLocation.replace(/^.+#/, '#');

        //Make Tab Active
        $activeTab.removeClass('active');
        $tab.addClass('active');

        //Show Tab Content
        $(contentLocation).closest('.tabs-content').children('li').hide();
        $(contentLocation).css('display', 'block');
    }

    $('dl.tabs dd a').live('click', function (event) {
        activateTab($(this));
    });

    if (window.location.hash) {
        activateTab($('a[href="' + window.location.hash + '"]'));
        $.foundation.customForms.appendCustomMarkup();
    }
});

现在,客户端需要右侧的表单为每个数据搜索创建唯一的URL,并且这些URL在url中作为参数(例如http://www.code7dev4.co.uk/data?form_send=send&country=Uganda&sector=health&strail=plac&units=DollarConstant&year=2009)。

切换标签丢失了网址变量,我留下了/data#table

如何更改代码以便维护这些url参数?

1 个答案:

答案 0 :(得分:0)

您正在使用以下内容设置基本网址:

<base href="http://www.code7dev4.co.uk/data">

这会在加载http://www.code7dev4.co.uk/data#id时抛弃片段标识符,而不是仅仅附加到当前URL(包括查询字符串)。这意味着正在删除查询字符串,更重要的是重新加载页面(这违背了非重新加载选项卡切换的整个目的)。

删除基本标记可以解决问题,但我不确定其他地方会产生什么影响。

<强>更新

以下是我能找到的解决你正在处理的问题的唯一解决方案。这是一个练习,因为我建议不要使用这种技术 - 它不够优雅,除了Chrome v23之外还没有经过测试。实际上,我们通过在锚上base事件期间重写href属性来停用click元素(这将对应于您网页上的标签)。然后,我们在href事件后20毫秒重置原始mouseup。我们必须建立延迟,因为mouseup事件在点击事件之前触发

var anchor = document.querySelector("a"),
    baseElement = document.querySelector("base"),
    baseHref = baseElement.getAttribute("href");

    anchor.addEventListener("click", function (event) {
        baseElement.setAttribute("href", "");
    }, true);

    anchor.addEventListener("mouseup", function (event) {
        setTimeout(function () {
            document.querySelector("base").setAttribute("href", baseHref);
        }, 20);
    }, true);

最好的解决方案是不使用base标记,但如果您无法控制HTML输出,那么这可能只是节省了一天的时间。我真的很想看看是否有其他人想出更好的(即更优雅的)解决方案。