Javascript 为什么DOM保持不变,即使控制台在尝试更改链接属性时输出正确的结果?

Javascript 为什么DOM保持不变,即使控制台在尝试更改链接属性时输出正确的结果?,javascript,jquery,https,Javascript,Jquery,Https,该函数的目的是检查窗口对象的当前协议。 如果是“https:”,那么我希望href为“http”的锚定为“https” 函数的调用方式如下:makeLinks(“#包装器”,“https:”) 第二个参数仅用于测试,否则将使用window.location.protocol 当前,当我对如下所示的标记调用此函数时: function makeLinks(context, url) { var sets = context ? $(context + ' a') : $('a'),

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

函数的调用方式如下:makeLinks(“#包装器”,“https:”)
第二个参数仅用于测试,否则将使用window.location.protocol

当前,当我对如下所示的标记调用此函数时:

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');
            }
        });
    }
}
  self.attr('href', href.replace('http','https'));

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

我已经在Chrome和Firefox上测试过了,结果相同
我很确定我的逻辑在某个地方(或任何地方)是错误的

如果有人能帮我理解原因,我将非常感激:)

您没有对
.replace()
的结果做任何事情

您需要设置新值

<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>

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

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');
            }
        });
    }
}
  self.attr('href', href.replace('http','https'));

您没有对
.replace()
的结果执行任何操作

您需要设置新值

<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>

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

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');
            }
        });
    }
}
  self.attr('href', href.replace('http','https'));

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

改为:

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

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

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

改为:

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

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

谢谢!现在我知道了如何使用.attr()回调函数,这绝对是更好的方法。谢谢!现在我知道了如何使用.attr()回调函数回调函数,这绝对是更好的方法。你能帮我理解使用regex的好处吗?我的想法是,我需要确保http在那里,但后面没有“s”。但我想所有的HREF都是一个或另一个…这有关系吗?regex版本很好,但在速度上有缺点。。。这样想吧……在这个版本中,不管你对所有链接进行评估,它们是https还是http。在可接受的情况下,使用正则表达式必须每次都处理每个链接。但在某些情况下很好,不是所有情况下都很好。模式和字符串匹配需要更长的时间。如果可以,请始终执行一个或另一个我们的条件匹配更容易,开销更小。另外,看看它……更容易理解。:)事实上,我想说正则表达式更容易理解,因为对我来说,记住一个模式比记住indexOf的返回值要容易得多(尽管我非常了解它).但我没有考虑性能成本,这在很多链接上可能会很高,所以这是我切换的一个足够好的理由。你能帮助我理解使用正则表达式的好处吗?我的想法是,我需要确保http存在,但后面不跟“s”。但我想所有的HREF都是一个或多个其他…那又有什么关系呢?regex版本很好,但是,在速度上有缺点…这样想吧…在这个版本中,您可以不考虑所有链接,不管它们是https还是http。在可接受的情况下,使用正则表达式必须每次都处理每个链接。虽然在某些情况下很好,但不是全部。模式d字符串匹配需要更长的时间。如果您的条件匹配,则始终执行一个或另一个比较容易,开销也较小。另外,请看它…更容易理解。:)事实上,我想说正则表达式更容易理解,因为对我来说,记住模式比记住返回值应该是什么更容易或者indexOf(尽管我很清楚),但我没有考虑性能成本,这在很多链接上可能会很高,所以这是我切换的一个足够好的理由。