1
function makeLinks(context, url) {
    var sets = context ? $(context + ' a') : $('a'),
        prot = url || window.location.protocol;
    if(prot.match(/https/)){
        lockup(sets);
    }

    function lockup(elem) {
        elem.each(function(){
            var self = $(this), 
                href = self.attr('href');
            if(href.match(/http[^s]/)){

                // This logs the correct output
                console.log(href.replace('http','https'));

                // This fails
                href.replace('http','https');
            }
        });
    }
}

该函数的目的是检查窗口对象的当前协议。
如果是“https:”,那么我希望具有“http”href 的锚点是“https”。

函数调用如下: makeLinks('#wrapper', 'https:');
第二个参数仅用于测试,否则将使用 window.location.protocol

目前,当我在如下标记上调用此函数时:

<a href="http://cross-origin-denial.com"></a>
<a href="http://pleasesecureme.com"></a>
<a href="https://imcool.com"></a>

<div id="wrapper">
    <a href="http://cross-origin-denial.com"></a>
    <a href="http://imscrewed.com"></a>
    <a href="http://yougotmetoo.com"></a>
    <a href="https://imcool.com"></a>
</div>

控制台准确地记录了我想要发生的事情,但是,DOM 内部的实际 href 保持不变。

我已经在 Chrome 和 Firefox 中对此进行了测试,结果相同
我很确定我的逻辑在某处(或任何地方)是错误

4

2 回答 2

1

您没有对.replace().

您需要设置新值。

  self.attr('href', href.replace('http','https'));

或者更好的方法是这样的:

function lockup(elem) {
    elem.attr('href', function(i, href) {
        return href.match(/http[^s]/) ? href.replace('http','https') : href;
    });
}
于 2012-11-04T20:38:25.843 回答
0

这不应该像下面这样吗 if(href.match(/http[^s]/)){

            // This logs the correct output
            console.log(href.replace('http','https'));

            // This fails
            href.replace('http','https');
        }
    });

改成:

    if(href.indexOf('https') == -1) {
       console.log(href.replace('http','https'));

       href.replace('http', 'https');

    }
于 2012-11-04T20:51:27.350 回答