2014-11-08 1 views
1

Мне нравится вставлять строку с JQuery только в случае «некоторого» относительного довольно url.JQUERY insert string in relative pretty url

строку, которая должна быть вставлена ​​содержит значение '/ 1' или '/ 2' или '/ 3'

Так URL, как:

<a href="/whatever"> becomes 
<a href="/1/whatever"> or <a href="/2/whatever"> etc. 

Но гиперссылка как

<a href="/1/whatever"> or 
<a href="/2/whatever"> must keep unchanged 

Все приведенные ниже примеры должны быть неизменными.

/whatever/whatever 
/whatever/whatever/whatever 

<img src="/img.png"> 
<img src="/whatever/img.png"> 
<img src="/whatever/whatever/img.png"> 
<img src="http://whatever.com/img.png"> 
<img src="http://whatever.com/whatever/img.png"> 

<a href="http://whatever.com></a> 
<a href="http://whatever.com/whatever.whatever></a> 
<a href="http://whatever.com/whatever/whatever.whatever></a> 
+0

Немного больше информации может помочь. Это только ссылки, которые вы хотите переписать? Вы перечисляете некоторые пути к изображениям, которые вы не хотите переписывать, но есть ли случаи, когда путь изображения нужно будет переписать? –

+0

pardon me: никакие пути изображения вообще не должны быть перезаписаны, они были только там, чтобы быть уверенным, что решение с регулярным выражением не влияет на другие URL-адреса, кроме относительного симпатичного URL-адреса с документом в корне, например/any btw: переменная который должен быть вставлен, основывается на переменной cookie – luvTweb

+0

Вы хотите, чтобы это произошло при загрузке страницы или на каком-либо событии? – Robin

ответ

1

Привет попробуйте следующий код:

$(document).ready(function(){ 
     $ ("a").each(function(){ 
     var url = $(this).attr("href"), 
     count = (url.match(/\//g) || []).length; 
     if(count == 1) 
     { 
      var cookieValue; //set your cookie value in this variable 
      $(this).attr("href","/"+cookieValue + $(this).attr("href")); 
     } 
     }); 

     $ ("img").each(function(){ 
     var url = $(this).attr("src"), 
      count = (url.match(/\//g) || []).length; 
     if(count == 1) 
     { 
      var cookieValue; //set your cookie value in this variable 
      $(this).attr("src","/" + cookieValue + $(this).attr("src")); 
     } 
    }); 
    }); 
+0

как вы получаете/1 или/2 или/3 значение в cookieValue - это ваша головная боль, но я чувствую, что код работает! – Robin

+0

На самом деле файл cookie содержит 1, 2 или 3 Я добавляю код '/' в код – luvTweb

+0

проверить мой ответ, я его отредактировал – Robin

1

Это на самом деле не лучшее решение, так как он должен сканировать каждый элемент на странице ... Однако просто заменить * в $("*") выбрать, какие элементы цели (например a, img).

$("*").each(function() { // selects every element 
    var el = this; 
    $.each(this.attributes, function() { // scans every attribute of the current element 
    if(this.specified) { // if this attribute has a proper value 
     if(this.value.match(/\//g).length == 1 && this.value.indexOf("/") == 0) { 
      // if the count of/chars is 1 and its index is 0 (first char) 
      var repl = "/1"; // get your value from the cookie here 
      this.value = repl + this.value; 
     } 
    } 
    }); 
}); 

заменяет только значения, которые начинаются с / и имеют только один / (первый).

+0

I «Я довольно новичок в JQuery, поэтому извините меня за мой вопрос, я понимаю, что мне нужно предоставить весь URL-адрес, который должен быть переписан классом, например ? Разве это за этим стоит идея: добавив класс, у вас нет проблем, URL-адрес которого будет или не будет перезаписан? – luvTweb

+0

@luvTweb Не уверен, что я понял, чего вы хотите. Вы хотите переписать каждый URL-адрес на странице с помощью '/ whatever' как атрибута' href' или только вы уже выбрали? Если вам нужно переписать каждый URL-адрес, просто выполните это: 'var element = $ (" a ");' – Chris54721

+0

, что мне нравится, - это то, что каждый симпатичный URL-адрес в корне, как/whatever/somethingelse/thistoo, должен быть перезаписан на основе на существующую переменную (и это может иметь значение/1/2 или/3 и фактически является значением cookie), поэтому в конце (в случае cookie есть/3) URL-адреса станут (после загрузки страница)/3/whatever/3/somethingelse и/3/thistoo НО этот url должен быть неизменным/1/something или/2/nothinghappenshere/3/nochangeheretoo – luvTweb

0

Что-то, как это должно работать,

$('a[href]').each(function (index, element) { 
    var href = $(element).attr('href') || ''; 
    if (href.match(/^\//) && !href.match(/^\/\d+\//)) { 
    // do whatever you do to decide what number to 
    // prepend with. I'm just going to use 1 all the time 
    $(element).attr('href', '/1' + href); 
    } 
}); 

Fiddle

Это предполагает, что все ваши относительные ссылки начинаются с /, вам нужно будет немного изменить регулярные выражения, если это не так.

href.match(/^\//) убеждается HREF начинается с / !href.match(/^\/\d+\//) убеждается, что происходит после / не полностью числовое значение с последующим /.

Я использовал селектор a[href], поэтому он захватывает только ссылки с атрибутом href. Сегодня это не так часто, но можно иметь тег a с name и не href.

Таким образом, вы можете не захотеть использовать такую ​​перезапись на стороне клиента. Если ваши пользователи работают с NoScript или другими подобными продуктами безопасности, это может привести к ложному срабатыванию для атаки XSS. Если возможно, это, вероятно, должно быть сделано на стороне сервера.

+0

UC: спасибо за ваш ответ и советы, запустили настройку cookie (основанный на выборе пользователя с помощью переключателя на странице) с php, но в некоторых проблемах. Мысли о no-script/google bot: в случае, если cookie не установлен, я перенаправляю их в каталог/1 (скрытый для пользователей с помощью .htacces), и googlebot может найти все другие страницы, потому что на всех страницах у меня есть жесткая ссылка на альтернативные страницы в каталогах/2 и/3.Я использую эти три уровня для сотрудничества с тремя уровнями посетителей, начинающих/заинтересованных/экспертов, и для всех страниц доступны три версии. – luvTweb