Строка запроса для замены ссылок на странице


Если текущий URL-адрес страницы с аргументом 'myid1' или 'myid2' в querystring, за каждую ссылку на мой веб-страницы с помощью класса 'переписать', я хочу, чтобы в href ссылки в строку запроса, чтобы заменить текущую страницу URL-адрес строки запроса. Я использую код, приведенный ниже. Поскольку я новичок в JavaScript, я не уверен, если его оптимизировать. Я хочу, чтобы это как можно быстрее выполнить.

<script type='text/javascript' src='https://ajax.googleapis.com/ajax/libs/jquery/1.6.4/jquery.min.js'></script>

<script type="text/javascript">
$(function() {
    var requestid = gup('myid1');
    if (requestid) {
        $("a.rewrite").each(function() {
            var base = this.href;
            var pos = base.indexOf("?");
            if (pos != -1) {
                base = base.substr(0, pos);
            }
            this.href = base + "?myid1=" + requestid;
        })
    }
    var requestid2 = gup('myid2');
    if (requestid2) {
        $("a.rewrite").each(function() {
            var base = this.href;
            var pos = base.indexOf("?");
            if (pos != -1) {
                base = base.substr(0, pos);
            }
            this.href = base + "?myid2=" + requestid2;
        })
    }
})

function gup( name )
{
  name = name.replace(/[\[]/,"\\\[").replace(/[\]]/,"\\\]");
  var regexS = "[\\?&]"+name+"=([^&#]*)";
  var regex = new RegExp( regexS );
  var results = regex.exec( window.location.href );
  if( results == null )
    return "";
  else
    return results[1];
}
</script>

<a href="http://www.website.com/?someid=1234" class="rewrite">Hyperlink</a>


Комментарии
2 ответа

Здесь не очень много вы можете сделать о производительности.

Вы можете снять повторяющегося кода с помощью цикла:

$(function() {
$.each(['myid1', 'myid2'], function(index, id){
var requestid = gup(id);
if (requestid != "") {
$("a.rewrite").each(function() {
var base = this.href;
var pos = base.indexOf("?");
this.href = (pos != -1 ? base.substr(0, pos) : base) + "?" + id + "=" + requestid;
});
}
});
})

В ГУП функцию можно использовать одну смену вместо двух:

function gup(name) {
var pattern = "[\\?&]" + name.replace(/([\[\]])/g,"\\$1") + "=([^&#]*)";
var results = new RegExp(pattern).exec(window.location.href);
return results == null ? "" : results[1];
}

(Попробуйте использовать более описательные имена, чем "ГУП", хотя...)

2
ответ дан 15 ноября 2011 в 07:11 Источник Поделиться

Код вы предоставить неэффективно двумя способами:


  1. Ненужные петли. Он перебирает себе.переписать якорь каждый раз по одной строке совпадают. Это может быть оптимизировано в одну петлю;

  2. Повторяется расчет по регулярному выражению. regexS выполняется для каждого ГУП функция и она может быть снижена на один расчет.

Решения:


  1. Принести в окне.расположение.Солар, данные в одной переменной, которые могут быть упомянуты позже;

  2. Объединить два (или более) петли и закончить все замены в одной петле.

Вот оптимизированный код:

//First you fetch the query string as key-value pairs in the window.location.href, this equals your gup function.

//This code, fetch the ?key1=value1&key2=value2 pair into an javaScript Object {'key1': 'value1', 'key2':'value2'}
var queryString = {};
var queryStringPattern = new RegExp("([^?=&]+)(=([^&]*))?", "g");
window.location.href.replace(
queryStringPattern,
function($0, $1, $2, $3) { queryString[$1] = $3; }
);

//Second you collect all the anchor with class rewrite and execute the replacement.

$("a.rewrite").each(function () {
this.href.replace(
queryStringPattern,
function ($0, $1, $2, $3) {
return queryString[$1] ? $1 + "=" + queryString[$1] : $1 + '=' + $3;
}
)
});

2
ответ дан 14 ноября 2011 в 01:11 Источник Поделиться