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:');
2 番目のパラメーターはテスト用です。それ以外の場合は、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>

コンソールは私が望んでいることを正確に記録しますが、実際の href は DOM 内で変更されません。

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 に答える