jquery或js:将站点范围内的链接替换为另一个AND更改为https

时间:2012-06-22 20:33:49

标签: javascript jquery

我想更改

的每个实例
http[s]://www.mydomain.com/test/index.php?this_page=foo

https://www.mydomain.com/test/index.php?this_page=bar

我认为它必须能够用attr.replace完成,但我无法弄清楚符号。我怎么能用jQuery或JavaScript做到这一点?

编辑:似乎每个人到目前为止要么缺少第一部分(http或https更改为https)或第二部分(foo to bar):)抱歉混淆

7 个答案:

答案 0 :(得分:3)

你可以这样做:

$('a[href$="://www.mydomain.com/test/index.php?this_page=foo"]')
    .attr('href', 'https://www.mydomain.com/test/index.php?this_page=bar');

attribute-ends-with selector [docs]是本机CSS3选择器,因此选择这些元素应该非常快。当然,您也可以使用http[s]部分的正则表达式,例如.filter,但这可能会更慢(也取决于您拥有的链接数量)。

如果网址包含其他参数,这些参数也应该是新网址的一部分,则必须单独处理每个链接:

// Using the attribute-contains selector now. This still assumes that 
// `this_page=foo` is the first parameter in the URL
var pattern = /^https?:\/\/www.mydomain.com/test/index.php?this_page=foo(&|$)/;
$('a[href*="://www.mydomain.com/test/index.php?this_page=foo"]')
  .attr('href', function(i, val) {
      return val.replace(pattern, 'https://www.mydomain.com/test/index.php?this_page=bar$1');
  });

如果this_page可以位于网址中的任何位置,则可以获取包含this_page=foo的所有链接和基本网址。仅当没有以foo开头的其他页面值时才有效:

var pattern_page = /([?&])this_page=foo(&|$)/;

$('a[href*="://www.mydomain.com/test/index.php?"][href*="this_page=foo"]')
  .attr('href', function(i, val) {
      return val.replace('http:', 'https:')
                .replace(pattern_page, '$1this_page=bar$2');
  });

答案 1 :(得分:1)

一般语法如下:

$('a').prop('href', function(index, value) {
    return newValue;
});

newValue的计算将取决于您想要如何转换网址,例如:

$('a').prop('href', function(index, value) {
    if (value.match(/=foo\??/) {
        value = value.replace(/=foo\??/, '=bar?').replace(/^http:/, 'https:');
    }
    return value;
});       

我使用.prop()而不是.attr(),因为您似乎想要访问完全限定的网址。使用属性而不是属性将为您提供 - 该属性不会始终包含URL方案。

答案 2 :(得分:0)

替换所有实例!!

$("a").each(function() {
    if ($(this).attr("href") == 'http[s]://www.mydomain.com/test/index.php?this_page=foo') {
        $(this).attr('href', 'https://www.mydomain.com/test/index.php?this_page=foo');
    }
});​

答案 3 :(得分:0)

假设这包含在链接的href属性中,请尝试以下操作:

$("a").each(function() {
    if($(this).attr("href").indexOf("http:") != -1) {
        $(this).attr("href", $(this).attr("href").replace("http", "https"));
    }
});

可能有更有效的方法,但这应该可以解决问题。

此致 理查德

答案 4 :(得分:0)

这将在整个页面中用https替换锚点中的所有http引用。

​$.each($('a'), function(i,v){
  var oldULR =  $(v).attr('href');
  var newURL = oldULR.replace('http', 'https');
  $(this).attr('href', newURL);

})​;​

FIDDLE: http://jsfiddle.net/bkNLD/

答案 5 :(得分:0)

在纯JavaScript中,您可以使用:

var links = document.links;

for (var i = 0, len = links.length; i < len; i++) {
    href = links[i].href;
    if (href.indexOf('https') == -1) {
        links[i].href = href.replace('http', 'https');
        href = links[i].href;
    }
    if (href.split('=')[1] == 'foo'){
        links[i].href = href.replace('foo','bar');
    }
}​

JS Fiddle demo

在上文中,我曾经假设两个替代品不一定是相互依赖的,可能是错误的。如果是,那就变得更简单了:

var links = document.links;

for (var i = 0, len = links.length; i < len; i++) {
    href = links[i].href;
    if (href.indexOf('https') == -1 && href.split('=')[1] == 'foo') {
        links[i].href = href.replace('http', 'https');
        links[i].href = href.replace('foo','bar');
    }
}​

JS Fiddle demo

答案 6 :(得分:0)

对于其他任何人发现这个并且和我一样多的菜鸟......这是我最终使用的解决方案。

$(document).ready(function(){ 
  $('a[href*="this_page=foo"]').prop('href', function(index, value) {
  return value.replace(/=foo/, '=bar').replace(/^http:/, 'https:');
  });
});

它是Felix Kling和Alnitak的组合,我非常感谢他们。