Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #21 (permalink)  
Старый 07.03.2019, 13:34
Аватар для Блондинка
Профессор
Отправить личное сообщение для Блондинка Посмотреть профиль Найти все сообщения от Блондинка
 
Регистрация: 24.02.2019
Сообщений: 806

Спасибо
Ответить с цитированием
  #22 (permalink)  
Старый 07.03.2019, 13:40
Профессор
Отправить личное сообщение для Nexus Посмотреть профиль Найти все сообщения от Nexus
 
Регистрация: 04.12.2012
Сообщений: 3,802

Блондинка,
Сообщение от Блондинка
http://<removed>/menu/css/css3/transform.html
И что не так?
Конечная страница имеет 4-й уровень вложенности, поэтому класс ссылкам с href="/menu/css/css3/transform.html" присвоен xyz4, ссылок
/menu/css/css3.html
/menu/css.html
/menu.html
у вас в коде нет, поэтому и классы xyz[1-3] проставлять нечему.

Можете откорректировать наименования классов изменив локальную функцию "getClassName" в коде.
Ответить с цитированием
  #23 (permalink)  
Старый 07.03.2019, 14:01
Профессор
Отправить личное сообщение для Nexus Посмотреть профиль Найти все сообщения от Nexus
 
Регистрация: 04.12.2012
Сообщений: 3,802

https://jsfiddle.net/k3xz05sf/1/

