0

我想改变每个实例

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 到 bar):) 抱歉混淆

4

7 回答 7

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选择器[ docs]是原生 CSS3 选择器,因此选择这些元素应该很快。当然,您也可以对http[s]部件使用正则表达式,例如 ,.filter但这可能会更慢(也取决于您拥有的链接数量)。

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

// 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可以在 URL 中的任何位置,则可以获取包含this_page=foo和基本 URL 的所有链接。这仅在没有其他以 开头的页面值时才有效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');
  });
于 2012-06-22T20:43:35.657 回答
1

一般语法类似于:

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

其中的计算newValue将取决于您希望如何转换 URL,例如:

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

我使用.prop()了而不是.attr()因为您似乎想要访问完全限定的 URL。使用属性而不是属性会给你 - 属性并不总是包含 URL 方案。

于 2012-06-22T20:43:25.553 回答
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 的结合,我非常感谢他们俩。

于 2012-06-22T23:50:49.207 回答
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 小提琴演示

在上面我一直在假设两个替代品不一定相互依赖的假设下工作,这可能是错误的。如果是,那么它变得更简单:

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 小提琴演示

于 2012-06-22T20:51:07.580 回答
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');
    }
});​
于 2012-06-22T20:41:56.697 回答
0

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

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

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

问候,理查德

于 2012-06-22T20:41:57.650 回答
0

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

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

})​;​

小提琴:http : //jsfiddle.net/bkNLD/

于 2012-06-22T20:42:07.273 回答