jquery获取/设置href协议

时间:2011-11-04 18:53:32

标签: javascript jquery

我的网站上有一些相对链接需要强制执行https,即使当前页面是http(所以我不能只使用//链接)。

我猜测jQuery在点击时检索href有一个非常简单的方法,然后设置页面位置以匹配在HTTPS协议前面点击的链接?

提前致谢!

3 个答案:

答案 0 :(得分:4)

获得协议:

document.location.protocol;

设置协议:

document.location.protocol = 'https:';

答案 1 :(得分:1)

如果你正在获取页面上的所有链接(不太可能),你可以使用全局选择器:

$('a').click(function(e) {
  location.href = this.attr('href').replace("http://", "https://");
});

如果您需要更具选择性,可以应用自定义类选择器以仅获取某些选择器(此类必须应用于这些链接):

$('.outsideLinkClass').click(function(e) {
  location.href = this.attr('href').replace("http://", "https://");      
});

修改 在重新阅读我的答案后,我突然想到,如果您使用的是基于相对URL的内部链接,则简单的替换选项可能不起作用。在这种情况下,您需要使分配代码更加复杂,以确保您修改完整的URL而不仅仅是信任替换。

编辑2: 更强大的协议替换的想法:

$('.outsideLinkClass').click(function(e) {
  var baseUrl = window.location.pathname.substring(0, window.location.pathname.indexOf('/'));
  location.href = baseUrl.replace("http://", "https://") + this.attr('href');   
});

上面的代码未经测试,因此您可能需要调整分配baseUrl变量的行以使其正确,但这应该可以实现。

答案 2 :(得分:1)

你需要一个url加入帮助函数(下面那个是从我给的another answer修改的)。假设您将class="httpsLink"添加到特殊<a>链接:

,请填写完整的代码
var urlJoin = function(base, relative)
{
    // See if there is already a protocol on this
    if (relative.indexOf("://") != -1)
        return relative;

    // See if this is protocol-relative
    if (relative.indexOf("//") == 0)
    {
        var protocolIndex = base.indexOf("://");
        return base.substr(0, protocolIndex+1) + relative;
    }

    // We need to split the domain and the path for the remaining options
    var protocolIndexEnd = base.indexOf("://") + 3;
    if (base.indexOf("/", protocolIndexEnd) == -1) // append slash if passed only http://bla.com
        base += "/";
    var endDomainIndex = base.indexOf("/", protocolIndexEnd);
    var domain = base.substr(0, endDomainIndex);
    var path = base.substr(endDomainIndex);
    if (path.lastIndexOf("/") != path.length-1) // trim off any ending file name
        path = path.substr(0, path.lastIndexOf("/")+1);

    // See if this is site-absolute
    if (relative.indexOf("/") == 0)
    {
        return domain + relative;
    }

    // See if this is document-relative with ../
    while (relative.indexOf("../") == 0)
    {
        relative = relative.substr(3);
        if (path.length > 1)
        {
            var secondToLastSlashIndex = path.substr(0, path.length-1).lastIndexOf("/");
            path = path.substr(0, secondToLastSlashIndex+1);
        }
    }   
    // Finally, slap on whatever ending is left
    return domain + path + relative;
};

$('a.httpsLink').click(function(e){
    e.preventDefault();
    location.href = urlJoin(location.href, $(this).attr('href')).split('http://').join('https://');
});

这适用于任何类型的链接,无论是绝对的还是相对的。