<style>
body { font: 14px normal Times, serif; }
div { border: 1px solid #ccc; padding: 5px; margin: 5px; }
a { text-decoration: none; color: #3c3vff; }
.xyz1 { color: #0F0; }
.xyz2 { color: #FF0; }
.xyz3 { color: #F00; }
</style>
<div class="menu" id="menu1">
<a href="/html.html">HTML</a> 
<a href="/css.html">CSS</a> 
<a href="/js.html">JS</a> 
</div>
<div class="menu" id="menu2">
<a href="/css/css3.html">CSS3</a><br/>
<div>
<a href="/menu/css/css3/transform.html">transform</a><br/>
<a href="/menu/css/css3/transform-origin.html">transform-origin</a><br/>
<a href="/menu/css/css3/transform-style.html">transform-style</a><br/>
</div>
</div>
<script>
(()=>{
	//const uriWithoutParams=location.pathname.split(/[#|?]+/i).shift();
	const uriWithoutParams='/menu/css/css3/transform.html'.split(/[#|?]+/i).shift();
	const extension=uriWithoutParams.split('.').pop();
	let uriParts=uriWithoutParams.replace('.'+extension,'').split('/').filter(part=>part.length);
	const getClassName=index=>'xyz'+index;
	const maxPostfix=3;
	
	uriParts.forEach((uri,index)=>{
		uri=`/${uriParts.slice(0,++index).join('/')}.${extension}`;
		index=maxPostfix-(uriParts.length-index);
		if(index<=0)
			return;
		
		const className=getClassName(index);
		
		document.querySelectorAll(`a[href="${uri}"]`).forEach(node=>{
			node.classList.add(className);
			if(index!==maxPostfix)
				return;
			
			node.textContent='someText';
		});
	});
})();
</script>
Ответить с цитированием
  #24 (permalink)  
Старый 07.03.2019, 14:14
Аватар для Блондинка
Профессор
Отправить личное сообщение для Блондинка Посмотреть профиль Найти все сообщения от Блондинка
 
Регистрация: 24.02.2019
Сообщений: 806

Добавила классы .xyz4 .xyz5 .xyz6 .xyz7 добавила ссылки
Ответить с цитированием
  #25 (permalink)  
Старый 07.03.2019, 15:22
Аватар для Блондинка
Профессор
Отправить личное сообщение для Блондинка Посмотреть профиль Найти все сообщения от Блондинка
 
Регистрация: 24.02.2019
Сообщений: 806

одного не могу понять, почему я ничего не вижу нажав на кнопку посмотреть в этом сообщении, вернее ссылки как были синие...
Сообщение от Nexus Посмотреть сообщение
https://jsfiddle.net/k3xz05sf/1/

<style>
body { font: 14px normal Times, serif; }
div { border: 1px solid #ccc; padding: 5px; margin: 5px; }
a { text-decoration: none; color: #3c3vff; }
.xyz1 { color: #0F0; }
.xyz2 { color: #FF0; }
.xyz3 { color: #F00; }
</style>
<div class="menu" id="menu1">
<a href="/html.html">HTML</a> 
<a href="/css.html">CSS</a> 
<a href="/js.html">JS</a> 
</div>
<div class="menu" id="menu2">
<a href="/css/css3.html">CSS3</a><br/>
<div>
<a href="/menu/css/css3/transform.html">transform</a><br/>
<a href="/menu/css/css3/transform-origin.html">transform-origin</a><br/>
<a href="/menu/css/css3/transform-style.html">transform-style</a><br/>
</div>
</div>
<script>
(()=>{
	//const uriWithoutParams=location.pathname.split(/[#|?]+/i).shift();
	const uriWithoutParams='/menu/css/css3/transform.html'.split(/[#|?]+/i).shift();
	const extension=uriWithoutParams.split('.').pop();
	let uriParts=uriWithoutParams.replace('.'+extension,'').split('/').filter(part=>part.length);
	const getClassName=index=>'xyz'+index;
	const maxPostfix=3;
	
	uriParts.forEach((uri,index)=>{
		uri=`/${uriParts.slice(0,++index).join('/')}.${extension}`;
		index=maxPostfix-(uriParts.length-index);
		if(index<=0)
			return;
		
		const className=getClassName(index);
		
		document.querySelectorAll(`a[href="${uri}"]`).forEach(node=>{
			node.classList.add(className);
			if(index!==maxPostfix)
				return;
			
			node.textContent='someText';
		});
	});
})();
</script>
Ответить с цитированием
  #26 (permalink)  
Старый 07.03.2019, 16:19
Профессор
Отправить личное сообщение для Nexus Посмотреть профиль Найти все сообщения от Nexus
 
Регистрация: 04.12.2012
Сообщений: 3,802

Блондинка,
Сообщение от Блондинка
одного не могу понять, почему я ничего не вижу нажав на кнопку посмотреть в этом сообщении, вернее ссылки как были синие
Ссылка "transform" должна стать красной и сменить текст на "someText".
Ссылки "CCS3" и "CSS" остались синими, поскольку они не имеют отношения к текущему пути, т.к. у них в адресе нет директории "menu".
Ответить с цитированием
  #27 (permalink)  
Старый 08.03.2019, 01:27
Аватар для Блондинка
Профессор
Отправить личное сообщение для Блондинка Посмотреть профиль Найти все сообщения от Блондинка
 
Регистрация: 24.02.2019
Сообщений: 806

Во блин, с каждым разом все больше загадок, почему то ссылка "transform" осталась синей? что такое "someText" и зачем оно нужно? вопрос в названии я написала "и одну ссылку заменить на текст?" а не "изменить текст ссылки"
Ответить с цитированием
  #28 (permalink)  
Старый 08.03.2019, 02:07
Аватар для Блондинка
Профессор
Отправить личное сообщение для Блондинка Посмотреть профиль Найти все сообщения от Блондинка
 
Регистрация: 24.02.2019
Сообщений: 806

вот почти работающий скрипт
(function() {
	for(var index = 0, length = document.links.length, link; index < length; index++) {
		link = document.links[index];

		if(link.href === location.href) {
			var p = document.createElement("span");
			p.className = "xyz1";
			p.innerHTML = link.innerHTML;
			link.parentNode.replaceChild(p, link);
		}
	}
})();
на он работает только если прописать адрес без слеша, а если прописать адрес со слешем /transform.html или так /css/css3/transform.html то не работает, и не меняет цвет у других ссылок имеющие отношения к текущему пути, и для наилучшего варианта надо в скрипте указать количество директорий перечислив необходимые "xyz1", "xyz2", "xyz3", "xyz4", "xyz5", "xyz6", xyz7", xyz8" и дальше чтобы можно было в скрипте изменить названия классов потом в стиле прописать эти классы чтобы было интуитивно понятно чему соответствует каждый класс, и выбросить и скрипт и стиль в отдельные файлы
Ответить с цитированием
  #29 (permalink)  
Старый 08.03.2019, 08:05
Профессор
Отправить личное сообщение для Nexus Посмотреть профиль Найти все сообщения от Nexus
 
Регистрация: 04.12.2012
Сообщений: 3,802

Сообщение от Блондинка
почему то ссылка "transform" осталась синей
Консоль не смотрели?
Сообщение от Блондинка
я написала "и одну ссылку заменить на текст?" а не "изменить текст ссылки"
Не так понял

Попробуйте так:
(function() {
        const uriWithoutParams=location.pathname.split(/[#|?]+/i).shift();
        //var uriWithoutParams = '/menu/css/css3/transform.html'.split(/[#|?]+/i).shift();
        var extension = uriWithoutParams.split('.').pop();
        var uriParts = uriWithoutParams.replace('.' + extension, '').split('/').filter(function(part) {
            return part.length;
        });
        var getClassName = function(index) {
            return 'xyz' + index;
        };
        var maxPostfix = 3;

        uriParts.forEach(function(uri, index) {
                uri = '/' + uriParts.slice(0, ++index).join('/') + '.' + extension;
                index = maxPostfix - (uriParts.length - index);
                if (index <= 0)
                    return;

                var className = getClassName(index);

                [].forEach.call(document.querySelectorAll('a[href="' + uri + '"]'), function(node) {
                    node.classList.add(className);
                    if (index !== maxPostfix)
                        return;

                    var textNode = document.createElement('span');
                    textNode.textContent = 'someText';
                    textNode.className = className;
                    node.parentNode.insertBefore(textNode, node);

                    node.parentNode.removeChild(node);
                }));
        });
})();
Ответить с цитированием
  #30 (permalink)  
Старый 08.03.2019, 09:19
Аватар для Блондинка
Профессор
Отправить личное сообщение для Блондинка Посмотреть профиль Найти все сообщения от Блондинка
 
Регистрация: 24.02.2019
Сообщений: 806

11 строчка var maxPostfix = 3; это степень вложенности? и надо обернуть в конструкцию DOMContentLoaded?

Последний раз редактировалось Блондинка, 08.03.2019 в 09:24.
Ответить с цитированием
Ответ



Опции темы Искать в теме
Искать в теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Функция для перевода размера из байтов в понятный для человека формат Антон Крамолов Ваши сайты и скрипты 4 05.04.2013 16:42
Изменить цвет при клике AndreyS jQuery 3 07.10.2012 16:27
Вопрос по относительному позиционированию DIV XPOMOB (X)HTML/CSS 11 15.07.2009 17:02
Можно ли одновременно изменить фон и текст в поле? Bad Request Events/DOM/Window 12 25.09.2008 23:10